Refactorizados archivos. Creada clase GestorDora.kt

This commit is contained in:
Araozu 2020-10-05 18:08:32 -05:00
parent cb1700ecca
commit 8a6c17563a
10 changed files with 82 additions and 42 deletions

View File

@ -1,5 +1,6 @@
package dev.araozu package dev.araozu
import dev.araozu.juego.Juego
import io.ktor.http.cio.websocket.* import io.ktor.http.cio.websocket.*
import kotlinx.coroutines.isActive import kotlinx.coroutines.isActive

View File

@ -1,5 +1,6 @@
package dev.araozu package dev.araozu
import dev.araozu.juego.Juego
import io.ktor.application.* import io.ktor.application.*
import io.ktor.http.* import io.ktor.http.*
import io.ktor.request.* import io.ktor.request.*
@ -12,8 +13,6 @@ data class DataCrearJuego(val idUsuario: String)
fun Routing.crearJuego() { fun Routing.crearJuego() {
post("/partida") { post("/partida") {
val dataUsuario = call.receive<DataCrearJuego>()
var sigId = GestorJuegos.generarId() var sigId = GestorJuegos.generarId()
while (GestorJuegos.juegos.containsKey(sigId)) { while (GestorJuegos.juegos.containsKey(sigId)) {
sigId = GestorJuegos.generarId() sigId = GestorJuegos.generarId()

View File

@ -1,4 +1,4 @@
package dev.araozu package dev.araozu.juego
data class DatosJuego( data class DatosJuego(
val dora: Array<Int>, val dora: Array<Int>,

View File

@ -1,4 +1,4 @@
package dev.araozu package dev.araozu.juego
enum class EstadoJuego { enum class EstadoJuego {
Espera, Espera,

42
src/juego/GestorDora.kt Normal file
View File

@ -0,0 +1,42 @@
package dev.araozu.juego
class GestorDora(private val cartas: ArrayList<Int>) {
private val doraCerrado = arrayListOf(cartas[0])
private val doraAbierto = arrayListOf<Int>()
var turnosRestantesDoraCerrado = 32 // 32 16 8 4
private set
operator fun component1(): Array<Int> {
val numDora = doraCerrado.size
return Array(5) {
if (it < numDora) doraCerrado[it]
else 0
}
}
operator fun component2(): Array<Int> {
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])
}
}

View File

@ -1,5 +1,6 @@
package dev.araozu package dev.araozu.juego
import dev.araozu.*
import io.ktor.http.cio.websocket.* import io.ktor.http.cio.websocket.*
class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) { class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
@ -8,13 +9,10 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
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 var gestorDora: GestorDora? = null
private val doraPublico = 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 var turnoActual = 0 private var turnoActual = 0
private var turnosHastaDora = 27 // 27 17 7 3
suspend fun iniciarJuego(ws: WebSocketSession) { suspend fun iniciarJuego(ws: WebSocketSession) {
if (estadoJuego != EstadoJuego.Espera) return if (estadoJuego != EstadoJuego.Espera) return
@ -25,12 +23,14 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
} }
estadoJuego = EstadoJuego.Iniciado estadoJuego = EstadoJuego.Iniciado
// Inicializar dora
val dora: ArrayList<Int> = arrayListOf()
for (i in posCartaActual until (posCartaActual + 10)) { for (i in posCartaActual until (posCartaActual + 10)) {
dora.add(cartas[i]) dora.add(cartas[i])
} }
gestorDora = GestorDora(dora)
posCartaActual += 10 posCartaActual += 10
doraPublico[0] = dora[0]
doraOculto[0] = dora[4]
// Asignar orden de jugadores // Asignar orden de jugadores
var i = 0 var i = 0
@ -50,7 +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-- gestorDora!!.actualizarDoraTurno()
Mano(cartasL, sigCarta = sigCarta) Mano(cartasL, sigCarta = sigCarta)
} else { } else {
@ -68,14 +68,10 @@ 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 }
val manosS = HashMap<String, Mano>() val manosS = HashMap<String, Mano>()
for ((idUsuarioAct, mano) in manos) { for ((idUsuarioAct, mano) in manos) {
if (idUsuarioAct == idUsuario) { if (idUsuarioAct == idUsuario) {
if (mano.allIn) {
doraOcultoS = doraOculto
}
manosS[idUsuarioAct] = mano manosS[idUsuarioAct] = mano
} else { } else {
manosS[idUsuarioAct] = mano.obtenerManoPrivada() manosS[idUsuarioAct] = mano.obtenerManoPrivada()
@ -83,14 +79,15 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
} }
val idJugadorTurnoActual = ordenJugadores[turnoActual] val idJugadorTurnoActual = ordenJugadores[turnoActual]
val (doraCerrado, doraAbierto) = gestorDora!!
val datosJuego = DatosJuego( val datosJuego = DatosJuego(
doraPublico, doraCerrado,
doraOcultoS, doraAbierto,
manosS, manosS,
108 - posCartaActual, 108 - posCartaActual,
ordenJugadores, ordenJugadores,
idJugadorTurnoActual, idJugadorTurnoActual,
turnosHastaDora gestorDora!!.turnosRestantesDoraCerrado
) )
ws.send(Frame.Text("{\"operacion\": \"actualizar_datos\", \"datos\": ${gson.toJson(datosJuego)}}")) ws.send(Frame.Text("{\"operacion\": \"actualizar_datos\", \"datos\": ${gson.toJson(datosJuego)}}"))
} }
@ -154,7 +151,8 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
oportunidadesJugador.add("seq") oportunidadesJugador.add("seq")
} }
oportunidades[idSigJugador] = oportunidadesJugador if (oportunidadesJugador.isNotEmpty())
oportunidades[idSigJugador] = oportunidadesJugador
return if (oportunidades.isNotEmpty()) oportunidades else null return if (oportunidades.isNotEmpty()) oportunidades else null
} }
@ -197,35 +195,19 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
val idSigUsuario = ordenJugadores[turnoActual] val idSigUsuario = ordenJugadores[turnoActual]
val sigCarta = cartas[posCartaActual] val sigCarta = cartas[posCartaActual]
posCartaActual++ posCartaActual++
turnosHastaDora--
manos[idSigUsuario]!!.sigCarta = sigCarta manos[idSigUsuario]!!.sigCarta = sigCarta
// Actualizar dora // Actualizar dora
if (turnosHastaDora == 0) { gestorDora!!.actualizarDoraTurno()
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 // Enviar datos
for ((idUsuarioEnvio, ws) in conexiones) { for ((idUsuarioEnvio, ws) in conexiones) {
val manosS = HashMap<String, Mano>() val manosS = HashMap<String, Mano>()
var doraOcultoS = Array(5) { 0 }
for ((idUsuarioAct, mano) in manos) { for ((idUsuarioAct, mano) in manos) {
when (idUsuarioAct) { when (idUsuarioAct) {
idUsuarioEnvio -> { idUsuarioEnvio -> {
manosS[idUsuarioAct] = mano manosS[idUsuarioAct] = mano
if (mano.allIn) {
doraOcultoS = doraOculto
}
} }
idUsuario -> { idUsuario -> {
manosS[idUsuarioAct] = mano.obtenerManoPrivada() manosS[idUsuarioAct] = mano.obtenerManoPrivada()
@ -236,14 +218,15 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
} }
} }
val (doraCerrado, doraAbierto) = gestorDora!!
val datosJuego = DatosJuego( val datosJuego = DatosJuego(
doraPublico, doraCerrado,
doraOcultoS, doraAbierto,
manosS, manosS,
108 - posCartaActual, 108 - posCartaActual,
ordenJugadores, ordenJugadores,
ordenJugadores[turnoActual], ordenJugadores[turnoActual],
turnosHastaDora gestorDora!!.turnosRestantesDoraCerrado
) )
ws.send(Frame.Text("{\"operacion\": \"actualizar_manos\", \"datos\": ${gson.toJson(datosJuego)}}")) ws.send(Frame.Text("{\"operacion\": \"actualizar_manos\", \"datos\": ${gson.toJson(datosJuego)}}"))
} }

View File

@ -1,8 +1,7 @@
package dev.araozu package dev.araozu.juego
data class Mano( data class Mano(
val cartas: ArrayList<Int>, val cartas: ArrayList<Int>,
val allIn: Boolean = false,
val cartasReveladas: ArrayList<ArrayList<Int>> = ArrayList(), val cartasReveladas: ArrayList<ArrayList<Int>> = ArrayList(),
val descartes: ArrayList<Int> = ArrayList(), val descartes: ArrayList<Int> = ArrayList(),
var sigCarta: Int = -1 var sigCarta: Int = -1

8
src/juego/Oportunidad.kt Normal file
View File

@ -0,0 +1,8 @@
package dev.araozu.juego
interface Oportunidad {
val cartaDescartada: Int
val cartasOportunidad: ArrayList<Int>
}

View File

@ -0,0 +1,4 @@
package dev.araozu.juego
data class OportunidadSeq(override val cartaDescartada: Int, override val cartasOportunidad: ArrayList<Int>) :
Oportunidad

View File

@ -0,0 +1,4 @@
package dev.araozu.juego
data class OportunidadTri(override val cartaDescartada: Int, override val cartasOportunidad: ArrayList<Int>) :
Oportunidad