From 8a6c17563aea4f24a0f166ebac82ca6bad424a1c Mon Sep 17 00:00:00 2001 From: Araozu Date: Mon, 5 Oct 2020 18:08:32 -0500 Subject: [PATCH] Refactorizados archivos. Creada clase GestorDora.kt --- src/GestorJuegos.kt | 1 + src/MetodosJuego.kt | 3 +- src/{ => juego}/DatosJuego.kt | 2 +- src/{ => juego}/EstadoJuego.kt | 2 +- src/juego/GestorDora.kt | 42 ++++++++++++++++++++++++++ src/{ => juego}/Juego.kt | 55 ++++++++++++---------------------- src/{ => juego}/Mano.kt | 3 +- src/juego/Oportunidad.kt | 8 +++++ src/juego/OportunidadSeq.kt | 4 +++ src/juego/OportunidadTri.kt | 4 +++ 10 files changed, 82 insertions(+), 42 deletions(-) rename src/{ => juego}/DatosJuego.kt (97%) rename src/{ => juego}/EstadoJuego.kt (73%) create mode 100644 src/juego/GestorDora.kt rename src/{ => juego}/Juego.kt (84%) rename src/{ => juego}/Mano.kt (89%) create mode 100644 src/juego/Oportunidad.kt create mode 100644 src/juego/OportunidadSeq.kt create mode 100644 src/juego/OportunidadTri.kt diff --git a/src/GestorJuegos.kt b/src/GestorJuegos.kt index c37dbc8..80d1325 100644 --- a/src/GestorJuegos.kt +++ b/src/GestorJuegos.kt @@ -1,5 +1,6 @@ package dev.araozu +import dev.araozu.juego.Juego import io.ktor.http.cio.websocket.* import kotlinx.coroutines.isActive diff --git a/src/MetodosJuego.kt b/src/MetodosJuego.kt index 84951a3..762ec7a 100644 --- a/src/MetodosJuego.kt +++ b/src/MetodosJuego.kt @@ -1,5 +1,6 @@ package dev.araozu +import dev.araozu.juego.Juego import io.ktor.application.* import io.ktor.http.* import io.ktor.request.* @@ -12,8 +13,6 @@ data class DataCrearJuego(val idUsuario: String) fun Routing.crearJuego() { post("/partida") { - val dataUsuario = call.receive() - var sigId = GestorJuegos.generarId() while (GestorJuegos.juegos.containsKey(sigId)) { sigId = GestorJuegos.generarId() diff --git a/src/DatosJuego.kt b/src/juego/DatosJuego.kt similarity index 97% rename from src/DatosJuego.kt rename to src/juego/DatosJuego.kt index 1aa89d7..f984f89 100644 --- a/src/DatosJuego.kt +++ b/src/juego/DatosJuego.kt @@ -1,4 +1,4 @@ -package dev.araozu +package dev.araozu.juego data class DatosJuego( val dora: Array, diff --git a/src/EstadoJuego.kt b/src/juego/EstadoJuego.kt similarity index 73% rename from src/EstadoJuego.kt rename to src/juego/EstadoJuego.kt index 7eb52eb..e6014d9 100644 --- a/src/EstadoJuego.kt +++ b/src/juego/EstadoJuego.kt @@ -1,4 +1,4 @@ -package dev.araozu +package dev.araozu.juego enum class EstadoJuego { Espera, diff --git a/src/juego/GestorDora.kt b/src/juego/GestorDora.kt new file mode 100644 index 0000000..9d1dd23 --- /dev/null +++ b/src/juego/GestorDora.kt @@ -0,0 +1,42 @@ +package dev.araozu.juego + +class GestorDora(private val cartas: ArrayList) { + + private val doraCerrado = arrayListOf(cartas[0]) + private val doraAbierto = arrayListOf() + var turnosRestantesDoraCerrado = 32 // 32 16 8 4 + private set + + operator fun component1(): Array { + val numDora = doraCerrado.size + return Array(5) { + if (it < numDora) doraCerrado[it] + else 0 + } + } + + operator fun component2(): Array { + val numDora = doraCerrado.size + return Array(5) { + if (it < numDora) doraAbierto[it] + else 0 + } + } + + fun actualizarDoraTurno() { + if (doraCerrado.size >= 5) return + turnosRestantesDoraCerrado-- + if (turnosRestantesDoraCerrado == 0) { + doraCerrado.add(cartas[doraCerrado.size]) + } + if (doraCerrado.size == 5) { + turnosRestantesDoraCerrado = -1 + } + } + + fun actualizarDoraQuad() { + if (doraCerrado.size >= 5) return + doraAbierto.add(cartas[5 + doraAbierto.size]) + } + +} diff --git a/src/Juego.kt b/src/juego/Juego.kt similarity index 84% rename from src/Juego.kt rename to src/juego/Juego.kt index 85de8ff..f74330e 100644 --- a/src/Juego.kt +++ b/src/juego/Juego.kt @@ -1,5 +1,6 @@ -package dev.araozu +package dev.araozu.juego +import dev.araozu.* import io.ktor.http.cio.websocket.* class Juego(val usuarios: ArrayList>) { @@ -8,13 +9,10 @@ class Juego(val usuarios: ArrayList>) { val conexiones: HashMap = HashMap() private val ordenJugadores = Array(4) { "" } private val manos: HashMap = HashMap() - private val dora: ArrayList = arrayListOf() - private val doraPublico = Array(5) { 0 } - private val doraOculto = Array(5) { 0 } + private var gestorDora: GestorDora? = null private var estadoJuego = EstadoJuego.Espera private var posCartaActual = 0 private var turnoActual = 0 - private var turnosHastaDora = 27 // 27 17 7 3 suspend fun iniciarJuego(ws: WebSocketSession) { if (estadoJuego != EstadoJuego.Espera) return @@ -25,12 +23,14 @@ class Juego(val usuarios: ArrayList>) { } estadoJuego = EstadoJuego.Iniciado + + // Inicializar dora + val dora: ArrayList = arrayListOf() for (i in posCartaActual until (posCartaActual + 10)) { dora.add(cartas[i]) } + gestorDora = GestorDora(dora) posCartaActual += 10 - doraPublico[0] = dora[0] - doraOculto[0] = dora[4] // Asignar orden de jugadores var i = 0 @@ -50,7 +50,7 @@ class Juego(val usuarios: ArrayList>) { val mano = if (idJugadorInicial == idUsuario) { val sigCarta = cartas[posCartaActual] posCartaActual++ - turnosHastaDora-- + gestorDora!!.actualizarDoraTurno() Mano(cartasL, sigCarta = sigCarta) } else { @@ -68,14 +68,10 @@ class Juego(val usuarios: ArrayList>) { } private suspend fun enviarDatos(idUsuario: String, ws: WebSocketSession) { - var doraOcultoS = Array(5) { 0 } val manosS = HashMap() for ((idUsuarioAct, mano) in manos) { if (idUsuarioAct == idUsuario) { - if (mano.allIn) { - doraOcultoS = doraOculto - } manosS[idUsuarioAct] = mano } else { manosS[idUsuarioAct] = mano.obtenerManoPrivada() @@ -83,14 +79,15 @@ class Juego(val usuarios: ArrayList>) { } val idJugadorTurnoActual = ordenJugadores[turnoActual] + val (doraCerrado, doraAbierto) = gestorDora!! val datosJuego = DatosJuego( - doraPublico, - doraOcultoS, + doraCerrado, + doraAbierto, manosS, 108 - posCartaActual, ordenJugadores, idJugadorTurnoActual, - turnosHastaDora + gestorDora!!.turnosRestantesDoraCerrado ) ws.send(Frame.Text("{\"operacion\": \"actualizar_datos\", \"datos\": ${gson.toJson(datosJuego)}}")) } @@ -154,7 +151,8 @@ class Juego(val usuarios: ArrayList>) { oportunidadesJugador.add("seq") } - oportunidades[idSigJugador] = oportunidadesJugador + if (oportunidadesJugador.isNotEmpty()) + oportunidades[idSigJugador] = oportunidadesJugador return if (oportunidades.isNotEmpty()) oportunidades else null } @@ -197,35 +195,19 @@ class Juego(val usuarios: ArrayList>) { val idSigUsuario = ordenJugadores[turnoActual] val sigCarta = cartas[posCartaActual] posCartaActual++ - turnosHastaDora-- manos[idSigUsuario]!!.sigCarta = sigCarta // Actualizar dora - if (turnosHastaDora == 0) { - val sigPosDora = doraPublico.indexOf(0) - // Si aun quedan doras - if (sigPosDora != -1) { - doraPublico[sigPosDora] = dora[sigPosDora] - turnosHastaDora = 15 - } - // Si ya no hay doras - else { - turnosHastaDora = 108 - } - } + gestorDora!!.actualizarDoraTurno() // Enviar datos for ((idUsuarioEnvio, ws) in conexiones) { val manosS = HashMap() - var doraOcultoS = Array(5) { 0 } for ((idUsuarioAct, mano) in manos) { when (idUsuarioAct) { idUsuarioEnvio -> { manosS[idUsuarioAct] = mano - if (mano.allIn) { - doraOcultoS = doraOculto - } } idUsuario -> { manosS[idUsuarioAct] = mano.obtenerManoPrivada() @@ -236,14 +218,15 @@ class Juego(val usuarios: ArrayList>) { } } + val (doraCerrado, doraAbierto) = gestorDora!! val datosJuego = DatosJuego( - doraPublico, - doraOcultoS, + doraCerrado, + doraAbierto, manosS, 108 - posCartaActual, ordenJugadores, ordenJugadores[turnoActual], - turnosHastaDora + gestorDora!!.turnosRestantesDoraCerrado ) ws.send(Frame.Text("{\"operacion\": \"actualizar_manos\", \"datos\": ${gson.toJson(datosJuego)}}")) } diff --git a/src/Mano.kt b/src/juego/Mano.kt similarity index 89% rename from src/Mano.kt rename to src/juego/Mano.kt index c98b61d..8729668 100644 --- a/src/Mano.kt +++ b/src/juego/Mano.kt @@ -1,8 +1,7 @@ -package dev.araozu +package dev.araozu.juego data class Mano( val cartas: ArrayList, - val allIn: Boolean = false, val cartasReveladas: ArrayList> = ArrayList(), val descartes: ArrayList = ArrayList(), var sigCarta: Int = -1 diff --git a/src/juego/Oportunidad.kt b/src/juego/Oportunidad.kt new file mode 100644 index 0000000..6c814c1 --- /dev/null +++ b/src/juego/Oportunidad.kt @@ -0,0 +1,8 @@ +package dev.araozu.juego + +interface Oportunidad { + + val cartaDescartada: Int + val cartasOportunidad: ArrayList + +} diff --git a/src/juego/OportunidadSeq.kt b/src/juego/OportunidadSeq.kt new file mode 100644 index 0000000..2b34ea1 --- /dev/null +++ b/src/juego/OportunidadSeq.kt @@ -0,0 +1,4 @@ +package dev.araozu.juego + +data class OportunidadSeq(override val cartaDescartada: Int, override val cartasOportunidad: ArrayList) : + Oportunidad diff --git a/src/juego/OportunidadTri.kt b/src/juego/OportunidadTri.kt new file mode 100644 index 0000000..3365f22 --- /dev/null +++ b/src/juego/OportunidadTri.kt @@ -0,0 +1,4 @@ +package dev.araozu.juego + +data class OportunidadTri(override val cartaDescartada: Int, override val cartasOportunidad: ArrayList) : + Oportunidad