El Día 002 del reto 100 Días de Python convierte los condicionales de Python en una pequeña aventura de texto: el Escape de la Pirámide. El jugador debe resolver un acertijo, elegir un camino y seleccionar la puerta segura para encontrar el tesoro.

Mientras que el Día 001 se enfocó en números y matemáticas, el Día 002 pasa a la toma de decisiones: las instrucciones if, elif y else que permiten que un programa reaccione de forma distinta según lo que escriba el usuario. Anidar esos condicionales unos dentro de otros es exactamente cómo este proyecto construye una historia ramificada, y es un patrón que reutilizarás constantemente cuando pases a programas más complejos.

Esta guía desglosa el código fuente completo del Día 002, explica cómo los condicionales anidados controlan la historia y señala un par de casos límite que vale la pena notar en la lógica original.

Descripción del Proyecto

El juego comienza con un acertijo sobre un teclado. Una respuesta correcta abre una cámara oculta con dos caminos. Elegir el camino de la izquierda lleva a tres puertas de colores: roja, amarilla y azul.

  • Puerta roja: una habitación llena de fuego; el jugador pierde.
  • Puerta amarilla: el tesoro; el jugador gana.
  • Puerta azul: una habitación llena de bestias.

El programa usa input().lower() para que las respuestas del jugador se comparen de manera consistente aunque cambien las mayúsculas. Los bloques anidados de if, elif y else representan la historia ramificada.

El Árbol de Decisiones

Acertijo: ¿keyboard?
  Sí -> elegir izquierda o derecha
    Izquierda -> elegir roja, amarilla o azul
      Roja     -> habitación de fuego, fin del juego
      Amarilla -> tesoro, ganas
      Azul     -> habitación de bestias
    Derecha -> (no hay resultado definido)
  No -> mensaje "Wrong answer"

Código Fuente

El proyecto del Día 002 está en day002/main.py, dentro del repositorio 100daysofpython. La lógica principal, con los bloques grandes de arte ASCII recortados para facilitar la lectura aquí (consulta el enlace anterior para ver el arte completo):

def main():

    # ASCII art title screen (trimmed here — see the repo for the full art)
    print('''...pyramid title art...''')

    print("Welcome to The Pyramid Escape Room.")
    print("Your mission is to find your way out and discover the treasure.\n")
    print("You walk into a room and realize you are inside a pyramid.")
    print("There are two signs on the wall and a door in front of you.\n")
    print('"Choose the right answer only. Wrong answers will end your game."')
    print("*****************************************************************\n")

    # FIRST DECISION (RIDDLE)
    print("First Choice - The Riddle:")
    print("I have keys but no locks,")
    print("I have space but no room,")
    print("You can enter, but you can't go outside.")
    print("What am I?\n")

    choice1 = input("Your answer: ").lower()
    if choice1 == "keyboard":
        print("\nCorrect! A hidden door opens.")

        # SECOND DECISION (PATH)
        print("\nInside the chamber you see two paths: left and right.")
        choice2 = input("Which way do you go? (left/right): ").lower()
        if choice2 == "left":
            print("\nYou walk down the left path and find three color doors.")
            print("Only one is safe!\n")

            # THIRD DECISION (DOORS)
            choice3 = input("Choose a door: red, yellow, or blue: ").lower()
            if choice3 == "red":
                print("\nIt's a room full of fire!")
                print(you_lost)
            elif choice3 == "yellow":
                print("\nYou found the treasure! You Win!")
                print(treasure_reward)
            elif choice3 == "blue":
                print("\nYou enter a room of beasts!")
                print(the_beast)
            else:
                print("\nWrong door. The floor collapses.")
                print(you_lost)
    else:
        print("\nWrong answer. The floor collapses.")
        print(you_lost)


if __name__ == "__main__":
    main()

El archivo completo también define tres cadenas grandes entre comillas triples (treasure_reward, you_lost y the_beast), cada una con arte ASCII que se imprime en el final correspondiente. Consulta el código completo en GitHub para ver todo el arte.

Cómo Funciona el Programa

Los Condicionales Anidados Modelan la Historia

Cada decisión está anidada dentro del bloque if de la anterior, así que una elección solo se vuelve alcanzable una vez que se han cumplido todas las condiciones previas. Si el jugador responde mal el acertijo, ni siquiera llega a ver la elección de puertas: el else del nivel más externo termina el juego de inmediato.

Normalizar los Datos con .lower()

choice1 = input("Your answer: ").lower()

Llamar a .lower() sobre el resultado de input() significa que "Keyboard", "KEYBOARD" y "keyboard" se tratan de forma idéntica, ya que la comparación (choice1 == "keyboard") solo se hace contra una cadena en minúsculas.

Las Cadenas Grandes También Sirven de Escenografía

Asignar el arte ASCII a variables como treasure_reward y the_beast mantiene legible la lógica de ramificación: el bloque if/elif/else se enfoca en la estructura de la historia, mientras que el detalle visual vive aparte y se imprime solo cuando se llega a ese final.

Un Caso Límite que Vale la Pena Notar

Observa con atención la segunda decisión: el código solo maneja choice2 == "left". Si el jugador escribe "right", una de las dos opciones que el propio juego sugiere, no pasa nada. El programa llega al final del bloque if choice1 == "keyboard": y simplemente termina sin ningún mensaje.

Este es un gran ejemplo de por qué importa probar cada rama de tu propia lógica condicional, no solo el “camino feliz”. Una solución apta para principiantes sería agregar un else para choice2 que imprima su propio final, de modo que cada opción documentada realmente lleve a algún lado.

Qué Enseña Este Proyecto

El Día 002 demuestra:

  • Instrucciones condicionales (if, elif, else)
  • Condiciones anidadas que representan decisiones de varios pasos
  • Normalización de cadenas con .lower()
  • Leer y responder a los datos del usuario
  • Diseñar un árbol de decisiones simple para un juego de texto

Ejecutar el Proyecto

git clone https://github.com/victorhugo81/100daysofpython.git
cd 100daysofpython/day002
python main.py

Posibles Siguientes Pasos

El propio README del proyecto original sugiere mover cada escena a una función y validar con más claridad las opciones aceptadas, lo que haría más fácil ampliar la historia sin código profundamente anidado. Algunas otras mejoras aptas para principiantes:

  • Agrega una rama else para choice2 de modo que elegir “right” lleve a su propio final en lugar de salir en silencio
  • Deja que el jugador vuelva a jugar con un ciclo en lugar de salir después de un solo intento
  • Registra y muestra cuántos intentos tomó encontrar el tesoro
  • Agrega un sistema de pistas si el jugador responde mal el acertijo más de una vez

Conclusión

El Día 002 del reto 100 Días de Python convierte la lógica básica de if/elif/else en una aventura de texto interactiva, mostrando cómo los condicionales anidados pueden modelar una historia ramificada una decisión a la vez. También deja una lección valiosa más allá de la sintaxis: incluso un programa pequeño que funciona puede tener ramas sin probar, justo el tipo de cosa que detecta una prueba cuidadosa.

Consulta el código fuente del Día 002 en GitHub y sigue explorando el índice de proyectos del repositorio mientras construyes más programas en Python, un día y un proyecto pequeño a la vez.