El Día 003 del reto 100 Días de Python es un juego de Piedra, Papel o Tijera para la línea de comandos. El jugador elige piedra, papel o tijera, y Python elige al azar la jugada del oponente.
Este proyecto introduce dos ideas que aparecen constantemente en los programas reales: el módulo random para generar valores impredecibles y las listas para guardar datos relacionados (en este caso, tres bloques de arte ASCII) de modo que se puedan buscar por número en lugar de duplicarse en una larga cadena de instrucciones if.
Esta guía recorre el código fuente completo del Día 003, explica cómo funciona la lógica de ganar, perder o empatar, y destaca por qué la validación de datos aquí importa más de lo que parece a primera vista.
Descripción del Proyecto
El juego asocia las tres opciones con números:
0para piedra1para papel2para tijera
Una lista guarda las ilustraciones ASCII de esas opciones, indexadas en el mismo orden. Después de convertir a entero un dato válido, el programa muestra ambas selecciones y las compara.
Código Fuente
El proyecto del Día 003 está en day003/main.py, dentro del repositorio 100daysofpython:
import random
def main():
rock = """
______
---' ___)
(____)
(____)
(____)
---._(___)
"""
paper = """
__
/ )
---'' /_______
_________)
__________)
_________)
---.___________)
"""
scissors = """
______
---' ____)___
______)
__________)
(____)
---.__(___)
"""
game_images = [rock, paper, scissors]
print("Welcome to the Rock, Paper, Scissors Game!\n")
print("Type a number to play the game. If you type an invalid number or character, you lose!\n")
print("Rock = 0\nPaper = 1\nScissors = 2\n")
user_choice = input("What do you choose? ")
if user_choice.isdigit() and int(user_choice) in [0, 1, 2]:
user_choice = int(user_choice)
print(game_images[int(user_choice)])
computer_choice = random.randint(0, 2)
print(f"Computer chose: {game_images[computer_choice]}")
if user_choice == 0 and computer_choice == 2:
print("You win!")
elif user_choice == 1 and computer_choice == 0:
print("You win!")
elif user_choice == 2 and computer_choice == 1:
print("You win!")
elif user_choice == computer_choice:
print("It's a draw!")
else:
print("You lose!")
else:
print("You typed an invalid number or character. You lose!")
if __name__ == "__main__":
main()
Cómo Funciona el Programa
Guardar Datos Relacionados en una Lista
game_images = [rock, paper, scissors]
Como rock, paper y scissors están guardados en una lista en el mismo orden que su asociación numérica, el programa puede buscar el arte ASCII correcto con game_images[user_choice] en lugar de escribir una instrucción if distinta para cada opción. Este es uno de los patrones más simples y útiles de Python: cuando los datos se alinean con un conjunto de opciones numeradas, una lista con indexación suele ser más limpia que una larga cadena de condicionales.
Validar los Datos Antes de Usarlos
if user_choice.isdigit() and int(user_choice) in [0, 1, 2]:
Esta línea hace dos verificaciones a la vez:
user_choice.isdigit()confirma que el dato contiene solo dígitos, de modo que convertirlo conint()no haga fallar el programa.int(user_choice) in [0, 1, 2]confirma que el número realmente es una de las opciones válidas.
Sin esta verificación, escribir una letra haría fallar int(user_choice) con un ValueError, y escribir un número como 9 haría fallar game_images[9] con un IndexError, ya que la lista solo tiene tres elementos, indexados del 0 al 2. Validar los datos antes de usarlos es justo lo que previene ambos fallos.
Generar la Jugada de la Computadora
computer_choice = random.randint(0, 2)
random.randint(0, 2) devuelve un número entero aleatorio entre 0 y 2, ambos inclusive, que coincide con la misma asociación 0/1/2 usada para la elección del jugador, de modo que ambos lados de la comparación usan valores idénticos.
Comparar las Dos Elecciones
if user_choice == 0 and computer_choice == 2:
print("You win!")
elif user_choice == 1 and computer_choice == 0:
print("You win!")
elif user_choice == 2 and computer_choice == 1:
print("You win!")
elif user_choice == computer_choice:
print("It's a draw!")
else:
print("You lose!")
Cada condición de victoria revisa un enfrentamiento específico: la piedra (0) vence a la tijera (2), el papel (1) vence a la piedra (0) y la tijera (2) vence al papel (1). Como el empate se verifica de forma explícita antes del else final, todas las demás combinaciones restantes caen con seguridad en “You lose!” sin necesidad de detallar cada enfrentamiento perdedor por separado.
Qué Enseña Este Proyecto
El Día 003 ofrece práctica con:
- Importar y usar el módulo
random - Guardar datos relacionados en una lista y acceder a ellos por índice
- Validar los datos del usuario antes de convertirlos o usarlos
- Expresar las reglas de un juego con una cadena de condiciones
if/elif/else - Usar arte ASCII para mejorar la retroalimentación de un programa de terminal
Ejecutar el Proyecto
git clone https://github.com/victorhugo81/100daysofpython.git
cd 100daysofpython/day003
python main.py
Posibles Siguientes Pasos
Cuando entiendas el código existente, intenta ampliarlo:
- Registra e imprime una puntuación acumulada a lo largo de varias rondas en lugar de salir después de una
- Deja que el jugador escriba
rock,paperoscissorsen lugar de aceptar solo números - Reorganiza las condiciones de victoria en una sola regla, como revisar
(user_choice - computer_choice) % 3 == 1 - Agrega un modo de “mejor de 5” usando un ciclo
Conclusión
El Día 003 del reto 100 Días de Python combina el módulo random, la indexación de listas y la validación de datos en un juego pequeño pero completo. La validación de datos es fácil de pasar por alto, pero es justo lo que evita que el programa falle ante datos incorrectos, un hábito que vale la pena llevar a todos tus proyectos de aquí en adelante.
Consulta el código fuente del Día 003 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.
