Juego del Ahorcado para consola

Juego del Ahorcado para consola

En esta entrada publicamos una versión muy básica pero funcional del clásico juego de lápiz y papel El Ahorcado para consola. Este código fue escrito hace unos cuantos meses como mero entretenimiento y para familiarizarnos con Kotlin, y quizá este pequeño programa fue el germen de la app para Android que recientemente hemos publicado en F-Droid, aunque más que otra cosa sirvió como idea de proyecto.

Posiblemente el código es muy mejorable, pero quiero igualmente compartir aquí esta versión comentada por si a alguien que está empezando con Kotlin le parece de interés. Además puede servir para repasar conceptos vistos en entradas anteriores.

La dinámica del juego consiste en que un jugador escribe la palabra secreta y otro jugador intenta descubrirla antes de morir en la horca (al tercer error). Para que la palabra secreta no se visualice en pantalla cuando se escribe se utiliza System.console().readPassword("Introduce la palabra secreta: ") lo que obliga a ejecutar el programa desde consola de esta manera (no funciona ejecutando desde IntelliJ IDEA):
kotlinc ahorcado.kt
kotlin AhorcadoKt
/*
 * ahorcado.kt
 * Juego simple 'El Ahorcado' para consola con Kotlin
 * Creado en 2018 para Kotlin Doc
 * Requiere desde consola:
 * 1. compilar con: kotlinc ahorcado.kt
 * 2. ejecutar con: kotlin AhorcadoKt
 */

// caracteres admitidos para palabra y letras
val LETRAS = ('A'..'Z') + 'Ñ'

// mensajes bienvenida y game over
fun escribeMensaje(mensaje: String) {
    for (i in 1..mensaje.length) print("*")
    println("\n$mensaje")
    for (i in 1..mensaje.length) print("*")
    println()
}

// control palabra introducida
fun control(pal: String): Boolean {
    if (pal.length < 3) {
        println("Una palabra de al menos 3 letras. Inténtalo otra vez.")
        return false
    }
    pal.forEach {
        if (it !in LETRAS) {
            println("Palabra no reconocida.")
            return false
        }
    }
    return true
}

// pide y devuelve la palabra secreta
fun getSecreta(): String {
    var enter = ""
    val console = System.console() // val console: Console? = System.console()
    when (console) {
        null -> {
            println("ERROR: No detectada consola. Compila y ejecuta desde consola.")
            System.exit(-1)
        }
        else -> {
            do {
                val pw = console.readPassword("Introduce la palabra secreta: ")
                enter = pw.joinToString("").toUpperCase()
            } while (!control(enter))
        }
    }
    return enter
}

// pide y comprueba la letra
fun inputLetra(): String {
    do {
        print("Una letra: ")
        val letra = readLine().toString().toUpperCase()
        if (letra.length != 1 || letra.single() !in LETRAS) {
            println("Letra no reconocida. Inténtalo otra vez.")
        } else {
            return letra
        }
    } while (true)
}

// INICIO
fun main(args: Array<String>) {
    if (args.isEmpty()) escribeMensaje("BIENVENIDO AL JUEGO DEL AHORCADO")
    val secreta = getSecreta()
    val oculta = Array(secreta.length) { "_" }
    oculta.forEach { print("$it ") }
    println()
    // JUEGO
    val letrasUsadas: MutableList<String> = mutableListOf()
    var error = 0
    var acierto = 0
    do { // bucle de pedir letra (hasta victoria o errores = 3)
        val letra = inputLetra()
        // comprueba si la letra ya se ha utilizado
        if (letrasUsadas.contains(letra)) {
            println("La letra $letra ya la has dicho.")
            print("Letras usadas: ")
            letrasUsadas.forEach { print("$it ") }
            println()
            oculta.forEach { print("$it ") }
            println()
        } else {
            letrasUsadas.add(letra)
            // comprueba si la letra es acierto o error
            if (letra in secreta) { // ACIERTO
                acierto++
                for (index in secreta.indices) {
                    if (letra == secreta[index].toString()) oculta[index] = letra  // oculta.set(index, letra)
                }
                oculta.forEach { print("$it ") }
                println()
                if (secreta == oculta.joinToString(separator = "")) { // if("_" !in oculta) if(oculta.all {it != "_"})
                    println("VICTORIA")
                    break
                }
            } else { // ERROR
                error++
                println("ERROR $error")
                if (error == 3) println("Has muerto en la horca. La palabra era $secreta")
            }
        }
    } while (error < 3)
    otra()
}

fun otra() {
    var otraPartida: String
    do {
        print("¿Otra partida? (S/N): ")
        otraPartida = readLine().toString().toUpperCase()
    } while (otraPartida != "S" && otraPartida != "N")
    if (otraPartida == "S") {
        main(args = arrayOf("otra"))
    } else {
        escribeMensaje("GAME OVER")
    }
}
********************************
BIENVENIDO AL JUEGO DEL AHORCADO
********************************
Introduce la palabra secreta:
_ _ _ _ _ _
Una letra: a
ERROR 1
Una letra: e
_ _ _ E _ _
Una letra: n
_ _ N E _ _
Una letra: i
ERROR 2
Una letra: o
_ O N E _ O
Una letra: e
La letra E ya la has dicho.
Letras usadas: A E N I O
_ O N E _ O
Una letra: c
C O N E _ O
Una letra: j
C O N E J O
VICTORIA
¿Otra partida? (S/N): n
*********
GAME OVER
*********

Comentarios

Entradas populares

I/O: entrada y salida de datos en consola

Recursos gratis para aprender Kotlin

Lectura y escritura de archivos