Finalizar refactorizacion inicial

master
Araozu 2020-12-27 16:34:27 -05:00
parent 146c559ee1
commit 257a0b058c
5 changed files with 43 additions and 23 deletions

View File

@ -56,14 +56,17 @@ object GestorJuegos {
broadcast(juego, mensaje) broadcast(juego, mensaje)
var str = "[" var str = "["
for ((idUsuarioAct, _) in juego.usuarios) { for (jugador in juego.jugadores) {
val nombreUsuarioAct = GestorUsuarios.obtenerNombreUsuario(idUsuarioAct) val nombreUsuarioAct =
if (jugador.idUsuario.startsWith("Bot")) jugador.idUsuario
else GestorUsuarios.obtenerNombreUsuario(jugador.idUsuario)
if (str.length != 1) str += "," if (str.length != 1) str += ","
str += "{\"idUsuario\": \"$idUsuarioAct\", \"nombreUsuario\": \"$nombreUsuarioAct\"}" str += "{\"idUsuario\": \"${jugador.idUsuario}\", \"nombreUsuario\": \"$nombreUsuarioAct\"}"
} }
str += "]" str += "]"
juego.agregarConexion(idUsuario, ws) juego.agregarConexion(idUsuario, ws)
juego.agregarUsuario(idUsuario)
ws.send(Frame.Text("{\"operacion\": \"conexion_exitosa\", \"jugadores\": $str}")) ws.send(Frame.Text("{\"operacion\": \"conexion_exitosa\", \"jugadores\": $str}"))
} }

View File

@ -18,7 +18,7 @@ fun Routing.crearJuego() {
sigId = GestorJuegos.generarId() sigId = GestorJuegos.generarId()
} }
val juego = Juego(arrayListOf()) val juego = Juego(sigId)
GestorJuegos.juegos[sigId] = juego GestorJuegos.juegos[sigId] = juego
call.respondText("{\"id\": \"$sigId\"}", contentType = ContentType.Application.Json) call.respondText("{\"id\": \"$sigId\"}", contentType = ContentType.Application.Json)

View File

