El Día 005 del reto 100 Días de Python es un Juego de Adivinar el Número para la terminal. Python elige un número secreto del 1 al 100 y el jugador sigue intentando hasta encontrarlo o abandonar.
Este proyecto introduce los ciclos while, la herramienta que usas cuando no sabes de antemano cuántas veces debe repetirse algo. A diferencia de los ciclos for de los días anteriores, que se ejecutan un número fijo de veces, este juego necesita seguir pidiendo intentos de forma indefinida, hasta que el jugador acierte o decida salir. También combina ese ciclo con el manejo de errores try/except, para que un solo dato incorrecto no haga fallar todo el juego.
Esta guía recorre el código fuente completo del Día 005 y explica cómo trabajan juntos el ciclo, las comparaciones y el manejo de errores.
Descripción del Proyecto
El número secreto se genera una sola vez, antes de que comience el ciclo del juego:
secret_number = random.randint(1, 100)
Un ciclo while True mantiene el juego en marcha indefinidamente. En cada intento se revisa si es el comando especial q, se convierte a entero dentro de un bloque try y se compara con el número secreto. El programa indica si el intento es demasiado bajo o demasiado alto, y un contador attempts aumenta solo después de un intento numérico válido.
Código Fuente
El proyecto del Día 005 está en day005/main.py, dentro del repositorio 100daysofpython:
import random
trophy = """
* * * * * * * * * * * * * * *
* ___________ *
* '._==_==_=_.' *
* .-\: /-. *
* | (|:. |) | *
* '-|:. |-' *
* \::. / *
* '::. .' *
* ) ( *
* _.' '._ *
* * * * * * * * * * * * * * *
"""
def number_guessing_game():
secret_number = random.randint(1, 100)
attempts = 0
print("Welcome to the Number Guessing Game!")
print("Pick a number between 1 and 100. Try to guess it!")
while True:
print("**********************************************")
guess = input("Enter your guess (or 'q' to quit): ")
if guess.lower() == 'q':
print(f"Thanks for playing! The number was {secret_number}.")
break
try:
guess = int(guess)
attempts += 1
if guess < secret_number:
print(" - Your guessed number is too low! Try again.")
elif guess > secret_number:
print(" - Your guessed number is too high! Try again.")
else:
print(f" - Congratulations! You guessed it in {attempts} attempts.")
print(trophy)
break
except ValueError:
print(" - Please enter a valid number or 'q' to quit.")
if __name__ == "__main__":
number_guessing_game()
Cómo Funciona el Programa
Un Ciclo Infinito con Dos Salidas
while True:
...
while True crea un ciclo que normalmente se ejecutaría para siempre, ya que su condición siempre es verdadera. El ciclo solo termina mediante una instrucción break explícita, y este juego tiene dos: una cuando el jugador escribe q para salir y otra cuando el jugador acierta. Cualquier otro resultado regresa al inicio del ciclo para pedir otro intento.
Dejar que el Jugador Salga en Cualquier Momento
if guess.lower() == 'q':
print(f"Thanks for playing! The number was {secret_number}.")
break
Revisar si es 'q' antes de intentar convertir el intento a número significa que salir nunca arriesga hacer fallar el programa: esta verificación ocurre primero, antes de intentar cualquier conversión numérica.
Manejar Datos Inválidos con try/except
try:
guess = int(guess)
...
except ValueError:
print(" - Please enter a valid number or 'q' to quit.")
Si el jugador escribe algo que no es un número y no es 'q', como "banana", int(guess) lanza un ValueError. En lugar de dejar que ese error haga fallar el programa, el bloque except ValueError: lo captura e imprime un mensaje útil, y el ciclo simplemente pide otro intento. Es una alternativa mucho más amigable que validar el dato antes con .isdigit(), ya que deja que el propio manejo de errores de Python haga el trabajo.
Llevar la Cuenta de Intentos y Comparar la Suposición
attempts += 1
if guess < secret_number:
print(" - Your guessed number is too low! Try again.")
elif guess > secret_number:
print(" - Your guessed number is too high! Try again.")
else:
print(f" - Congratulations! You guessed it in {attempts} attempts.")
print(trophy)
break
Observa que attempts += 1 solo se ejecuta dentro del bloque try, después de una conversión exitosa, de modo que los intentos inválidos como "banana" no cuentan en el total de intentos del jugador. Solo los intentos numéricos reales aumentan el contador.
Qué Enseña Este Proyecto
El Día 005 combina:
- Ciclos
whilepara repetir un número desconocido de veces breakpara salir de un ciclo desde varias condiciones distintastry/exceptpara manejar con elegancia los datos inválidos- Una variable contador que se actualiza de forma condicional, no en cada iteración del ciclo
- Operadores de comparación para dar al jugador retroalimentación de “demasiado alto” o “demasiado bajo”
Ejecutar el Proyecto
git clone https://github.com/victorhugo81/100daysofpython.git
cd 100daysofpython/day005
python main.py
Posibles Siguientes Pasos
Cuando entiendas el código existente, intenta ampliarlo:
- Limita al jugador a un número fijo de intentos y termina el juego si se le acaban
- Agrega niveles de dificultad que cambien el rango de números (por ejemplo, 1–50 para fácil y 1–500 para difícil)
- Registra y muestra la mejor puntuación (menos intentos) a lo largo de varias partidas usando un ciclo alrededor de
number_guessing_game() - Da una pista de “más caliente/más frío” según qué tan cerca estuvo el intento anterior
Conclusión
El Día 005 del reto 100 Días de Python muestra cómo un ciclo while True, combinado con break y try/except, puede construir un juego realmente jugable que maneja con elegancia tanto las respuestas correctas como los datos incorrectos. El patrón de repetir hasta que se cumpla una condición de salida explícita, en lugar de un número fijo de veces, es uno que usarás constantemente cuando empieces a construir programas que respondan al comportamiento real de los usuarios.
Consulta el código fuente del Día 005 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.
