From 65a792015ba6df853ea7e1b417389f541a855e31 Mon Sep 17 00:00:00 2001 From: Araozu Date: Wed, 21 Oct 2020 07:38:57 -0500 Subject: [PATCH] Terminadas funciones en yaku5.kt --- src/juego/Carta.kt | 2 ++ src/juego/yaku/Yaku.kt | 7 ++++-- src/juego/yaku/yaku10.kt | 6 +---- src/juego/yaku/yaku15.kt | 12 ++-------- src/juego/yaku/yaku5.kt | 49 ++++++++++++++++++++++++++++++++++++---- 5 files changed, 55 insertions(+), 21 deletions(-) diff --git a/src/juego/Carta.kt b/src/juego/Carta.kt index a49cd25..c039e8e 100644 --- a/src/juego/Carta.kt +++ b/src/juego/Carta.kt @@ -81,6 +81,8 @@ sealed class CartaNumero(valor: Int, val numero: Int = (valor shl 27) ushr 28) : } } + fun esExterior() = numero == 1 || numero == 10 + } class CartaNumeroNegro(valor: Int) : CartaNumero(valor) diff --git a/src/juego/yaku/Yaku.kt b/src/juego/yaku/Yaku.kt index 8c3889f..30c2779 100644 --- a/src/juego/yaku/Yaku.kt +++ b/src/juego/yaku/Yaku.kt @@ -32,8 +32,11 @@ enum class Yaku { fun Yaku.obtenerListaYakus(contenedorGrupos: ContenedorGrupos): ArrayList { val listaYakus = ArrayList() - // Invariante: 3 sequencias/triples/cuadruples y 1 par - if (contenedorGrupos.seqs.size + contenedorGrupos.tris.size != 3 || contenedorGrupos.pares.size != 1) { + // Invariante: 3 sequencias/triples/cuadruples, 1 par y ningun huerfano + if (contenedorGrupos.seqs.size + contenedorGrupos.tris.size != 3 + || contenedorGrupos.pares.size != 1 + || contenedorGrupos.huerfanos.size != 0 + ) { throw Error("Error de invariante: Se intento verificar los yakus de un contenedor invalido.") } diff --git a/src/juego/yaku/yaku10.kt b/src/juego/yaku/yaku10.kt index 557f52f..601dd00 100644 --- a/src/juego/yaku/yaku10.kt +++ b/src/juego/yaku/yaku10.kt @@ -5,11 +5,7 @@ import dev.araozu.juego.ContenedorGrupos internal fun yakuRealezaDragones(contenedorGrupos: ContenedorGrupos): Boolean { - for (carrl in contenedorGrupos.seqs) { - for (c in carrl) { - if (!c.esDragonORey()) return false - } - } + if (contenedorGrupos.tris.size != 3) return false for (carrl in contenedorGrupos.tris) { for (c in carrl) { diff --git a/src/juego/yaku/yaku15.kt b/src/juego/yaku/yaku15.kt index d5a8cd1..e1c2ae7 100644 --- a/src/juego/yaku/yaku15.kt +++ b/src/juego/yaku/yaku15.kt @@ -5,11 +5,7 @@ import dev.araozu.juego.ContenedorGrupos internal fun yakuDragonesFull(contenedorGrupos: ContenedorGrupos): Boolean { - for (carrl in contenedorGrupos.seqs) { - for (c in carrl) { - if (c !is CartaDragon) return false - } - } + if (contenedorGrupos.tris.size != 3) return false for (carrl in contenedorGrupos.tris) { for (c in carrl) { @@ -28,11 +24,7 @@ internal fun yakuDragonesFull(contenedorGrupos: ContenedorGrupos): Boolean { internal fun yakuVerde(contenedorGrupos: ContenedorGrupos): Boolean { - for (carrl in contenedorGrupos.seqs) { - for (c in carrl) { - if (!c.esCartaVerde()) return false - } - } + if (contenedorGrupos.tris.size != 3) return false for (carrl in contenedorGrupos.tris) { for (c in carrl) { diff --git a/src/juego/yaku/yaku5.kt b/src/juego/yaku/yaku5.kt index 3b2356e..5f22c52 100644 --- a/src/juego/yaku/yaku5.kt +++ b/src/juego/yaku/yaku5.kt @@ -1,18 +1,59 @@ package dev.araozu.juego.yaku +import dev.araozu.juego.CartaNumero import dev.araozu.juego.ContenedorGrupos +// TODO: Cambiar descripcion en la pagina web internal fun yakuExterior(contenedorGrupos: ContenedorGrupos): Boolean { - return false + 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 } internal fun yakuEscaleraFull(contenedorGrupos: ContenedorGrupos): Boolean { - return false -} + if (contenedorGrupos.seqs.size != 3) return false -internal fun yakuTripleTriplesCerrados(contenedorGrupos: ContenedorGrupos): Boolean { + var numeroInicialSemiEscalera = 0 + for (carrl in contenedorGrupos.pares) { + for (c in carrl) { + if (c !is CartaNumero) return false + + numeroInicialSemiEscalera = when (c.numero) { + 1 -> 2 + 10 -> 1 + else -> return false + } + } + } + + for (carrl in contenedorGrupos.seqs) { + for (c in carrl) { + if (c !is CartaNumero) return false + + if (c.numero != numeroInicialSemiEscalera) return false + + numeroInicialSemiEscalera += 1 + } + } return false } + +internal fun yakuTripleTriplesCerrados(contenedorGrupos: ContenedorGrupos) = + contenedorGrupos.tris.size == 3