Agregada clase para manejar la verificación de Secuencias

master
Araozu 2020-10-05 20:15:54 -05:00
parent 8a6c17563a
commit 7dce867e02
4 changed files with 101 additions and 4 deletions

59
src/juego/Carta.kt Normal file
View File

@ -0,0 +1,59 @@
package dev.araozu.juego
import kotlin.reflect.KClass
sealed class Carta(private val valor: Int) {
companion object {
fun obtenerCartaEspecifica(valor: Int): Carta {
return when (valor) {
in 2..21 -> CartaNumeroNegro(valor)
in 34..53 -> CartaNumeroRojo(valor)
64 -> CartaDragonNegro()
96 -> CartaDragonRojo()
128 -> CartaDragonVerde()
160 -> CartaDragonAzul()
192 -> CartaRealezaJ()
224 -> CartaRealezaQ()
256 -> CartaRealezaK()
else -> {
throw IllegalArgumentException("Valor de carta ilegal.")
}
}
}
/**
* Filtra un array list de cartas segun su tipo de clase. El parámetro T debe ser la misma clase
* que el parametro clase, o su clase padre.
* @param valores El ArrayList del cual se filtrará
* @param clase La clase que determina el filtro
*/
fun <T: Carta> filtrarCartas(valores: ArrayList<Int>, clase: KClass<out Carta>): ArrayList<T> {
val arrl = arrayListOf<T>()
valores.forEach {
val carta = obtenerCartaEspecifica(it)
if (carta::class == clase) arrl.add(carta as T)
}
return arrl
}
}
}
sealed class CartaNumero(valor: Int, val numero: Int = (valor shl 27) ushr 28) : Carta(valor)
class CartaNumeroNegro(valor: Int) : CartaNumero(valor)
class CartaNumeroRojo(valor: Int) : CartaNumero(valor)
sealed class CartaDragon(valor: Int) : Carta(valor)
class CartaDragonNegro : CartaDragon(64)
class CartaDragonRojo : CartaDragon(96)
class CartaDragonVerde : CartaDragon(128)
class CartaDragonAzul : CartaDragon(160)
sealed class CartaRealeza(valor: Int) : Carta(valor)
class CartaRealezaJ : CartaRealeza(192)
class CartaRealezaQ : CartaRealeza(224)
class CartaRealezaK : CartaRealeza(256)

View File

@ -3,6 +3,5 @@ package dev.araozu.juego
interface Oportunidad { interface Oportunidad {
val cartaDescartada: Int val cartaDescartada: Int
val cartasOportunidad: ArrayList<Int>
} }

View File

@ -1,4 +1,43 @@
package dev.araozu.juego package dev.araozu.juego
data class OportunidadSeq(override val cartaDescartada: Int, override val cartasOportunidad: ArrayList<Int>) : data class OportunidadSeq(override val cartaDescartada: Int, val combinaciones: ArrayList<Pair<Int, Int>>) :
Oportunidad Oportunidad {
companion object {
private fun arrlCartasContiene(arrl: ArrayList<CartaNumero>, v1: Int, v2: Int): Pair<Int, Int>? {
var v1E: Int? = null
var v2E: Int? = null
for (c in arrl) {
if (c.numero == v1) v1E = c.numero
if (c.numero == v2) v2E = c.numero
if (v1E != null && v2E != null) return Pair(v1E, v2E)
}
return null
}
fun verificar(valorCarta: Int, cartasMano: ArrayList<Int>): OportunidadSeq? {
return when (val carta = Carta.obtenerCartaEspecifica(valorCarta)) {
is CartaNumero -> {
val valor = carta.numero
val cartasFiltradas = Carta.filtrarCartas<CartaNumero>(cartasMano, carta::class)
val arrlRetorno = arrayListOf<Pair<Int, Int>>()
val seq1 = arrlCartasContiene(cartasFiltradas, valor + 1, valor + 2)
if (seq1 != null) arrlRetorno.add(seq1)
val seq2 = arrlCartasContiene(cartasFiltradas, valor - 1, valor + 1)
if (seq2 != null) arrlRetorno.add(seq2)
val seq3 = arrlCartasContiene(cartasFiltradas, valor - 1, valor - 2)
if (seq3 != null) arrlRetorno.add(seq3)
return if (arrlRetorno.isNotEmpty()) OportunidadSeq(valorCarta, arrlRetorno) else null
}
else -> null
}
}
}
}

View File

@ -1,4 +1,4 @@
package dev.araozu.juego package dev.araozu.juego
data class OportunidadTri(override val cartaDescartada: Int, override val cartasOportunidad: ArrayList<Int>) : data class OportunidadTri(override val cartaDescartada: Int) :
Oportunidad Oportunidad