@ -3,7 +3,7 @@ package dev.araozu.juego
class GestorDora(cartasIniciales: Array<Int>) { class GestorDora(cartasIniciales: Array<Int>) {
private val cartas = Array(5) {-1} private val cartas = Array(5) {-1}
val dora = arrayListOf(cartas[0]) val dora: ArrayList<Int>
private var turnosSigDora = 20 private var turnosSigDora = 20
var turnosRestantesDora = turnosSigDora // 20 15 10 5 var turnosRestantesDora = turnosSigDora // 20 15 10 5
private set private set
@ -12,6 +12,7 @@ class GestorDora(cartasIniciales: Array<Int>) {
for (i in 0 until 5) { for (i in 0 until 5) {
cartas[i] = cartasIniciales[i] cartas[i] = cartasIniciales[i]
} }
dora = arrayListOf(cartas[0])
} }
operator fun component1(): ArrayList<Int> { operator fun component1(): ArrayList<Int> {

View File

@ -3,11 +3,13 @@ package dev.araozu.juego
import dev.araozu.* 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 idJuego: String) {
private val cartas: Array<Int> = GestorJuegos.generarCartas() private val cartas: Array<Int> = GestorJuegos.generarCartas()
internal var jugadores = Array<Jugador>(4) { JugadorBot(this, "Bot $it") } internal var jugadores = Array<Jugador>(4) {
JugadorBot(this, GestorUsuarios.crearUsuario("Bot $it - $idJuego"))
}
private var ordenJugadores = Array(4) { jugadores[it].idUsuario } private var ordenJugadores = Array(4) { jugadores[it].idUsuario }
private var gestorDora = GestorDora(cartas) private var gestorDora = GestorDora(cartas)
@ -22,13 +24,17 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
estadoJuego = EstadoJuego.Iniciado estadoJuego = EstadoJuego.Iniciado
val nuevoArrJugadores = Array<Jugador>(4) { JugadorBot(this, "-") } val nuevoArrJugadores = Array<Jugador>(4) {
JugadorBot(this, GestorUsuarios.crearUsuario("Bot init $it - $idJuego"))
}
val jugadoresRestantes = arrayListOf(0, 1, 2, 3) val jugadoresRestantes = arrayListOf(0, 1, 2, 3)
// TODO: Logica erronea
for (i in 0 until 4) { for (i in 0 until 4) {
val nuevoIndice = (Math.random() * jugadoresRestantes.size).toInt() val nuevoIndice = (Math.random() * jugadoresRestantes.size).toInt()
nuevoArrJugadores[i] = jugadores[nuevoIndice] val nuevaPosicion = jugadoresRestantes[nuevoIndice]
jugadoresRestantes.remove(nuevoIndice) nuevoArrJugadores[i] = jugadores[nuevaPosicion]
jugadoresRestantes.removeAt(nuevoIndice)
} }
dragonPartida = Dragon.get((Math.random() * 4).toInt()) dragonPartida = Dragon.get((Math.random() * 4).toInt())
@ -47,12 +53,25 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
jugadores = nuevoArrJugadores jugadores = nuevoArrJugadores
ordenJugadores = Array(4) { jugadores[it].idUsuario } ordenJugadores = Array(4) { jugadores[it].idUsuario }
// Dar carta al primer jugador y empezar el juego
val sigCarta = cartas[posCartaActual]
posCartaActual++
// Asignar carta
jugadores[posJugadorActual].recibirCarta(sigCarta)
// Verificar Tsumo
jugadores[posJugadorActual].verificarTsumo()
enviarDatosATodos()
} }
private fun obtenerDatosJuegoActuales(): DatosJuego { private fun obtenerDatosJuegoActuales(): DatosJuego {
val idJugadorTurnoActual = jugadores[posJugadorActual].idUsuario val idJugadorTurnoActual = jugadores[posJugadorActual].idUsuario
// TODO: Agregar EstadoJuego
return DatosJuego( return DatosJuego(
dora = arrayListOf(), dora = gestorDora.dora,
manos = hashMapOf(), manos = hashMapOf(),
cartasRestantes = 108 - posCartaActual, cartasRestantes = 108 - posCartaActual,
ordenJugadores = ordenJugadores, ordenJugadores = ordenJugadores,
@ -70,8 +89,6 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
} }
suspend fun agregarConexion(idUsuario: String, conexion: WebSocketSession) { suspend fun agregarConexion(idUsuario: String, conexion: WebSocketSession) {
if (estadoJuego != EstadoJuego.Espera) return
// Buscar si el jugador ya existia // Buscar si el jugador ya existia
jugadores.forEach { jugadores.forEach {
if (it.idUsuario == idUsuario) { if (it.idUsuario == idUsuario) {
@ -81,20 +98,19 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
} }
} }
// El jugador es nuevo. Asignarlo. // El jugador es nuevo. Verificar que aun se este en la sala
if (estadoJuego != EstadoJuego.Espera) return
// Asignarlo.
val nuevoJugador = JugadorHumano(this, idUsuario, conexion) val nuevoJugador = JugadorHumano(this, idUsuario, conexion)
for (i in 0 until 4) { for (i in 0 until 4) {
if (jugadores[i] !is JugadorBot) { if (jugadores[i] is JugadorBot) {
jugadores[i] = nuevoJugador jugadores[i] = nuevoJugador
break break
} }
} }
} }
fun agregarUsuario(idUsuario: String) {
if (estadoJuego == EstadoJuego.Espera) usuarios.add(Pair(idUsuario, true))
}
private fun cambiarTurnoSigJugadorConsecutivo() { private fun cambiarTurnoSigJugadorConsecutivo() {
// Cambiar turno al sig jugador consecutivo // Cambiar turno al sig jugador consecutivo
posJugadorActual = (posJugadorActual + 1) % 4 posJugadorActual = (posJugadorActual + 1) % 4

View File

@ -178,14 +178,14 @@ class JugadorBot(juego: Juego, idUsuario: String) : Jugador(juego, idUsuario) {
override fun actualizarConexion(ws: WebSocketSession) {} override fun actualizarConexion(ws: WebSocketSession) {}
override suspend fun enviarDatos(datos: DatosJuego) { override suspend fun enviarDatos(datos: DatosJuego) {
println("Bot pensando") println("Bot $idUsuario pensando")
// Si el bot tiene una carta adicional // Si el bot tiene una carta adicional
if (mano.sigCarta != 1) { if (mano.sigCarta != 1) {
// Espera 1s y la descarta // Espera 1s y la descarta
GlobalScope.launch { GlobalScope.launch {
delay(1000) delay(1000)
println("Bot descartando la carta que recibio") println("Bot $idUsuario descartando la carta que recibio")
juego.manejarDescarte(idUsuario, mano.sigCarta) juego.manejarDescarte(idUsuario, mano.sigCarta)
} }
} }
@ -195,7 +195,7 @@ class JugadorBot(juego: Juego, idUsuario: String) : Jugador(juego, idUsuario) {
// Espera 1s e ignora oportunidades // Espera 1s e ignora oportunidades
GlobalScope.launch { GlobalScope.launch {
delay(1000) delay(1000)
println("Bot ignorando sus oportunidades") println("Bot $idUsuario ignorando sus oportunidades")
juego.ignorarOportunidades(idUsuario) juego.ignorarOportunidades(idUsuario)
} }
} }