Juego de Las Siete y media en consola

Juego Las Siete y media en consola

En esta entrada se publica una versión simple pero funcional del juego de cartas Las Siete y media para jugar en consola (es posible que más adelante publiquemos la versión gráfica y más completa para Android).

El usuario juega contra el ordenador, que siempre es la banca, con una baraja española de 40 cartas. Primero el jugador va pidiendo carta hasta que se planta con la puntuación al descubierto (o se pasa y entonces pierde); después la banca empezará a sacar cartas intentando mejorar o igualar la puntuación del jugador (se ha establecido un modo agresivo de juego para que la banca siempre intente igualar o superar la puntuación del jugador).

Este ejemplo sirve para ilustrar y repasar varios conceptos vistos en entradas previas relativos, entre otros, a las estructuras condicionales y de repetición, las clases, las funciones, las colecciones y la entrada y salida de datos en consola. Además, como veremos más adelante cuando hablemos de las corrutinas en Kotlin (kotlinx.coroutines), se utiliza Thread.sleep(2000L) para bloquear el hilo principal del programa durante 2 segundos cada vez que la banca saca una nueva carta.
/*
 * Juego 'Las Siete y Media' para consola con Kotlin
 * Creado en junio de 2019 para Kotlin Doc
 */

enum class Palo { OROS, BASTOS, ESPADAS, COPAS }

data class Carta(val palo: Palo, val puntos: Float, val valor: String)

val baraja = mutableListOf<Carta>()

class Juego {

    var valorTotal: Float = 0.0F

    fun sacarCarta(): Carta {
        val paloCarta = Palo.values().random()
        val valorRandom = (1..10).random()
        val puntosCartas = if (valorRandom in 1..7) valorRandom.toFloat() else 0.5F
        val valorCarta: String = when (valorRandom) {
            in 1..7 -> valorRandom.toString()
            8 -> "SOTA"
            9 -> "CABALLO"
            else -> "REY"
        }
        val carta = Carta(paloCarta, puntosCartas, valorCarta)
        if (carta in baraja) {
            sacarCarta()
        } else {
            baraja.add(carta)
            valorTotal += puntosCartas
            println("CARTA: ${carta.valor} de ${carta.palo}")
            println("PUNTOS: $valorTotal")
        }
        return carta
    }
}

fun main() {
    println("\nTU TURNO")
    val juego = Juego()
    juego.sacarCarta()
    do {
        if (otra("¿Otra carta? (S/N): ")) {
            juego.sacarCarta()
            if (checkPasado(juego.valorTotal)) break
        } else {
            println("TE HAS PLANTADO CON ${juego.valorTotal} PUNTOS")
            turnoBanca(juego.valorTotal)
            break
        }
    } while (true)

    if (otra("¿Otra partida? (S/N): ")) {
        baraja.clear()
        main()
    } else {
        println("GAME OVER")
    }
}

fun turnoBanca(valorJugador: Float) {
    println("\nTURNO DE LA BANCA\n")
    val juegoBanca = Juego()
    while (juegoBanca.valorTotal < valorJugador) {
        Thread.sleep(2000L)
        juegoBanca.sacarCarta()
    }
    if (juegoBanca.valorTotal > 7.5) {
        println("LA BANCA SE HA PASADO. HAS GANADO.")
    } else {
        println("LA BANCA SE PLANTA CON ${juegoBanca.valorTotal} PUNTOS.\nHAS PERDIDO.")
    }
}

fun checkPasado(sumaTotal: Float): Boolean {
    return if (sumaTotal > 7.5) {
        println("TE HAS PASADO. HAS PERDIDO.")
        true
    } else false
}

fun otra(mensaje: String): Boolean {
    do {
        print("\n$mensaje")
        val respuesta = readLine()
        when (respuesta) {
            "S", "s" -> return true
            "N", "n" -> return false
        }
    } while (true)
}
TU TURNO
CARTA: CABALLO de BASTOS
PUNTOS: 0.5

¿Otra carta? (S/N): s
CARTA: 1 de ESPADAS
PUNTOS: 1.5

¿Otra carta? (S/N): s
CARTA: 4 de COPAS
PUNTOS: 5.5

¿Otra carta? (S/N): n
TE HAS PLANTADO CON 5.5 PUNTOS

TURNO DE LA BANCA

CARTA: 3 de COPAS
PUNTOS: 3.0
CARTA: 5 de BASTOS
PUNTOS: 8.0
LA BANCA SE HA PASADO. HAS GANADO.

¿Otra partida? (S/N): n
GAME OVER

Comentarios

Entradas populares

Recursos gratis para aprender Kotlin

I/O: entrada y salida de datos en consola

Lectura y escritura de archivos