Modificar y corregir yaku

This commit is contained in:
Araozu 2020-12-28 11:04:05 -05:00
parent 1ddb05a55d
commit 64c802ad85
11 changed files with 164 additions and 155 deletions

View File

@ -40,4 +40,5 @@ dependencies {
implementation "io.ktor:ktor-gson:$ktor_version"
implementation 'com.google.code.gson:gson:2.8.5'
testImplementation "io.ktor:ktor-server-tests:$ktor_version"
testImplementation 'io.kotest:kotest-runner-junit5:$version'
}

View File

@ -12,8 +12,7 @@ class ContenedorGrupos(
arrayListOf<ArrayList<Carta>>(),
arrayListOf<ArrayList<Carta>>(),
arrayListOf<Carta>()
) {
}
)
fun agregarDesdeContenedor(c: ContenedorGrupos) {
tris.addAll(c.tris)

View File

@ -3,7 +3,7 @@ package dev.araozu.juego
import dev.araozu.juego.yaku.Yaku
import dev.araozu.juego.yaku.obtenerListaYakus
class OportunidadWin(override val cartaDescartada: Int, val yaku: ArrayList<Yaku>) : Oportunidad {
class OportunidadRon(override val cartaDescartada: Int, val yaku: ArrayList<Yaku>) : Oportunidad {
override val nombreOportunidad = "Win"
@ -148,7 +148,11 @@ class OportunidadWin(override val cartaDescartada: Int, val yaku: ArrayList<Yaku
return if (valorCont1 > valorCont2) contenedor1 else contenedor2
}
fun verificar(valorCarta: Int, cartasMano: ArrayList<Int>, gruposAbiertos: ArrayList<ArrayList<Int>>): OportunidadWin? {
fun verificar(
valorCarta: Int,
cartasMano: ArrayList<Int>,
gruposAbiertos: ArrayList<ArrayList<Int>> = arrayListOf()
): OportunidadRon? {
val narrl = ArrayList<Int>(cartasMano.size + 1)
narrl.addAll(cartasMano)
narrl.add(valorCarta)
@ -191,7 +195,7 @@ class OportunidadWin(override val cartaDescartada: Int, val yaku: ArrayList<Yaku
// Obtener yaku
val yaku = obtenerListaYakus(contenedorGrupos, esManoAbierta)
return if (yaku.isNotEmpty()) OportunidadWin(valorCarta, yaku) else null
return if (yaku.isNotEmpty()) OportunidadRon(valorCarta, yaku) else null
}
}

View File

@ -3,34 +3,38 @@ package dev.araozu.juego.yaku
import dev.araozu.juego.ContenedorGrupos
enum class Yaku {
// 15
// 10
DragonesFull,
Verde,
// 10
// 7
RealezaDragones,
RealezaFull,
EscaleraPerfecta,
A10,
// 5
TripleTriplesCerrados,
EscaleraFull,
// 3
TripleTriplesCerrados,
Exterior,
// 4
// 2
Escalera,
TripleCuadruples,
Negro,
Rojo,
SemiExterior,
DobleSecuenciaPura,
// 3
ParUnico,
// 1
Dragones,
Interior,
TripleTriples,
TripleSecuenciaCerrada,
Realeza,
DobleSecuenciaPura
Variedad,
DobleSecuencia,
ManoCompletamenteCerrada
}
fun obtenerListaYakus(contenedorGrupos: ContenedorGrupos, esManoAbierta: Boolean): ArrayList<Yaku> {
@ -45,7 +49,7 @@ fun obtenerListaYakus(contenedorGrupos: ContenedorGrupos, esManoAbierta: Boolean
return arrayListOf()
}
// 15 puntos
// 10 puntos
if (yakuDragonesFull(contenedorGrupos)) {
listaYakus.add(Yaku.DragonesFull)
return listaYakus
@ -55,7 +59,7 @@ fun obtenerListaYakus(contenedorGrupos: ContenedorGrupos, esManoAbierta: Boolean
return listaYakus
}
// 10 puntos
// 7 puntos
if (yakuRealezaDragones(contenedorGrupos)) {
listaYakus.add(Yaku.RealezaDragones)
return listaYakus
@ -66,6 +70,9 @@ fun obtenerListaYakus(contenedorGrupos: ContenedorGrupos, esManoAbierta: Boolean
}
// 5 puntos
// TODO
// 3 puntos
if (yakuExterior(contenedorGrupos)) {
listaYakus.add(Yaku.Exterior)
}
@ -84,7 +91,7 @@ fun obtenerListaYakus(contenedorGrupos: ContenedorGrupos, esManoAbierta: Boolean
verificarTripleTriples = false
}
// 4 puntos
// 2 puntos
if (yakuSemiExterior(contenedorGrupos)) {
listaYakus.add(Yaku.SemiExterior)
}
@ -94,24 +101,18 @@ fun obtenerListaYakus(contenedorGrupos: ContenedorGrupos, esManoAbierta: Boolean
if (yakuNegro(contenedorGrupos)) {
listaYakus.add(Yaku.Negro)
}
if (yakuTripleCuadruples(contenedorGrupos)) {
listaYakus.add(Yaku.TripleCuadruples)
}
if (verificarEscalera && yakuEscalera(contenedorGrupos)) {
listaYakus.add(Yaku.Escalera)
}
// 3 puntos
if (yakuDobleSecuenciaPura(contenedorGrupos)) {
listaYakus.add(Yaku.DobleSecuenciaPura)
// 1 punto
if (yakuDobleSecuencia(contenedorGrupos)) {
listaYakus.add(Yaku.DobleSecuencia)
}
val cantidad = yakuRealeza(contenedorGrupos)
if (cantidad > 0) {
listaYakus.add(Yaku.Realeza)
}
if (!esManoAbierta && yakuTripleSecuenciaCerrada(contenedorGrupos)) {
listaYakus.add(Yaku.TripleSecuenciaCerrada)
}
if (verificarTripleTriples && yakuTripleTriples(contenedorGrupos)) {
listaYakus.add(Yaku.TripleTriples)
}
@ -122,9 +123,6 @@ fun obtenerListaYakus(contenedorGrupos: ContenedorGrupos, esManoAbierta: Boolean
if (cantidadDragon > 0) {
listaYakus.add(Yaku.Dragones)
}
if (yakuParUnico(contenedorGrupos)) {
listaYakus.add(Yaku.ParUnico)
}
return listaYakus
}

61
src/juego/yaku/yaku1.kt Normal file
View File

@ -0,0 +1,61 @@
package dev.araozu.juego.yaku
import dev.araozu.juego.CartaNumero
import dev.araozu.juego.ContenedorGrupos
// TODO
internal fun yakuDobleSecuencia(contenedorGrupos: ContenedorGrupos): Boolean {
return false
}
internal fun yakuVariedad(contenedorGrupos: ContenedorGrupos): Boolean {
return false
}
internal fun yakuRealeza(contenedorGrupos: ContenedorGrupos): Int {
var cantidadRealeza = 0
for (carrl in contenedorGrupos.tris) {
val cartaTri = carrl[0]
if (cartaTri.esRey()) cantidadRealeza++
}
return cantidadRealeza
}
internal fun yakuTripleTriples(contenedorGrupos: ContenedorGrupos) =
contenedorGrupos.tris.size == 3
internal fun yakuInterior(contenedorGrupos: ContenedorGrupos): Boolean {
for (carrl in contenedorGrupos.seqs) {
for (c in carrl) {
if (c !is CartaNumero) return false
if (c.esExterior()) return false
}
}
for (carrl in contenedorGrupos.tris) {
for (c in carrl) {
if (c !is CartaNumero) return false
if (c.esExterior()) return false
}
}
for (carrl in contenedorGrupos.pares) {
for (c in carrl) {
if (c !is CartaNumero) return false
if (c.esExterior()) return false
}
}
return true
}
// TODO
internal fun yakuDragones(contenedorGrupos: ContenedorGrupos): Int {
return 0
}

View File

@ -1,36 +1,42 @@
package dev.araozu.juego.yaku
import dev.araozu.juego.CartaRealeza
import dev.araozu.juego.CartaDragon
import dev.araozu.juego.ContenedorGrupos
internal fun yakuRealezaDragones(contenedorGrupos: ContenedorGrupos): Boolean {
internal fun yakuDragonesFull(contenedorGrupos: ContenedorGrupos): Boolean {
if (contenedorGrupos.tris.size != 3) return false
for (carrl in contenedorGrupos.tris) {
for (c in carrl) {
if (!c.esDragonORey()) return false
if (c !is CartaDragon) return false
}
}
for (carrl in contenedorGrupos.pares) {
for (c in carrl) {
if (!c.esDragonORey()) return false
if (c !is CartaDragon) return false
}
}
return true
}
internal fun yakuRealezaFull(contenedorGrupos: ContenedorGrupos): Boolean {
internal fun yakuVerde(contenedorGrupos: ContenedorGrupos): Boolean {
if (contenedorGrupos.tris.size != 3) return false
for (carrl in contenedorGrupos.tris) {
for (c in carrl) {
if (c !is CartaRealeza) return false
if (!c.esCartaVerde()) return false
}
}
return false
for (carrl in contenedorGrupos.pares) {
for (c in carrl) {
if (!c.esCartaVerde()) return false
}
}
return true
}

View File

@ -1,42 +0,0 @@
package dev.araozu.juego.yaku
import dev.araozu.juego.CartaDragon
import dev.araozu.juego.ContenedorGrupos
internal fun yakuDragonesFull(contenedorGrupos: ContenedorGrupos): Boolean {
if (contenedorGrupos.tris.size != 3) return false
for (carrl in contenedorGrupos.tris) {
for (c in carrl) {
if (c !is CartaDragon) return false
}
}
for (carrl in contenedorGrupos.pares) {
for (c in carrl) {
if (c !is CartaDragon) return false
}
}
return true
}
internal fun yakuVerde(contenedorGrupos: ContenedorGrupos): Boolean {
if (contenedorGrupos.tris.size != 3) return false
for (carrl in contenedorGrupos.tris) {
for (c in carrl) {
if (!c.esCartaVerde()) return false
}
}
for (carrl in contenedorGrupos.pares) {
for (c in carrl) {
if (!c.esCartaVerde()) return false
}
}
return true
}

View File

@ -3,6 +3,11 @@ package dev.araozu.juego.yaku
import dev.araozu.juego.CartaNumero
import dev.araozu.juego.ContenedorGrupos
internal fun yakuDobleSecuenciaPura(contenedorGrupos: ContenedorGrupos): Boolean {
return false
}
internal fun yakuSemiExterior(contenedorGrupos: ContenedorGrupos): Boolean {
for (carrl in contenedorGrupos.seqs) {
@ -84,17 +89,6 @@ internal fun yakuNegro(contenedorGrupos: ContenedorGrupos): Boolean {
return true
}
internal fun yakuTripleCuadruples(contenedorGrupos: ContenedorGrupos): Boolean {
if (contenedorGrupos.tris.size != 3) return false
for (triple in contenedorGrupos.tris) {
if (triple.size != 4) return false
}
return true
}
// TODO: Las secuencias pueden no estar en orden
internal fun yakuEscalera(contenedorGrupos: ContenedorGrupos): Boolean {

View File

@ -3,66 +3,29 @@ package dev.araozu.juego.yaku
import dev.araozu.juego.CartaNumero
import dev.araozu.juego.ContenedorGrupos
// TODO
internal fun yakuDobleSecuenciaPura(contenedorGrupos: ContenedorGrupos): Boolean {
internal fun yakuExterior(contenedorGrupos: ContenedorGrupos): Boolean {
if (contenedorGrupos.tris.size != 3) return false
for (carrl in contenedorGrupos.tris) {
for (c in carrl) {
if (!c.esDragonORey() || c !is CartaNumero || !c.esExterior())
return false
}
internal fun yakuRealeza(contenedorGrupos: ContenedorGrupos): Int {
var cantidadRealeza = 0
for (carrl in contenedorGrupos.tris) {
val cartaTri = carrl[0]
if (cartaTri.esRey()) cantidadRealeza++
}
return cantidadRealeza
}
internal fun yakuTripleSecuenciaCerrada(contenedorGrupos: ContenedorGrupos) =
contenedorGrupos.tris.size == 3
internal fun yakuTripleTriples(contenedorGrupos: ContenedorGrupos) =
contenedorGrupos.tris.size == 3
internal fun yakuInterior(contenedorGrupos: ContenedorGrupos): Boolean {
for (carrl in contenedorGrupos.seqs) {
for (c in carrl) {
if (c !is CartaNumero) return false
if (c.esExterior()) return false
}
}
for (carrl in contenedorGrupos.tris) {
for (c in carrl) {
if (c !is CartaNumero) return false
if (c.esExterior()) return false
}
}
for (carrl in contenedorGrupos.pares) {
for (c in carrl) {
if (c !is CartaNumero) return false
if (c.esExterior()) return false
if (!c.esDragonORey() || c !is CartaNumero || !c.esExterior())
return false
}
}
return true
}
// TODO
internal fun yakuDragones(contenedorGrupos: ContenedorGrupos): Int {
internal fun yakuTripleTriplesCerrados(contenedorGrupos: ContenedorGrupos): Boolean {
return 0
return false
}
internal fun yakuParUnico(contenedorGrupos: ContenedorGrupos): Boolean {
val par = contenedorGrupos.pares[0]
val c1 = par[0]
val c2 = par[1]
if (c1 !is CartaNumero || c2 !is CartaNumero) return false
return c1.valor == c2.valor
}

View File

@ -3,26 +3,6 @@ package dev.araozu.juego.yaku
import dev.araozu.juego.CartaNumero
import dev.araozu.juego.ContenedorGrupos
internal fun yakuExterior(contenedorGrupos: ContenedorGrupos): Boolean {
if (contenedorGrupos.tris.size != 3) return false
for (carrl in contenedorGrupos.tris) {
for (c in carrl) {
if (!c.esDragonORey() || c !is CartaNumero || !c.esExterior())
return false
}
}
for (carrl in contenedorGrupos.pares) {
for (c in carrl) {
if (!c.esDragonORey() || c !is CartaNumero || !c.esExterior())
return false
}
}
return true
}
// TODO: Las secuencias pueden no estar en orden
internal fun yakuEscaleraFull(contenedorGrupos: ContenedorGrupos): Boolean {
@ -57,4 +37,3 @@ internal fun yakuEscaleraFull(contenedorGrupos: ContenedorGrupos): Boolean {
return true
}

46
src/juego/yaku/yaku7.kt Normal file
View File

@ -0,0 +1,46 @@
package dev.araozu.juego.yaku
import dev.araozu.juego.CartaRealeza
import dev.araozu.juego.ContenedorGrupos
internal fun yakuA10(contenedorGrupos: ContenedorGrupos): Boolean {
return false
}
internal fun yakuEscaleraPerfecta(contenedorGrupos: ContenedorGrupos): Boolean {
return false
}
internal fun yakuRealezaDragones(contenedorGrupos: ContenedorGrupos): Boolean {
if (contenedorGrupos.tris.size != 3) return false
for (carrl in contenedorGrupos.tris) {
for (c in carrl) {
if (!c.esDragonORey()) return false
}
}
for (carrl in contenedorGrupos.pares) {
for (c in carrl) {
if (!c.esDragonORey()) return false
}
}
return true
}
internal fun yakuRealezaFull(contenedorGrupos: ContenedorGrupos): Boolean {
if (contenedorGrupos.tris.size != 3) return false
for (carrl in contenedorGrupos.tris) {
for (c in carrl) {
if (c !is CartaRealeza) return false
}
}
return true
}