Arreglar error que hacia que un jugador incorrecto inicie. Mejorar conf. inicial del juego
This commit is contained in:
parent
73a71a52e4
commit
d07651c28b
@ -44,10 +44,6 @@ fun Application.module(testing: Boolean = false) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
routing {
|
routing {
|
||||||
get("/json/gson") {
|
|
||||||
call.respond(mapOf("hello" to "world"))
|
|
||||||
}
|
|
||||||
|
|
||||||
this.crearJuego()
|
this.crearJuego()
|
||||||
this.wssala()
|
this.wssala()
|
||||||
this.juegows()
|
this.juegows()
|
||||||
|
@ -2,15 +2,14 @@ package dev.araozu.juego
|
|||||||
|
|
||||||
data class DatosJuego(
|
data class DatosJuego(
|
||||||
val dora: ArrayList<Int>,
|
val dora: ArrayList<Int>,
|
||||||
val doraOculto: ArrayList<Int>,
|
|
||||||
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,
|
val turnosHastaDora: Int,
|
||||||
val dragonPartida: Dragon
|
val dragonPartida: Dragon,
|
||||||
|
val oportunidadesRestantes: Int
|
||||||
) {
|
) {
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
if (this === other) return true
|
if (this === other) return true
|
||||||
if (javaClass != other?.javaClass) return false
|
if (javaClass != other?.javaClass) return false
|
||||||
@ -18,27 +17,26 @@ data class DatosJuego(
|
|||||||
other as DatosJuego
|
other as DatosJuego
|
||||||
|
|
||||||
if (dora != other.dora) return false
|
if (dora != other.dora) return false
|
||||||
if (doraOculto != other.doraOculto) return false
|
|
||||||
if (manos != other.manos) return false
|
if (manos != other.manos) return false
|
||||||
if (cartasRestantes != other.cartasRestantes) return false
|
if (cartasRestantes != other.cartasRestantes) return false
|
||||||
if (!ordenJugadores.contentEquals(other.ordenJugadores)) return false
|
if (!ordenJugadores.contentEquals(other.ordenJugadores)) return false
|
||||||
if (turnoActual != other.turnoActual) return false
|
if (turnoActual != other.turnoActual) return false
|
||||||
if (turnosHastaDora != other.turnosHastaDora) return false
|
if (turnosHastaDora != other.turnosHastaDora) return false
|
||||||
if (dragonPartida != other.dragonPartida) return false
|
if (dragonPartida != other.dragonPartida) return false
|
||||||
|
if (oportunidadesRestantes != other.oportunidadesRestantes) return false
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun hashCode(): Int {
|
override fun hashCode(): Int {
|
||||||
var result = dora.hashCode()
|
var result = dora.hashCode()
|
||||||
result = 31 * result + doraOculto.hashCode()
|
|
||||||
result = 31 * result + manos.hashCode()
|
result = 31 * result + manos.hashCode()
|
||||||
result = 31 * result + cartasRestantes
|
result = 31 * result + cartasRestantes
|
||||||
result = 31 * result + ordenJugadores.contentHashCode()
|
result = 31 * result + ordenJugadores.contentHashCode()
|
||||||
result = 31 * result + turnoActual.hashCode()
|
result = 31 * result + turnoActual.hashCode()
|
||||||
result = 31 * result + turnosHastaDora
|
result = 31 * result + turnosHastaDora
|
||||||
result = 31 * result + dragonPartida.hashCode()
|
result = 31 * result + dragonPartida.hashCode()
|
||||||
|
result = 31 * result + oportunidadesRestantes
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,37 +1,36 @@
|
|||||||
package dev.araozu.juego
|
package dev.araozu.juego
|
||||||
|
|
||||||
class GestorDora(private val cartas: ArrayList<Int>) {
|
class GestorDora(cartasIniciales: Array<Int>) {
|
||||||
|
|
||||||
private val doraCerrado = arrayListOf(cartas[0])
|
private val cartas = Array(5) {-1}
|
||||||
private val doraAbierto = arrayListOf<Int>()
|
val dora = arrayListOf(cartas[0])
|
||||||
private var turnosSigDora = 20
|
private var turnosSigDora = 20
|
||||||
var turnosRestantesDoraCerrado = turnosSigDora // 20 15 10 5
|
var turnosRestantesDora = turnosSigDora // 20 15 10 5
|
||||||
private set
|
private set
|
||||||
|
|
||||||
|
init {
|
||||||
|
for (i in 0 until 5) {
|
||||||
|
cartas[i] = cartasIniciales[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
operator fun component1(): ArrayList<Int> {
|
operator fun component1(): ArrayList<Int> {
|
||||||
return doraCerrado
|
return dora
|
||||||
}
|
}
|
||||||
|
|
||||||
operator fun component2(): ArrayList<Int> {
|
fun actualizarDora() {
|
||||||
return doraAbierto
|
if (dora.size >= 5) return
|
||||||
}
|
turnosRestantesDora--
|
||||||
|
|
||||||
fun actualizarDoraCerrado() {
|
if (turnosRestantesDora == 0) {
|
||||||
if (doraCerrado.size >= 5) return
|
dora.add(cartas[dora.size])
|
||||||
turnosRestantesDoraCerrado--
|
|
||||||
if (turnosRestantesDoraCerrado == 0) {
|
|
||||||
doraCerrado.add(cartas[doraCerrado.size])
|
|
||||||
turnosSigDora -= 5
|
turnosSigDora -= 5
|
||||||
turnosRestantesDoraCerrado = turnosSigDora
|
turnosRestantesDora = turnosSigDora
|
||||||
}
|
}
|
||||||
if (doraCerrado.size == 5) {
|
|
||||||
turnosRestantesDoraCerrado = -1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun actualizarDoraAbierto() {
|
if (dora.size == 5) {
|
||||||
if (doraAbierto.size >= 5) return
|
turnosRestantesDora = -1
|
||||||
doraAbierto.add(cartas[5 + doraAbierto.size])
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,11 +9,12 @@ 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 var gestorDora: GestorDora? = null
|
private var gestorDora = GestorDora(cartas)
|
||||||
private var estadoJuego = EstadoJuego.Espera
|
private var estadoJuego = EstadoJuego.Espera
|
||||||
private var posCartaActual = 0
|
private var posCartaActual = 10
|
||||||
private var turnoActual = 0
|
private var posJugadorActual = 0
|
||||||
private var dragonPartida = Dragon.Negro
|
private var dragonPartida = Dragon.Negro
|
||||||
|
private var oportunidadesRestantes = 0
|
||||||
|
|
||||||
suspend fun iniciarJuego(ws: WebSocketSession) {
|
suspend fun iniciarJuego(ws: WebSocketSession) {
|
||||||
if (estadoJuego != EstadoJuego.Espera) return
|
if (estadoJuego != EstadoJuego.Espera) return
|
||||||
@ -25,24 +26,12 @@ 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)) {
|
|
||||||
dora.add(cartas[i])
|
|
||||||
}
|
|
||||||
gestorDora = GestorDora(dora)
|
|
||||||
posCartaActual += 10
|
|
||||||
|
|
||||||
// Asignar orden de jugadores
|
// Asignar orden de jugadores
|
||||||
var i = 0
|
var i = 0
|
||||||
val posInicio = (Math.random() * 4).toInt()
|
val posInicio = (Math.random() * 4).toInt()
|
||||||
var idJugadorInicial = ""
|
|
||||||
conexiones.forEach { (idUsuario, _) ->
|
conexiones.forEach { (idUsuario, _) ->
|
||||||
if (i == posInicio) idJugadorInicial = idUsuario
|
|
||||||
|
|
||||||
ordenJugadores[i] = idUsuario
|
ordenJugadores[i] = idUsuario
|
||||||
val dragonActual = Dragon.get(i)
|
val dragonActual = Dragon.get(i)
|
||||||
i++
|
|
||||||
|
|
||||||
val cartasL = arrayListOf<Int>()
|
val cartasL = arrayListOf<Int>()
|
||||||
|
|
||||||
@ -51,11 +40,12 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
|
|||||||
}
|
}
|
||||||
posCartaActual += 10
|
posCartaActual += 10
|
||||||
|
|
||||||
val mano = if (idJugadorInicial == idUsuario) {
|
val mano = if (i == posInicio) {
|
||||||
val sigCarta = cartas[posCartaActual]
|
val sigCarta = cartas[posCartaActual]
|
||||||
posCartaActual++
|
posCartaActual++
|
||||||
gestorDora!!.actualizarDoraCerrado()
|
gestorDora.actualizarDora()
|
||||||
dragonPartida = dragonActual
|
dragonPartida = dragonActual
|
||||||
|
posJugadorActual = i
|
||||||
|
|
||||||
Mano(cartasL, sigCarta = sigCarta, dragon = dragonActual)
|
Mano(cartasL, sigCarta = sigCarta, dragon = dragonActual)
|
||||||
} else {
|
} else {
|
||||||
@ -63,6 +53,7 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
manos[idUsuario] = mano
|
manos[idUsuario] = mano
|
||||||
|
i++
|
||||||
}
|
}
|
||||||
|
|
||||||
conexiones.forEach { (_, socket) ->
|
conexiones.forEach { (_, socket) ->
|
||||||
@ -83,17 +74,17 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val idJugadorTurnoActual = ordenJugadores[turnoActual]
|
val idJugadorTurnoActual = ordenJugadores[posJugadorActual]
|
||||||
val (doraCerrado, doraAbierto) = gestorDora!!
|
val doraCerrado = gestorDora.dora
|
||||||
val datosJuego = DatosJuego(
|
val datosJuego = DatosJuego(
|
||||||
doraCerrado,
|
doraCerrado,
|
||||||
doraAbierto,
|
|
||||||
manosS,
|
manosS,
|
||||||
108 - posCartaActual,
|
108 - posCartaActual,
|
||||||
ordenJugadores,
|
ordenJugadores,
|
||||||
idJugadorTurnoActual,
|
idJugadorTurnoActual,
|
||||||
gestorDora!!.turnosRestantesDoraCerrado,
|
gestorDora.turnosRestantesDora,
|
||||||
dragonPartida
|
dragonPartida,
|
||||||
|
oportunidadesRestantes
|
||||||
)
|
)
|
||||||
ws.send(Frame.Text("{\"operacion\": \"actualizar_datos\", \"datos\": ${gson.toJson(datosJuego)}}"))
|
ws.send(Frame.Text("{\"operacion\": \"actualizar_datos\", \"datos\": ${gson.toJson(datosJuego)}}"))
|
||||||
}
|
}
|
||||||
@ -117,9 +108,10 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
|
|||||||
|
|
||||||
private fun cambiarTurnoSigJugadorConsecutivo() {
|
private fun cambiarTurnoSigJugadorConsecutivo() {
|
||||||
// Cambiar turno al sig jugador consecutivo
|
// Cambiar turno al sig jugador consecutivo
|
||||||
turnoActual = (turnoActual + 1) % 4
|
posJugadorActual = (posJugadorActual + 1) % 4
|
||||||
|
oportunidadesRestantes = 0
|
||||||
|
|
||||||
val idSigUsuario = ordenJugadores[turnoActual]
|
val idSigUsuario = ordenJugadores[posJugadorActual]
|
||||||
|
|
||||||
// Extraer sig carta. TODO: Verificar que no quedan cartas y establecer empate
|
// Extraer sig carta. TODO: Verificar que no quedan cartas y establecer empate
|
||||||
val sigCarta = cartas[posCartaActual]
|
val sigCarta = cartas[posCartaActual]
|
||||||
@ -148,7 +140,11 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
suspend fun manejarDescarte(idUsuario: String, carta: Int) {
|
suspend fun manejarDescarte(idUsuario: String, carta: Int) {
|
||||||
if (ordenJugadores[turnoActual] != idUsuario) return
|
if (ordenJugadores[posJugadorActual] != idUsuario) return
|
||||||
|
|
||||||
|
// Si el jugador del turno actual ya descarto, otros jugadores tienen oportunidades
|
||||||
|
// e intento descartar de nuevo
|
||||||
|
if (oportunidadesRestantes > 0) return
|
||||||
|
|
||||||
val m = manos[idUsuario]!!
|
val m = manos[idUsuario]!!
|
||||||
|
|
||||||
@ -170,7 +166,7 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
|
|||||||
|
|
||||||
m.descartes.add(carta)
|
m.descartes.add(carta)
|
||||||
|
|
||||||
// Verificar seq/tri/quad/win
|
// Verificar seq/tri/win
|
||||||
var hayOportunidades = false
|
var hayOportunidades = false
|
||||||
for ((idUsuarioActual, mano) in manos) {
|
for ((idUsuarioActual, mano) in manos) {
|
||||||
// No buscar oportunidades en el usuario que acaba de descartar.
|
// No buscar oportunidades en el usuario que acaba de descartar.
|
||||||
@ -181,6 +177,7 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
|
|||||||
val oportunidadSeq = OportunidadSeq.verificar(carta, mano.cartas)
|
val oportunidadSeq = OportunidadSeq.verificar(carta, mano.cartas)
|
||||||
if (oportunidadSeq != null) {
|
if (oportunidadSeq != null) {
|
||||||
hayOportunidades = true
|
hayOportunidades = true
|
||||||
|
oportunidadesRestantes++
|
||||||
mano.oportunidades.add(oportunidadSeq)
|
mano.oportunidades.add(oportunidadSeq)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -189,6 +186,7 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
|
|||||||
val oportunidadTri = OportunidadTri.verificar(carta, mano.cartas)
|
val oportunidadTri = OportunidadTri.verificar(carta, mano.cartas)
|
||||||
if (oportunidadTri != null) {
|
if (oportunidadTri != null) {
|
||||||
hayOportunidades = true
|
hayOportunidades = true
|
||||||
|
oportunidadesRestantes++
|
||||||
mano.oportunidades.add(oportunidadTri)
|
mano.oportunidades.add(oportunidadTri)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,6 +194,7 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
|
|||||||
val oportunidadWin = OportunidadWin.verificar(carta, mano.cartas, mano.cartasReveladas)
|
val oportunidadWin = OportunidadWin.verificar(carta, mano.cartas, mano.cartasReveladas)
|
||||||
if (oportunidadWin != null) {
|
if (oportunidadWin != null) {
|
||||||
hayOportunidades = true
|
hayOportunidades = true
|
||||||
|
oportunidadesRestantes++
|
||||||
mano.oportunidades.add(oportunidadWin)
|
mano.oportunidades.add(oportunidadWin)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -207,7 +206,7 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
|
|||||||
cambiarTurnoSigJugadorConsecutivo()
|
cambiarTurnoSigJugadorConsecutivo()
|
||||||
|
|
||||||
// Actualizar dora
|
// Actualizar dora
|
||||||
gestorDora!!.actualizarDoraCerrado()
|
gestorDora.actualizarDora()
|
||||||
|
|
||||||
// Enviar datos
|
// Enviar datos
|
||||||
enviarDatosATodos()
|
enviarDatosATodos()
|
||||||
@ -218,14 +217,16 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
|
|||||||
suspend fun ignorarOportunidadSeq(idUsuario: String) {
|
suspend fun ignorarOportunidadSeq(idUsuario: String) {
|
||||||
|
|
||||||
var aunHayOportunidades = false
|
var aunHayOportunidades = false
|
||||||
|
oportunidadesRestantes--
|
||||||
|
|
||||||
for ((id, mano) in manos) {
|
for ((id, mano) in manos) {
|
||||||
// Eliminar oportunidad del usuario
|
// Eliminar oportunidad del usuario
|
||||||
if (id == idUsuario) {
|
if (id == idUsuario) {
|
||||||
mano.oportunidades = arrayListOf()
|
mano.oportunidades = arrayListOf()
|
||||||
|
enviarDatos(id, conexiones[id]!!)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Notificar al jugador que su oportunidad ha sido ignorada
|
|
||||||
// Si algun otro jugador tiene una oportunidad
|
// Si algun otro jugador tiene una oportunidad
|
||||||
if (mano.oportunidades.isNotEmpty()) {
|
if (mano.oportunidades.isNotEmpty()) {
|
||||||
aunHayOportunidades = true
|
aunHayOportunidades = true
|
||||||
@ -237,7 +238,7 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
|
|||||||
cambiarTurnoSigJugadorConsecutivo()
|
cambiarTurnoSigJugadorConsecutivo()
|
||||||
|
|
||||||
// Actualizar dora
|
// Actualizar dora
|
||||||
gestorDora!!.actualizarDoraCerrado()
|
gestorDora.actualizarDora()
|
||||||
|
|
||||||
// Enviar los nuevos datos
|
// Enviar los nuevos datos
|
||||||
enviarDatosATodos()
|
enviarDatosATodos()
|
||||||
@ -247,14 +248,14 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
|
|||||||
private fun cambiarTurnoSegunIdUsuario(idUsuario: String) {
|
private fun cambiarTurnoSegunIdUsuario(idUsuario: String) {
|
||||||
for ((posJugador, i) in ordenJugadores.withIndex()) {
|
for ((posJugador, i) in ordenJugadores.withIndex()) {
|
||||||
if (i == idUsuario) {
|
if (i == idUsuario) {
|
||||||
turnoActual = posJugador
|
posJugadorActual = posJugador
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun manejarSeqTri(idUsuario: String, cartaDescartada: Int, combinacion: Pair<Int, Int>) {
|
suspend fun manejarSeqTri(idUsuario: String, cartaDescartada: Int, combinacion: Pair<Int, Int>) {
|
||||||
val manoJugadorDescarte = manos[ordenJugadores[turnoActual]]!!
|
val manoJugadorDescarte = manos[ordenJugadores[posJugadorActual]]!!
|
||||||
val descartesJ = manoJugadorDescarte.descartes
|
val descartesJ = manoJugadorDescarte.descartes
|
||||||
|
|
||||||
// La carta solicitada para robar es invalida
|
// La carta solicitada para robar es invalida
|
||||||
@ -284,6 +285,7 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
|
|||||||
|
|
||||||
// Eliminar las oportunidades
|
// Eliminar las oportunidades
|
||||||
manoRobador.oportunidades = arrayListOf()
|
manoRobador.oportunidades = arrayListOf()
|
||||||
|
oportunidadesRestantes = 0
|
||||||
|
|
||||||
// Cambiar turno al robador sin dar carta
|
// Cambiar turno al robador sin dar carta
|
||||||
// turnoActual = (turnoActual + 1) % 4
|
// turnoActual = (turnoActual + 1) % 4
|
||||||
|
@ -19,4 +19,6 @@ data class Mano(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user