Cómo crear un juego del ahorcado en Python

Actualizado el: 11/07/2026
Tempo de leitura: 3 minutos
Jogo da forca para iniciantes desenvolvido com Python

El juego del ahorcado es un proyecto clásico para practicar cadenas, conjuntos, bucles, condiciones, selección aleatoria, validación y funciones. El programa elige una palabra secreta, el jugador propone letras y cada error reduce las vidas disponibles.

En esta guía construiremos un juego del ahorcado en Python que evita intentos repetidos, acepta letras o palabras completas, muestra dibujos ASCII, utiliza pistas y separa la lógica en funciones fáciles de probar.

Reglas del juego

  1. El programa selecciona una palabra.
  2. Muestra guiones para las letras ocultas.
  3. El jugador escribe una letra o una palabra completa.
  4. Las letras correctas se revelan en todas sus posiciones.
  5. Los intentos nuevos e incorrectos reducen una vida.
  6. La ronda termina al completar la palabra o perder todas las vidas.

La selección utiliza el módulo random de Python.

Elegir una palabra secreta

import random

PALABRAS = ["python", "variable", "funcion", "iterador", "paquete"]
palabra_secreta = random.choice(PALABRAS)

random.choice() es adecuado porque el juego no protege ningún dato sensible.

Guardar letras en un set

letras_probadas = set()

letras_probadas.add("p")
print("p" in letras_probadas)  # True

Un conjunto mantiene valores únicos y permite detectar repeticiones con una comprobación directa.

Crear la palabra oculta

def palabra_oculta(secreta, letras):
    return " ".join(
        letra if letra in letras else "_"
        for letra in secreta
    )


print(palabra_oculta("python", {"p", "o"}))
# p _ _ _ o _

La función devuelve texto en lugar de imprimirlo. Así puede reutilizarse y probarse.

Comprobar la victoria

def palabra_completa(secreta, letras):
    return all(letra in letras for letra in secreta)

all() devuelve verdadero cuando todas las letras cumplen la condición. Las letras repetidas se revelan automáticamente en todas sus posiciones.

Validar la entrada

def leer_intento():
    while True:
        intento = input(
            "Escribe una letra o la palabra completa: "
        ).strip().lower()

        if not intento:
            print("Escribe una letra o palabra.")
            continue

        if not intento.isalpha():
            print("Utiliza solamente letras.")
            continue

        return intento

isalpha() acepta letras Unicode. Mantén palabras e intentos con la misma normalización.

Evitar intentos repetidos

if intento in letras_probadas:
    print("Ya probaste esa letra.")
    continue

letras_probadas.add(intento)

Un intento repetido no debería restar una vida.

Etapas del dibujo

ETAPAS = [
    """
     +---+
     |   |
         |
         |
         |
         |
    =========
    """,
    """
     +---+
     |   |
     O   |
         |
         |
         |
    =========
    """,
    """
     +---+
     |   |
     O   |
     |   |
         |
         |
    =========
    """,
    """
     +---+
     |   |
     O   |
    /|   |
         |
         |
    =========
    """,
    """
     +---+
     |   |
     O   |
    /|\  |
         |
         |
    =========
    """,
    """
     +---+
     |   |
     O   |
    /|\  |
    /    |
         |
    =========
    """,
    """
     +---+
     |   |
     O   |
    /|\  |
    / \  |
         |
    =========
    """,
]

Con siete etapas, el jugador puede cometer seis errores.

Añadir palabras y pistas

BANCO = [
    {"palabra": "python", "pista": "Lenguaje de programación"},
    {"palabra": "iterador", "pista": "Produce valores uno a uno"},
    {"palabra": "funcion", "pista": "Bloque reutilizable de código"},
    {"palabra": "variable", "pista": "Nombre que se refiere a un valor"},
    {"palabra": "paquete", "pista": "Colección distribuible de módulos"},
]

Código completo

import random

ETAPAS = [
    """
     +---+
     |   |
         |
         |
         |
         |
    =========
    """,
    """
     +---+
     |   |
     O   |
         |
         |
         |
    =========
    """,
    """
     +---+
     |   |
     O   |
     |   |
         |
         |
    =========
    """,
    """
     +---+
     |   |
     O   |
    /|   |
         |
         |
    =========
    """,
    """
     +---+
     |   |
     O   |
    /|\  |
         |
         |
    =========
    """,
    """
     +---+
     |   |
     O   |
    /|\  |
    /    |
         |
    =========
    """,
    """
     +---+
     |   |
     O   |
    /|\  |
    / \  |
         |
    =========
    """,
]

BANCO = [
    {"palabra": "python", "pista": "Lenguaje de programación"},
    {"palabra": "iterador", "pista": "Produce valores uno a uno"},
    {"palabra": "funcion", "pista": "Bloque reutilizable de código"},
    {"palabra": "variable", "pista": "Nombre que se refiere a un valor"},
    {"palabra": "paquete", "pista": "Colección distribuible de módulos"},
]


def palabra_oculta(secreta, letras):
    return " ".join(
        letra if letra in letras else "_"
        for letra in secreta
    )


def palabra_completa(secreta, letras):
    return all(letra in letras for letra in secreta)


