Incorporados yaku a OportunidadWin.kt

master
Araozu 2020-10-21 09:32:57 -05:00
parent c1a3286e1a
commit cfebb922c3
4 changed files with 50 additions and 12 deletions

View File

@ -22,6 +22,22 @@ class ContenedorGrupos(
huerfanos.addAll(c.huerfanos) huerfanos.addAll(c.huerfanos)
} }
fun agregarTriDesdeInt(t: ArrayList<Int>) {
val arrl = ArrayList<Carta>(t.size)
t.forEach { arrl.add(Carta.obtenerCartaEspecifica(it)) }
tris.add(arrl)
}
fun agregarSeqDesdeInt(t: ArrayList<Int>) {
val arrl = ArrayList<Carta>(t.size)
t.forEach { arrl.add(Carta.obtenerCartaEspecifica(it)) }
seqs.add(arrl)
}
fun agregarSeqs(s: ArrayList<ArrayList<Carta>>) { fun agregarSeqs(s: ArrayList<ArrayList<Carta>>) {
seqs.addAll(s) seqs.addAll(s)
} }

View File

@ -174,7 +174,7 @@ class Juego(val usuarios: ArrayList<Pair<String, Boolean>>) {
} }
// Oportunidades win // Oportunidades win
val oportunidadWin = OportunidadWin.verificar(carta, mano.cartas) val oportunidadWin = OportunidadWin.verificar(carta, mano.cartas, mano.cartasReveladas)
if (oportunidadWin != null) { if (oportunidadWin != null) {
hayOportunidades = true hayOportunidades = true
mano.oportunidades.add(oportunidadWin) mano.oportunidades.add(oportunidadWin)

View File

@ -1,6 +1,9 @@
package dev.araozu.juego package dev.araozu.juego
class OportunidadWin(override val cartaDescartada: Int) : Oportunidad { import dev.araozu.juego.yaku.Yaku
import dev.araozu.juego.yaku.obtenerListaYakus
class OportunidadWin(override val cartaDescartada: Int, val yaku: ArrayList<Yaku>) : Oportunidad {
override val nombreOportunidad = "Win" override val nombreOportunidad = "Win"
@ -145,7 +148,7 @@ class OportunidadWin(override val cartaDescartada: Int) : Oportunidad {
return if (valorCont1 > valorCont2) contenedor1 else contenedor2 return if (valorCont1 > valorCont2) contenedor1 else contenedor2
} }
fun verificar(valorCarta: Int, cartasMano: ArrayList<Int>): OportunidadWin? { fun verificar(valorCarta: Int, cartasMano: ArrayList<Int>, gruposAbiertos: ArrayList<ArrayList<Int>>): OportunidadWin? {
val narrl = ArrayList<Int>(cartasMano.size + 1) val narrl = ArrayList<Int>(cartasMano.size + 1)
narrl.addAll(cartasMano) narrl.addAll(cartasMano)
narrl.add(valorCarta) narrl.add(valorCarta)
@ -167,11 +170,28 @@ class OportunidadWin(override val cartaDescartada: Int) : Oportunidad {
contenedorGrupos.agregarDesdeContenedor(obtenerContenedorCartasNumero(cartasRojo)) contenedorGrupos.agregarDesdeContenedor(obtenerContenedorCartasNumero(cartasRojo))
contenedorGrupos.agregarDesdeContenedor(obtenerContenedorCartasNumero(cartasNegro)) contenedorGrupos.agregarDesdeContenedor(obtenerContenedorCartasNumero(cartasNegro))
return if (contenedorGrupos.estaListo()) { if (!contenedorGrupos.estaListo()) return null
OportunidadWin(valorCarta)
} else { val esManoAbierta = gruposAbiertos.isEmpty()
null
if (esManoAbierta) {
// Agregar los grupos abiertos al contenedor
for (arrl in gruposAbiertos) {
// Tri
if (((arrl[0] ushr 1) shl 1) == ((arrl[1] ushr 1) shl 1)) {
contenedorGrupos.agregarTriDesdeInt(arrl)
} }
// Seq
else {
contenedorGrupos.agregarSeqDesdeInt(arrl)
}
}
}
// Obtener yaku
val yaku = obtenerListaYakus(contenedorGrupos, esManoAbierta)
return OportunidadWin(valorCarta, yaku)
} }
} }

View File

@ -6,19 +6,23 @@ enum class Yaku {
// 15 // 15
DragonesFull, DragonesFull,
Verde, Verde,
// 10 // 10
RealezaDragones, RealezaDragones,
RealezaFull, RealezaFull,
// 5 // 5
TripleTriplesCerrados, TripleTriplesCerrados,
EscaleraFull, EscaleraFull,
Exterior, Exterior,
// 4 // 4
Escalera, Escalera,
TripleCuadruples, TripleCuadruples,
Negro, Negro,
Rojo, Rojo,
SemiExterior, SemiExterior,
// 3 // 3
ParUnico, ParUnico,
Dragones, Dragones,
@ -29,8 +33,7 @@ enum class Yaku {
DobleSecuenciaPura DobleSecuenciaPura
} }
// TODO: Recibir como parametro si la mano esta abierta o cerrada y verificar los yakus aqui segun eso fun obtenerListaYakus(contenedorGrupos: ContenedorGrupos, esManoAbierta: Boolean): ArrayList<Yaku> {
fun Yaku.obtenerListaYakus(contenedorGrupos: ContenedorGrupos): ArrayList<Yaku> {
val listaYakus = ArrayList<Yaku>() val listaYakus = ArrayList<Yaku>()
// Invariante: 3 sequencias/triples/cuadruples, 1 par y ningun huerfano // Invariante: 3 sequencias/triples/cuadruples, 1 par y ningun huerfano
@ -72,9 +75,9 @@ fun Yaku.obtenerListaYakus(contenedorGrupos: ContenedorGrupos): ArrayList<Yaku>
verificarEscalera = false verificarEscalera = false
} }
// TODO: Verificar la mano abierta // Triple triples cerrados
var verificarTripleTriples = true var verificarTripleTriples = true
if (yakuTripleTriples(contenedorGrupos)) { if (!esManoAbierta && yakuTripleTriples(contenedorGrupos)) {
listaYakus.add(Yaku.TripleTriplesCerrados) listaYakus.add(Yaku.TripleTriplesCerrados)
listaYakus.add(Yaku.TripleTriples) listaYakus.add(Yaku.TripleTriples)
verificarTripleTriples = false verificarTripleTriples = false
@ -122,4 +125,3 @@ fun Yaku.obtenerListaYakus(contenedorGrupos: ContenedorGrupos): ArrayList<Yaku>
return listaYakus return listaYakus
} }