Agregada clase para manejar la verificación de Secuencias
This commit is contained in:
parent
8a6c17563a
commit
7dce867e02
59
src/juego/Carta.kt
Normal file
59
src/juego/Carta.kt
Normal 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)
|
@ -3,6 +3,5 @@ package dev.araozu.juego
|
|||||||
interface Oportunidad {
|
interface Oportunidad {
|
||||||
|
|
||||||
val cartaDescartada: Int
|
val cartaDescartada: Int
|
||||||
val cartasOportunidad: ArrayList<Int>
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user