diff --git a/src/juego/GestorDora.kt b/src/juego/GestorDora.kt index 9d1dd23..06ce313 100644 --- a/src/juego/GestorDora.kt +++ b/src/juego/GestorDora.kt @@ -4,7 +4,8 @@ class GestorDora(private val cartas: ArrayList) { private val doraCerrado = arrayListOf(cartas[0]) private val doraAbierto = arrayListOf() - var turnosRestantesDoraCerrado = 32 // 32 16 8 4 + var turnosSigDora = 32 + var turnosRestantesDoraCerrado = turnosSigDora // 32 16 8 4 private set operator fun component1(): Array { @@ -23,18 +24,20 @@ class GestorDora(private val cartas: ArrayList) { } } - fun actualizarDoraTurno() { + fun actualizarDoraCerrado() { if (doraCerrado.size >= 5) return turnosRestantesDoraCerrado-- if (turnosRestantesDoraCerrado == 0) { doraCerrado.add(cartas[doraCerrado.size]) + turnosSigDora /= 2 + turnosRestantesDoraCerrado = turnosSigDora } if (doraCerrado.size == 5) { turnosRestantesDoraCerrado = -1 } } - fun actualizarDoraQuad() { + fun actualizarDoraAbierto() { if (doraCerrado.size >= 5) return doraAbierto.add(cartas[5 + doraAbierto.size]) } diff --git a/src/juego/Juego.kt b/src/juego/Juego.kt index f74330e..c75733d 100644 --- a/src/juego/Juego.kt +++ b/src/juego/Juego.kt @@ -50,7 +50,7 @@ class Juego(val usuarios: ArrayList>) { val mano = if (idJugadorInicial == idUsuario) { val sigCarta = cartas[posCartaActual] posCartaActual++ - gestorDora!!.actualizarDoraTurno() + gestorDora!!.actualizarDoraCerrado() Mano(cartasL, sigCarta = sigCarta) } else { @@ -92,6 +92,12 @@ class Juego(val usuarios: ArrayList>) { ws.send(Frame.Text("{\"operacion\": \"actualizar_datos\", \"datos\": ${gson.toJson(datosJuego)}}")) } + private suspend fun enviarDatosATodos() { + for ((idUsuario, ws) in conexiones) { + enviarDatos(idUsuario, ws) + } + } + suspend fun agregarConexion(idUsuario: String, conexion: WebSocketSession) { conexiones[idUsuario] = conexion if (estadoJuego == EstadoJuego.Iniciado) { @@ -103,65 +109,13 @@ class Juego(val usuarios: ArrayList>) { if (estadoJuego == EstadoJuego.Espera) usuarios.add(Pair(idUsuario, true)) } - private fun arrContiene(v1: Int, v2: Int, arr: List): Boolean { - var v1E = false - var v2E = false - for (i in arr) { - if (i == v1) v1E = true - if (i == v2) v2E = true - - if (v1E && v2E) return true - } - - return false - } - - private fun verificarTri(carta: Int): HashMap>? { - // La carta es dragon o rey - if (carta > 54) return null - - val idSigJugador = ordenJugadores[(turnoActual + 1) % 4] - val manoJugador = manos[idSigJugador]!! - val cartasJugador = manoJugador.cartas - - val obtValorCarta = { valor: Int -> (valor shl 27) ushr 28 } - val obtTipoCarta = { valor: Int -> (valor shl 23) ushr 28 } - - val valorCarta = obtValorCarta(carta) - val cartasAComparar = { - val filtro = obtTipoCarta(carta) - cartasJugador.filter { obtTipoCarta(it) == filtro } .map(obtValorCarta) - }() - - val oportunidades = HashMap>() - - val oportunidadesJugador = ArrayList() - // Primer caso: Xoo - if (arrContiene(valorCarta + 1, valorCarta + 2, cartasAComparar)) { - oportunidadesJugador.add("seq") - } - - // Segundo caso: oXo - if (arrContiene(valorCarta - 1, valorCarta + 1, cartasAComparar)) { - oportunidadesJugador.add("seq") - } - - // Tercer caso: ooX - if (arrContiene(valorCarta - 1, valorCarta - 2, cartasAComparar)) { - oportunidadesJugador.add("seq") - } - - if (oportunidadesJugador.isNotEmpty()) - oportunidades[idSigJugador] = oportunidadesJugador - - return if (oportunidades.isNotEmpty()) oportunidades else null - } - - private suspend fun enviarOportunidades(oportunidades: HashMap>, cartaDescartada: Int) { - for ((id, ops) in oportunidades) { - val oportunidadesL = OportunidadesJuego(ops, cartaDescartada) - conexiones[id]!!.send(Frame.Text("{\"operacion\": \"oportunidad\", \"datos\": ${gson.toJson(oportunidadesL)}}")) - } + private fun cambiarTurnoSigJugadorConsecutivo() { + // Extraer, dar sig carta al sig jugador, cambiar turno + turnoActual = (turnoActual + 1) % 4 + val idSigUsuario = ordenJugadores[turnoActual] + val sigCarta = cartas[posCartaActual] + posCartaActual++ + manos[idSigUsuario]!!.sigCarta = sigCarta } suspend fun manejarDescarte(idUsuario: String, carta: Int) { @@ -184,53 +138,27 @@ class Juego(val usuarios: ArrayList>) { m.descartes.add(carta) // Verificar seq/tri/quad/win - val oportunidades = verificarTri(carta) - if (oportunidades != null) { - enviarOportunidades(oportunidades, carta) - return - } - - // Extraer, dar sig carta al sig jugador, cambiar turno - turnoActual = (turnoActual + 1) % 4 - val idSigUsuario = ordenJugadores[turnoActual] - val sigCarta = cartas[posCartaActual] - posCartaActual++ - manos[idSigUsuario]!!.sigCarta = sigCarta - - // Actualizar dora - gestorDora!!.actualizarDoraTurno() - - // Enviar datos - for ((idUsuarioEnvio, ws) in conexiones) { - val manosS = HashMap() - - for ((idUsuarioAct, mano) in manos) { - when (idUsuarioAct) { - idUsuarioEnvio -> { - manosS[idUsuarioAct] = mano - } - idUsuario -> { - manosS[idUsuarioAct] = mano.obtenerManoPrivada() - } - idSigUsuario -> { - manosS[idUsuarioAct] = mano.obtenerManoPrivada() - } - } + var hayOportunidades = false + for ((_, mano) in manos) { + val oportunidadSeq = OportunidadSeq.verificar(carta, mano.cartas) + if (oportunidadSeq != null) { + hayOportunidades = true + mano.oportunidades.add(oportunidadSeq) } - - val (doraCerrado, doraAbierto) = gestorDora!! - val datosJuego = DatosJuego( - doraCerrado, - doraAbierto, - manosS, - 108 - posCartaActual, - ordenJugadores, - ordenJugadores[turnoActual], - gestorDora!!.turnosRestantesDoraCerrado - ) - ws.send(Frame.Text("{\"operacion\": \"actualizar_manos\", \"datos\": ${gson.toJson(datosJuego)}}")) } + if (hayOportunidades) { + // Enviar datos + enviarDatosATodos() + } else { + cambiarTurnoSigJugadorConsecutivo() + + // Actualizar dora + gestorDora!!.actualizarDoraCerrado() + + // Enviar datos + enviarDatosATodos() + } } } diff --git a/src/juego/Mano.kt b/src/juego/Mano.kt index 8729668..6503610 100644 --- a/src/juego/Mano.kt +++ b/src/juego/Mano.kt @@ -2,9 +2,10 @@ package dev.araozu.juego data class Mano( val cartas: ArrayList, - val cartasReveladas: ArrayList> = ArrayList(), - val descartes: ArrayList = ArrayList(), - var sigCarta: Int = -1 + val cartasReveladas: ArrayList> = arrayListOf(), + val descartes: ArrayList = arrayListOf(), + var sigCarta: Int = -1, + var oportunidades: ArrayList = arrayListOf() ) { fun obtenerManoPrivada(): Mano { diff --git a/src/juego/Oportunidad.kt b/src/juego/Oportunidad.kt index 8f2e16c..5c0d527 100644 --- a/src/juego/Oportunidad.kt +++ b/src/juego/Oportunidad.kt @@ -3,5 +3,6 @@ package dev.araozu.juego interface Oportunidad { val cartaDescartada: Int + val nombreOportunidad: String } diff --git a/src/juego/OportunidadSeq.kt b/src/juego/OportunidadSeq.kt index f8f7b02..3fc3f96 100644 --- a/src/juego/OportunidadSeq.kt +++ b/src/juego/OportunidadSeq.kt @@ -3,6 +3,8 @@ package dev.araozu.juego data class OportunidadSeq(override val cartaDescartada: Int, val combinaciones: ArrayList>) : Oportunidad { + override val nombreOportunidad: String = "Seq" + companion object { private fun arrlCartasContiene(arrl: ArrayList, v1: Int, v2: Int): Pair? { diff --git a/src/juego/OportunidadTri.kt b/src/juego/OportunidadTri.kt index 4044db5..5b2f130 100644 --- a/src/juego/OportunidadTri.kt +++ b/src/juego/OportunidadTri.kt @@ -1,4 +1,8 @@ package dev.araozu.juego data class OportunidadTri(override val cartaDescartada: Int) : - Oportunidad + Oportunidad { + + override val nombreOportunidad: String = "Tri" + +}