From ff2e03b5ed5c8a0fc2e4828258505797dfe4941f Mon Sep 17 00:00:00 2001 From: Araozu Date: Fri, 25 Sep 2020 14:41:02 -0500 Subject: [PATCH] Agregada funcionalidad descartar cartas --- src/DatosJuego.kt | 3 +- src/GestorJuegos.kt | 5 +++ src/Juego.kt | 93 ++++++++++++++++++++++++++++++++++++++++++--- src/JuegoWS.kt | 6 +++ src/Mano.kt | 9 +++-- 5 files changed, 105 insertions(+), 11 deletions(-) diff --git a/src/DatosJuego.kt b/src/DatosJuego.kt index 28bd1a6..1aa89d7 100644 --- a/src/DatosJuego.kt +++ b/src/DatosJuego.kt @@ -6,7 +6,8 @@ data class DatosJuego( val manos: HashMap, val cartasRestantes: Int, val ordenJugadores: Array, - val turnoActual: String + val turnoActual: String, + val turnosHastaDora: Int ) { override fun equals(other: Any?): Boolean { diff --git a/src/GestorJuegos.kt b/src/GestorJuegos.kt index f717f9c..c37dbc8 100644 --- a/src/GestorJuegos.kt +++ b/src/GestorJuegos.kt @@ -76,4 +76,9 @@ object GestorJuegos { } } + suspend fun manejarDescarte(idJuego: String, idUsuario: String, carta: Int) { + val juego = juegos[idJuego]!! + juego.manejarDescarte(idUsuario, carta) + } + } diff --git a/src/Juego.kt b/src/Juego.kt index 9d2af3f..d5455a8 100644 --- a/src/Juego.kt +++ b/src/Juego.kt @@ -6,14 +6,15 @@ class Juego(val usuarios: ArrayList>) { private val cartas: Array = GestorJuegos.generarCartas() val conexiones: HashMap = HashMap() - private val ordenJugadores = Array(4) {""} + 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 val doraPublico = Array(5) { 0 } + private val doraOculto = Array(5) { 0 } private var estadoJuego = EstadoJuego.Espera private var posCartaActual = 0 - private val turnoActual = 0 + private var turnoActual = 0 + private var turnosHastaDora = 15 suspend fun iniciarJuego(ws: WebSocketSession) { if (estadoJuego != EstadoJuego.Espera) return @@ -49,6 +50,7 @@ class Juego(val usuarios: ArrayList>) { val mano = if (idJugadorInicial == idUsuario) { val sigCarta = cartas[posCartaActual] posCartaActual++ + turnosHastaDora-- Mano(cartasL, sigCarta = sigCarta) } else { @@ -66,7 +68,7 @@ class Juego(val usuarios: ArrayList>) { } private suspend fun enviarDatos(idUsuario: String, ws: WebSocketSession) { - var doraOcultoS = Array(5) {0} + var doraOcultoS = Array(5) { 0 } val manosS = HashMap() for ((idUsuarioAct, mano) in manos) { @@ -87,7 +89,8 @@ class Juego(val usuarios: ArrayList>) { manosS, 108 - posCartaActual, ordenJugadores, - idJugadorTurnoActual + idJugadorTurnoActual, + turnosHastaDora ) ws.send(Frame.Text("{\"operacion\": \"actualizar_datos\", \"datos\": ${gson.toJson(datosJuego)}}")) } @@ -103,4 +106,82 @@ class Juego(val usuarios: ArrayList>) { if (estadoJuego == EstadoJuego.Espera) usuarios.add(Pair(idUsuario, true)) } + suspend fun manejarDescarte(idUsuario: String, carta: Int) { + if (ordenJugadores[turnoActual] == idUsuario) { + val m = manos[idUsuario]!! + + if (m.sigCarta == carta) { + m.sigCarta = -1 + } else { + val posCarta = m.cartas.indexOf(carta) + if (posCarta != -1) { + m.cartas.removeAt(posCarta) + m.cartas.add(m.sigCarta) + m.sigCarta = -1 + } else { + return + } + } + + m.descartes.add(carta) + + // Extraer, dar sig carta al sig jugador, cambiar turno + turnoActual = (turnoActual + 1) % 4 + 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 + } + } + + // 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() + } + idSigUsuario -> { + manosS[idUsuarioAct] = mano.obtenerManoPrivada() + } + } + } + + val datosJuego = DatosJuego( + doraPublico, + doraOcultoS, + manosS, + 108 - posCartaActual, + ordenJugadores, + ordenJugadores[turnoActual], + turnosHastaDora + ) + ws.send(Frame.Text("{\"operacion\": \"actualizar_manos\", \"datos\": ${gson.toJson(datosJuego)}}")) + } + + } + } + } diff --git a/src/JuegoWS.kt b/src/JuegoWS.kt index 116a010..9c6c59d 100644 --- a/src/JuegoWS.kt +++ b/src/JuegoWS.kt @@ -7,6 +7,8 @@ import io.ktor.websocket.* val gson = Gson() +data class DatosDescarte(val idJuego: String, val idUsuario: String, val carta: Int) + fun Routing.juegows() { webSocket("/juego") { @@ -19,6 +21,10 @@ fun Routing.juegows() { val datos = gson.fromJson(sol.datos, ConexionNueva::class.java) GestorJuegos.conectarASala(datos.idJuego, datos.idUsuario, this) } + "descarte" -> { + val datos = gson.fromJson(sol.datos, DatosDescarte::class.java) + GestorJuegos.manejarDescarte(datos.idJuego, datos.idUsuario, datos.carta) + } } } } diff --git a/src/Mano.kt b/src/Mano.kt index a87af7d..c98b61d 100644 --- a/src/Mano.kt +++ b/src/Mano.kt @@ -1,15 +1,16 @@ package dev.araozu data class Mano( - val cartas: List, + val cartas: ArrayList, val allIn: Boolean = false, val cartasReveladas: ArrayList> = ArrayList(), - val descartes: List = ArrayList(), - val sigCarta: Int = -1 + val descartes: ArrayList = ArrayList(), + var sigCarta: Int = -1 ) { fun obtenerManoPrivada(): Mano { - val l = cartas.map { 0 } + val l = ArrayList() + l.addAll(cartas.map { 0 }) return this.copy( cartas = l, sigCarta = if (sigCarta != -1) 0 else sigCarta