def leer_intento():
    while True:
        intento = input(
            "Escribe una letra o la palabra completa: "
        ).strip().lower()

        if not intento:
            print("Escribe una letra o palabra.")
            continue

        if not intento.isalpha():
            print("Utiliza solamente letras.")
            continue

        return intento


def jugar_ronda(generador=None):
    generador = generador or random.Random()
    entrada = generador.choice(BANCO)
    secreta = entrada["palabra"].lower()
    pista = entrada["pista"]
    letras = set()
    palabras = set()
    errores = 0
    max_errores = len(ETAPAS) - 1

    print(f"Pista: {pista}")

    while errores < max_errores:
        print(ETAPAS[errores])
        print(palabra_oculta(secreta, letras))
        print(f"Vidas: {max_errores - errores}")

        if letras:
            print("Letras:", " ".join(sorted(letras)))

        intento = leer_intento()

        if len(intento) == 1:
            if intento in letras:
                print("Ya probaste esa letra.")
                continue

            letras.add(intento)

            if intento in secreta:
                print("¡Letra correcta!")
            else:
                errores += 1
                print("La letra no aparece.")
        else:
            if intento in palabras:
                print("Ya probaste esa palabra.")
                continue

            palabras.add(intento)

            if intento == secreta:
                letras.update(secreta)
            else:
                errores += 1
                print("No es la palabra secreta.")

        if palabra_completa(secreta, letras):
            print(palabra_oculta(secreta, letras))
            print("¡Ganaste!")
            return True

    print(ETAPAS[errores])
    print(f"Perdiste. La palabra era: {secreta}")
    return False


def quiere_repetir():
    while True:
        respuesta = input("¿Jugar otra vez? [s/n]: ").strip().lower()

        if respuesta in {"s", "si", "sí"}:
            return True
        if respuesta in {"n", "no"}:
            return False

        print("Escribe s o n.")


def main():
    print("Juego del ahorcado")

    while True:
        jugar_ronda()

        if not quiere_repetir():
            print("¡Gracias por jugar!")
            break


if __name__ == "__main__":
    main()

Probar las funciones principales

from ahorcado import palabra_completa, palabra_oculta


def test_palabra_oculta():
    resultado = palabra_oculta("letra", {"l", "e", "a"})
    assert resultado == "l e _ _ a"


def test_palabra_completa():
    assert palabra_completa("gato", {"g", "a", "t", "o"}) is True
    assert palabra_completa("gato", {"g", "a"}) is False

Consulta la guía de Pytest en Python para ejecutar pruebas automatizadas.

Cargar palabras desde un archivo

from pathlib import Path


def cargar_palabras(ruta):
    lineas = Path(ruta).read_text(encoding="utf-8").splitlines()
    palabras = [linea.strip().lower() for linea in lineas]
    return [palabra for palabra in palabras if palabra.isalpha()]

Comprueba que la lista no esté vacía antes de usar choice().

Errores frecuentes

  • Restar una vida por una letra repetida.
  • Revelar solamente una posición de una letra repetida.
  • Comparar mayúsculas con minúsculas sin normalización.
  • Aceptar números o signos como intentos.
  • Elegir una palabra de una lista vacía.
  • Colocar toda la lógica dentro de un único bucle.

Ideas para ampliar

  • Añadir categorías y dificultad.
  • Limitar el número de pistas.
  • Guardar victorias y derrotas.
  • Cargar bancos de palabras externos.
  • Crear una versión gráfica con Turtle o Pygame.
  • Añadir opciones de terminal para vidas y categoría.

Conclusión

Un juego del ahorcado en Python combina selección aleatoria, cadenas, conjuntos, validación, bucles, funciones y pruebas. Separar la palabra oculta, la condición de victoria y la lógica de la ronda mantiene el programa claro y fácil de ampliar.

Lectura relacionada

Para comprender mejor cómo se guardan letras únicas y se detectan intentos repetidos, consulta la guía de conjuntos en Python.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    Quiz interativo no terminal desenvolvido com Python
    Proyectos
    Foto de perfil de Leandro Hirt da Academify

    Cómo crear un quiz en Python para la terminal

    Crea un quiz en Python para la terminal con preguntas, validación, puntuación, respuestas mezcladas, repetición, JSON y pruebas.

    Ler mais

    Tempo de leitura: 3 minutos
    11/07/2026
    Jogo de adivinhação de números desenvolvido com Python
    Proyectos
    Foto de perfil de Leandro Hirt da Academify

    Juego de adivinar números en Python

    Crea un juego de adivinar números en Python con niveles, pistas, intentos limitados, validación, repetición y funciones fáciles de probar.

    Ler mais

    Tempo de leitura: 3 minutos
    11/07/2026
    Desenhos para iniciantes usando Turtle em Python
    Proyectos
    Foto de perfil de Leandro Hirt da Academify

    Dibujar con Turtle en Python: guía completa

    Aprende a dibujar con Turtle en Python: movimientos, figuras, colores, eventos del teclado y un proyecto interactivo completo.

    Ler mais

    Tempo de leitura: 4 minutos
    11/07/2026