Agregada funcionalidad descartar cartas

master
Araozu 2020-09-25 14:41:02 -05:00
parent 7494362699
commit ff2e03b5ed
5 changed files with 105 additions and 11 deletions

View File

@ -6,7 +6,8 @@ data class DatosJuego(
val manos: HashMap<String, Mano>, val manos: HashMap<String, Mano>,
val cartasRestantes: Int, val cartasRestantes: Int,
val ordenJugadores: Array<String>, val ordenJugadores: Array<String>,
val turnoActual: String val turnoActual: String,
val turnosHastaDora: Int
) { ) {
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {

View File

@ -76,4 +76,9 @@ object GestorJuegos {
} }
} }
suspend fun manejarDescarte(idJuego: String, idUsuario: String, carta: Int) {
val juego = juegos[idJuego]!!
juego.manejarDescarte(idUsuario, carta)
}
} }

View File

@ -6,14 +6,15 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
private val cartas: Array<Int> = GestorJuegos.generarCartas() private val cartas: Array<Int> = GestorJuegos.generarCartas()
val conexiones: HashMap<String, WebSocketSession> = HashMap() val conexiones: HashMap<String, WebSocketSession> = HashMap()
private val ordenJugadores = Array(4) {""} private val ordenJugadores = Array(4) { "" }
private val manos: HashMap<String, Mano> = HashMap() private val manos: HashMap<String, Mano> = HashMap()
private val dora: ArrayList<Int> = arrayListOf() private val dora: ArrayList<Int> = arrayListOf()
private val doraPublico = Array(5) {0} private val doraPublico = Array(5) { 0 }
private val doraOculto = Array(5) {0} private val doraOculto = Array(5) { 0 }
private var estadoJuego = EstadoJuego.Espera private var estadoJuego = EstadoJuego.Espera
private var posCartaActual = 0 private var posCartaActual = 0
private val turnoActual = 0 private var turnoActual = 0
private var turnosHastaDora = 15
suspend fun iniciarJuego(ws: WebSocketSession) { suspend fun iniciarJuego(ws: WebSocketSession) {
if (estadoJuego != EstadoJuego.Espera) return if (estadoJuego != EstadoJuego.Espera) return
@ -49,6 +50,7 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
val mano = if (idJugadorInicial == idUsuario) { val mano = if (idJugadorInicial == idUsuario) {
val sigCarta = cartas[posCartaActual] val sigCarta = cartas[posCartaActual]
posCartaActual++ posCartaActual++
turnosHastaDora--
Mano(cartasL, sigCarta = sigCarta) Mano(cartasL, sigCarta = sigCarta)
} else { } else {
@ -66,7 +68,7 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
} }
private suspend fun enviarDatos(idUsuario: String, ws: WebSocketSession) { private suspend fun enviarDatos(idUsuario: String, ws: WebSocketSession) {
var doraOcultoS = Array(5) {0} var doraOcultoS = Array(5) { 0 }
val manosS = HashMap<String, Mano>() val manosS = HashMap<String, Mano>()
for ((idUsuarioAct, mano) in manos) { for ((idUsuarioAct, mano) in manos) {
@ -87,7 +89,8 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
manosS, manosS,
108 - posCartaActual, 108 - posCartaActual,
ordenJugadores, ordenJugadores,
idJugadorTurnoActual idJugadorTurnoActual,
turnosHastaDora
) )
ws.send(Frame.Text("{\"operacion\": \"actualizar_datos\", \"datos\": ${gson.toJson(datosJuego)}}")) ws.send(Frame.Text("{\"operacion\": \"actualizar_datos\", \"datos\": ${gson.toJson(datosJuego)}}"))
} }
@ -103,4 +106,82 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
if (estadoJuego == EstadoJuego.Espera) usuarios.add(Pair(idUsuario, true)) 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<String, Mano>()
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)}}"))
}
}
}
} }

View File

@ -7,6 +7,8 @@ import io.ktor.websocket.*
val gson = Gson() val gson = Gson()
data class DatosDescarte(val idJuego: String, val idUsuario: String, val carta: Int)
fun Routing.juegows() { fun Routing.juegows() {
webSocket("/juego") { webSocket("/juego") {
@ -19,6 +21,10 @@ fun Routing.juegows() {
val datos = gson.fromJson(sol.datos, ConexionNueva::class.java) val datos = gson.fromJson(sol.datos, ConexionNueva::class.java)
GestorJuegos.conectarASala(datos.idJuego, datos.idUsuario, this) 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)
}
} }
} }
} }

View File

@ -1,15 +1,16 @@
package dev.araozu package dev.araozu
data class Mano( data class Mano(
val cartas: List<Int>, val cartas: ArrayList<Int>,
val allIn: Boolean = false, val allIn: Boolean = false,
val cartasReveladas: ArrayList<ArrayList<Int>> = ArrayList(), val cartasReveladas: ArrayList<ArrayList<Int>> = ArrayList(),
val descartes: List<Int> = ArrayList(), val descartes: ArrayList<Int> = ArrayList(),
val sigCarta: Int = -1 var sigCarta: Int = -1
) { ) {
fun obtenerManoPrivada(): Mano { fun obtenerManoPrivada(): Mano {
val l = cartas.map { 0 } val l = ArrayList<Int>()
l.addAll(cartas.map { 0 })
return this.copy( return this.copy(
cartas = l, cartas = l,
sigCarta = if (sigCarta != -1) 0 else sigCarta sigCarta = if (sigCarta != -1) 0 else sigCarta