Modificar y corregir yaku

master
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 "io.ktor:ktor-gson:$ktor_version"
implementation 'com.google.code.gson:gson:2.8.5' implementation 'com.google.code.gson:gson:2.8.5'
testImplementation "io.ktor:ktor-server-tests:$ktor_version" 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<ArrayList<Carta>>(), arrayListOf<ArrayList<Carta>>(),
arrayListOf<Carta>() arrayListOf<Carta>()
) { )
}
fun agregarDesdeContenedor(c: ContenedorGrupos) { fun agregarDesdeContenedor(c: ContenedorGrupos) {
tris.addAll(c.tris) 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.Yaku
import dev.araozu.juego.yaku.obtenerListaYakus 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" 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 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) val narrl = ArrayList<Int>(cartasMano.size + 1)
narrl.addAll(cartasMano) narrl.addAll(cartasMano)
narrl.add(valorCarta) narrl.add(valorCarta)
@ -191,7 +195,7 @@ class OportunidadWin(override val cartaDescartada: Int, val yaku: ArrayList<Yaku
// Obtener yaku // Obtener yaku
val yaku = obtenerListaYakus(contenedorGrupos, esManoAbierta) 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 import dev.araozu.juego.ContenedorGrupos
enum class Yaku { enum class Yaku {
// 15 // 10
DragonesFull, DragonesFull,
Verde, Verde,
// 10 // 7
RealezaDragones, RealezaDragones,
RealezaFull, RealezaFull,
EscaleraPerfecta,
A10,
// 5 // 5
TripleTriplesCerrados,
EscaleraFull, EscaleraFull,
// 3
TripleTriplesCerrados,
Exterior, Exterior,
// 4 // 2
Escalera, Escalera,
TripleCuadruples,
Negro, Negro,
Rojo, Rojo,
SemiExterior, SemiExterior,
DobleSecuenciaPura,
// 3 // 1
ParUnico,
Dragones, Dragones,
Interior, Interior,
TripleTriples, TripleTriples,
TripleSecuenciaCerrada,
Realeza, Realeza,
DobleSecuenciaPura Variedad,
DobleSecuencia,
ManoCompletamenteCerrada
} }
fun obtenerListaYakus(contenedorGrupos: ContenedorGrupos, esManoAbierta: Boolean): ArrayList<Yaku> { fun obtenerListaYakus(contenedorGrupos: ContenedorGrupos, esManoAbierta: Boolean): ArrayList<Yaku> {
@ -45,7 +49,7 @@ fun obtenerListaYakus(contenedorGrupos: ContenedorGrupos, esManoAbierta: Boolean
return arrayListOf() return arrayListOf()
} }
// 15 puntos // 10 puntos
if (yakuDragonesFull(contenedorGrupos)) { if (yakuDragonesFull(contenedorGrupos)) {
listaYakus.add(Yaku.DragonesFull) listaYakus.add(Yaku.DragonesFull)
return listaYakus return listaYakus
@ -55,7 +59,7 @@ fun obtenerListaYakus(contenedorGrupos: ContenedorGrupos, esManoAbierta: Boolean
return listaYakus return listaYakus
} }
// 10 puntos // 7 puntos
if (yakuRealezaDragones(contenedorGrupos)) { if (yakuRealezaDragones(contenedorGrupos)) {
listaYakus.add(Yaku.RealezaDragones) listaYakus.add(Yaku.RealezaDragones)
return listaYakus return listaYakus
@ -66,6 +70,9 @@ fun obtenerListaYakus(contenedorGrupos: ContenedorGrupos, esManoAbierta: Boolean
} }
// 5 puntos // 5 puntos
// TODO
// 3 puntos
if (yakuExterior(contenedorGrupos)) { if (yakuExterior(contenedorGrupos)) {
listaYakus.add(Yaku.Exterior) listaYakus.add(Yaku.Exterior)
} }
@ -84,7 +91,7 @@ fun obtenerListaYakus(contenedorGrupos: ContenedorGrupos, esManoAbierta: Boolean
verificarTripleTriples = false verificarTripleTriples = false
} }
// 4 puntos // 2 puntos
if (yakuSemiExterior(contenedorGrupos)) { if (yakuSemiExterior(contenedorGrupos)) {
listaYakus.add(Yaku.SemiExterior) listaYakus.add(Yaku.SemiExterior)
} }
@ -94,24 +101,18 @@ fun obtenerListaYakus(contenedorGrupos: ContenedorGrupos, esManoAbierta: Boolean
if (yakuNegro(contenedorGrupos)) { if (yakuNegro(contenedorGrupos)) {
listaYakus.add(Yaku.Negro) listaYakus.add(Yaku.Negro)
} }
if (yakuTripleCuadruples(contenedorGrupos)) {
listaYakus.add(Yaku.TripleCuadruples)
}
if (verificarEscalera && yakuEscalera(contenedorGrupos)) { if (verificarEscalera && yakuEscalera(contenedorGrupos)) {
listaYakus.add(Yaku.Escalera) listaYakus.add(Yaku.Escalera)
} }
// 3 puntos // 1 punto
if (yakuDobleSecuenciaPura(contenedorGrupos)) { if (yakuDobleSecuencia(contenedorGrupos)) {
listaYakus.add(Yaku.DobleSecuenciaPura) listaYakus.add(Yaku.DobleSecuencia)
} }
val cantidad = yakuRealeza(contenedorGrupos) val cantidad = yakuRealeza(contenedorGrupos)
if (cantidad > 0) { if (cantidad > 0) {
listaYakus.add(Yaku.Realeza) listaYakus.add(Yaku.Realeza)
} }
if (!esManoAbierta && yakuTripleSecuenciaCerrada(contenedorGrupos)) {
listaYakus.add(Yaku.TripleSecuenciaCerrada)
}
if (verificarTripleTriples && yakuTripleTriples(contenedorGrupos)) { if (verificarTripleTriples && yakuTripleTriples(contenedorGrupos)) {
listaYakus.add(Yaku.TripleTriples) listaYakus.add(Yaku.TripleTriples)
} }
@ -122,9 +123,6 @@ fun obtenerListaYakus(contenedorGrupos: ContenedorGrupos, esManoAbierta: Boolean
if (cantidadDragon > 0) { if (cantidadDragon > 0) {
listaYakus.add(Yaku.Dragones) listaYakus.add(Yaku.Dragones)
} }
if (yakuParUnico(contenedorGrupos)) {
listaYakus.add(Yaku.ParUnico)
}
return listaYakus 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 package dev.araozu.juego.yaku
import dev.araozu.juego.CartaRealeza import dev.araozu.juego.CartaDragon
import dev.araozu.juego.ContenedorGrupos import dev.araozu.juego.ContenedorGrupos
internal fun yakuRealezaDragones(contenedorGrupos: ContenedorGrupos): Boolean { internal fun yakuDragonesFull(contenedorGrupos: ContenedorGrupos): Boolean {
if (contenedorGrupos.tris.size != 3) return false if (contenedorGrupos.tris.size != 3) return false
for (carrl in contenedorGrupos.tris) { for (carrl in contenedorGrupos.tris) {
for (c in carrl) { for (c in carrl) {
if (!c.esDragonORey()) return false if (c !is CartaDragon) return false
} }
} }
for (carrl in contenedorGrupos.pares) { for (carrl in contenedorGrupos.pares) {
for (c in carrl) { for (c in carrl) {
if (!c.esDragonORey()) return false if (c !is CartaDragon) return false
} }
} }
return true return true
} }
internal fun yakuRealezaFull(contenedorGrupos: ContenedorGrupos): Boolean { internal fun yakuVerde(contenedorGrupos: ContenedorGrupos): Boolean {
if (contenedorGrupos.tris.size != 3) return false if (contenedorGrupos.tris.size != 3) return false
for (carrl in contenedorGrupos.tris) { for (carrl in contenedorGrupos.tris) {
for (c in carrl) { 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.CartaNumero
import dev.araozu.juego.ContenedorGrupos import dev.araozu.juego.ContenedorGrupos
internal fun yakuDobleSecuenciaPura(contenedorGrupos: ContenedorGrupos): Boolean {
return false
}
internal fun yakuSemiExterior(contenedorGrupos: ContenedorGrupos): Boolean { internal fun yakuSemiExterior(contenedorGrupos: ContenedorGrupos): Boolean {
for (carrl in contenedorGrupos.seqs) { for (carrl in contenedorGrupos.seqs) {
@ -84,17 +89,6 @@ internal fun yakuNegro(contenedorGrupos: ContenedorGrupos): Boolean {
return true 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 // TODO: Las secuencias pueden no estar en orden
internal fun yakuEscalera(contenedorGrupos: ContenedorGrupos): Boolean { 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.CartaNumero
import dev.araozu.juego.ContenedorGrupos import dev.araozu.juego.ContenedorGrupos
// TODO internal fun yakuExterior(contenedorGrupos: ContenedorGrupos): Boolean {
internal fun yakuDobleSecuenciaPura(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 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 (carrl in contenedorGrupos.pares) {
for (c in carrl) { for (c in carrl) {
if (c !is CartaNumero) return false if (!c.esDragonORey() || c !is CartaNumero || !c.esExterior())
if (c.esExterior()) return false return false
} }
} }
return true return true
} }
// TODO internal fun yakuTripleTriplesCerrados(contenedorGrupos: ContenedorGrupos): Boolean {
internal fun yakuDragones(contenedorGrupos: ContenedorGrupos): Int {
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.CartaNumero
import dev.araozu.juego.ContenedorGrupos 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 // TODO: Las secuencias pueden no estar en orden
internal fun yakuEscaleraFull(contenedorGrupos: ContenedorGrupos): Boolean { internal fun yakuEscaleraFull(contenedorGrupos: ContenedorGrupos): Boolean {
@ -57,4 +37,3 @@ internal fun yakuEscaleraFull(contenedorGrupos: ContenedorGrupos): Boolean {
return true 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
}