Actualizar funcion para ignorar oportunidades

This commit is contained in:
Araozu 2020-12-27 13:20:57 -05:00
parent f325a586d3
commit 31059422d9
3 changed files with 35 additions and 32 deletions

View File

@ -2,7 +2,6 @@ package dev.araozu
import dev.araozu.juego.Juego
import io.ktor.http.cio.websocket.*
import kotlinx.coroutines.isActive
object GestorJuegos {
@ -84,7 +83,7 @@ object GestorJuegos {
suspend fun manejarIgnorarOportunidad(idJuego: String, idUsuario: String) {
val juego = juegos[idJuego]!!
juego.ignorarOportunidadSeq(idUsuario)
juego.ignorarOportunidades(idUsuario)
}
suspend fun manejarLlamarSeq(idJuego: String, idUsuario: String, cartaDescartada: Int, combinacion: Pair<Int, Int>) {

View File

@ -49,7 +49,7 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
ordenJugadores = Array(4) { jugadores[it].idUsuario }
}
private fun obtenerDatosJuegoActuales(): DatosJuego {
fun obtenerDatosJuegoActuales(): DatosJuego {
val idJugadorTurnoActual = jugadores[posJugadorActual].idUsuario
return DatosJuego(
dora = arrayListOf(),
@ -126,10 +126,12 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
val cantidadOportunidades = jugadores[posJugadorActual].descartarCarta(cartaDescartada)
if (cantidadOportunidades > 0) {
when {
cantidadOportunidades > 0 -> {
// Enviar datos
enviarDatosATodos()
} else {
}
cantidadOportunidades == 0 -> {
cambiarTurnoSigJugadorConsecutivo()
// Actualizar dora
@ -138,30 +140,20 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
// Enviar datos
enviarDatosATodos()
}
}
// TODO: Usar diferente metodo para ignorar oportunidad Tsumo
suspend fun ignorarOportunidadSeq(idUsuario: String) {
var aunHayOportunidades = false
oportunidadesRestantes--
for ((id, mano) in manos) {
// Eliminar oportunidad del usuario
if (id == idUsuario) {
mano.oportunidades = arrayListOf()
enviarDatos(id, conexiones[id]!!)
continue
}
// Si algun otro jugador tiene una oportunidad
if (mano.oportunidades.isNotEmpty()) {
aunHayOportunidades = true
else -> {
System.err.println("Se intento descartar en un estado invalido.")
}
}
}
suspend fun ignorarOportunidades(idUsuario: String) {
val jugador = jugadores.find { it.idUsuario == idUsuario } ?: return
val aunHayOportunidades = jugador.ignorarOportunidades()
// Si no quedan oportunidades cambiar el turno al sig jugador
if (!aunHayOportunidades) {
if (aunHayOportunidades) {
jugador.enviarDatos(obtenerDatosJuegoActuales())
} else {
cambiarTurnoSigJugadorConsecutivo()
// Actualizar dora

View File

@ -80,6 +80,18 @@ sealed class Jugador(val juego: Juego, val idUsuario: String) {
return oportunidadesRestantes
}
/**
* Limpia las oportunidades del jugador y verifica si algun otro jugador tiene alguna oportunidad
* @return Si otro jugador tiene alguna oportunidad
*/
fun ignorarOportunidades(): Boolean {
mano.oportunidades.clear()
return null != juego.jugadores.find {
it !== this && it.mano.oportunidades.size > 0
}
}
abstract fun verificarTsumo()
}