poker.kt 5.64 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
package codigos

/************Data class es una clase especial de KOTLIN que
 * te abstrae de los getters y setters o implementa automaticamente**/
data class CartaJugada(val valor: Char, val palo: Char)

fun main() {
    val jugada = arrayListOf<CartaJugada>()
    println("Leer Jugada: ")

    var CartaJugadasMesa : String
    do {
        CartaJugadasMesa = readLine()!!.toString().toUpperCase()
    }while (Valido(CartaJugadasMesa))


    /*********Analiza Jugada************/
    jugada.add(CartaJugada(valor = CartaJugadasMesa[0], palo = CartaJugadasMesa[1]))
    jugada.add(CartaJugada(valor = CartaJugadasMesa[2], palo = CartaJugadasMesa[3]))
    jugada.add(CartaJugada(valor = CartaJugadasMesa[4], palo = CartaJugadasMesa[5]))
    jugada.add(CartaJugada(valor = CartaJugadasMesa[6], palo = CartaJugadasMesa[7]))
    jugada.add(CartaJugada(valor = CartaJugadasMesa[8], palo = CartaJugadasMesa[9]))

    val jugadaOrdenada = jugada.sortedWith(compareBy {it.valor})
    print("JUGADA REALIZADA ${jugadaOrdenada[0].valor}${jugadaOrdenada[0].palo} ${jugadaOrdenada[1].valor}${jugadaOrdenada[1].palo} ${jugadaOrdenada[2].valor}${jugadaOrdenada[2].palo} ${jugadaOrdenada[3].valor}${jugadaOrdenada[3].palo} ${jugadaOrdenada[4].valor}${jugadaOrdenada[4].palo}")

    println(" es un/a ${analizaJugadaOrdenada(jugadaOrdenada)}")


}

fun Valido(CartaJugadasMesa : String) : Boolean{
    var result  = true


    if (CartaJugadasMesa.length == 10 && !encuentraRepetidos(CartaJugadasMesa)) {
        for (indice in 1..9 step 2) {
            result = !( CartaJugadasMesa[indice] == Const.PALOS[0] ||
                    CartaJugadasMesa[indice] == Const.PALOS[1] ||
                    CartaJugadasMesa[indice] == Const.PALOS[2] ||
                    CartaJugadasMesa[indice] == Const.PALOS[3])
        }

    }else {
        println("INVALIDO.\nIngrese de nuevo: ")
    }

    return result
}
fun encuentraRepetidos(cartasMesa: String) : Boolean{
    var mantieneCorrecto = false
    for (caracteres in 0..4 step 2){
        for (caracteresRepite in caracteres+2..8 step 2){
54 55
            if ((cartasMesa[caracteres] == cartasMesa[caracteresRepite]) &&
                (cartasMesa[caracteres+1] == cartasMesa[caracteresRepite+1])){
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
                mantieneCorrecto = true
            }
        }
    }
    return mantieneCorrecto
}

fun analizaJugadaOrdenada(jugadaOrdenada : List<CartaJugada>): String{

    var palosJugados = arrayOf(0,0,0,0)
    var valoresJugados = arrayOf(0,0,0,0,0,0,0,0,0,0,0,0,0)
    var result: String = "NADA"

    for (palos in jugadaOrdenada){
        when(palos.palo){
            'S' -> palosJugados[0]++
            'C' -> palosJugados[1]++
            'D' -> palosJugados[2]++
            'H' -> palosJugados[3]++
        }
    }
    for (valores in jugadaOrdenada){
        when(valores.valor){
            'A' -> valoresJugados[0]++
            '2' -> valoresJugados[1]++
            '3' -> valoresJugados[2]++
            '4' -> valoresJugados[3]++
            '5' -> valoresJugados[4]++
            '6' -> valoresJugados[5]++
            '7' -> valoresJugados[6]++
            '8' -> valoresJugados[7]++
            '9' -> valoresJugados[8]++
            'T' -> valoresJugados[9]++
            'J' -> valoresJugados[10]++
            'Q' -> valoresJugados[11]++
            'K' -> valoresJugados[12]++
        }
    }
94
var noEsColor =true
95 96 97
    for (palo in palosJugados){
        if (palo == 5){
            result = "COLOR"
98
            noEsColor = false
99 100 101 102 103 104 105 106 107
            for (position in valoresJugados.indices){
                result = if (position < 9){
                    if (1 == valoresJugados[position] && 1 == valoresJugados[position+1] && 1 == valoresJugados[position+2] && 1 == valoresJugados[position+3] && 1 == valoresJugados[position+4]) "ESCALERA COLOR" else continue
                }else if (position == 9){
                    if (1 == valoresJugados[position] && 1 == valoresJugados[position+1] && 1 == valoresJugados[position+2] && 1 == valoresJugados[position+3] && 1 == valoresJugados[0]) "ESCALERA COLOR REAL" else break
                }else break
            }
        }
    } // Jugadas posibles para 5 palos iguales
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
    if (noEsColor) {
        var tieneTrio = false
        var cantDobles = 0

        for (position in valoresJugados.indices) {
            if (valoresJugados[position] == 4) {
                result = "POKER"
                break
            } else if (valoresJugados[position] == 1 && position <= 9) {
                if (position < 9) {
                    if (1 == valoresJugados[position] && 1 == valoresJugados[position + 1] && 1 == valoresJugados[position + 2] && 1 == valoresJugados[position + 3] && 1 == valoresJugados[position + 4]) {
                        result = "ESCALERA"
                        break
                    } else {
                        continue
                    }
124
                } else if (position == 9) {
125 126 127 128
                    if (1 == valoresJugados[position] && 1 == valoresJugados[position + 1] && 1 == valoresJugados[position + 2] && 1 == valoresJugados[position + 3] && 1 == valoresJugados[0]) {
                        result = "ESCALERA  FIGURAS"
                        break
                    } else break
129 130
                } else break
            } // Controla para ESCALERA
131 132 133 134 135 136 137 138 139
            else {
                if (valoresJugados[position] == 3) tieneTrio = true
                if (valoresJugados[position] == 2) cantDobles++
                result = if ((cantDobles == 1) && tieneTrio) "FULL"
                else if ((cantDobles == 0) && tieneTrio) "TRIO"
                else if (cantDobles == 1) "PAREJA"
                else if (cantDobles == 2) "PAREJA DOBLE"
                else "CARTA ALTA"
            }
140 141 142 143
        }
    }
    return result
}