Juego de adivinanza de números
Introducción
Los juegos son una excelente manera de poner en práctica los conocimientos de programación mientras nos divertimos. Entre los proyectos más clásicos para principiantes se encuentra el juego de adivinanza de números, donde el ordenador genera un número aleatorio y el jugador debe intentar adivinarlo con el menor número de intentos posible. Este proyecto nos permite aplicar conceptos fundamentales de Python como bucles, condicionales, generación de números aleatorios y entrada/salida de usuario.
En este artículo, crearemos paso a paso un juego de adivinanza de números que no solo será entretenido, sino que también servirá como una excelente práctica para consolidar varios conceptos que hemos aprendido hasta ahora en nuestro recorrido por Python.
Conceptos previos necesarios
Para desarrollar este juego, utilizaremos los siguientes conceptos de Python:
- Generación de números aleatorios con el módulo
random
- Bucles
while
para mantener el juego en ejecución - Estructuras condicionales
if-elif-else
para evaluar las respuestas - Entrada de usuario con
input()
y conversión de tipos - Funciones para organizar el código
Implementación básica del juego
Comencemos con una versión básica del juego:
import random
def jugar_adivinanza():
# Generamos un número aleatorio entre 1 y 100
numero_secreto = random.randint(1, 100)
intentos = 0
adivinado = False
print("¡Bienvenido al juego de adivinanza de números!")
print("He pensado un número entre 1 y 100.")
# Bucle principal del juego
while not adivinado:
# Pedimos al usuario que adivine
try:
intento = int(input("Adivina el número: "))
intentos += 1
# Evaluamos el intento
if intento < numero_secreto:
print("Demasiado bajo. Intenta con un número más alto.")
elif intento > numero_secreto:
print("Demasiado alto. Intenta con un número más bajo.")
else:
adivinado = True
print(f"¡Felicidades! Has adivinado el número {numero_secreto} en {intentos} intentos.")
except ValueError:
print("Por favor, introduce un número válido.")
return intentos
# Ejecutamos el juego
if __name__ == "__main__":
jugar_adivinanza()
Mejoras del juego
Ahora vamos a mejorar nuestro juego añadiendo algunas características adicionales:
- Limitar el número de intentos
- Permitir múltiples partidas
- Llevar un registro de puntuaciones
- Añadir niveles de dificultad
Implementemos estas mejoras:
import random
import json
import os
# Archivo para guardar puntuaciones
ARCHIVO_PUNTUACIONES = "puntuaciones_adivinanza.json"
def cargar_puntuaciones():
"""Carga las puntuaciones desde el archivo JSON."""
if os.path.exists(ARCHIVO_PUNTUACIONES):
try:
with open(ARCHIVO_PUNTUACIONES, 'r') as archivo:
return json.load(archivo)
except:
return []
else:
return []
def guardar_puntuaciones(puntuaciones):
"""Guarda las puntuaciones en el archivo JSON."""
with open(ARCHIVO_PUNTUACIONES, 'w') as archivo:
json.dump(puntuaciones, archivo, indent=4)
def mostrar_puntuaciones():
"""Muestra las mejores puntuaciones."""
puntuaciones = cargar_puntuaciones()
if not puntuaciones:
print("Aún no hay puntuaciones registradas.")
return
print("\n=== MEJORES PUNTUACIONES ===")
# Ordenamos por intentos (menos es mejor) y luego por dificultad (mayor es mejor)
puntuaciones_ordenadas = sorted(puntuaciones, key=lambda x: (x["intentos"], -x["dificultad"]))
for i, p in enumerate(puntuaciones_ordenadas[:5], 1):
dificultad = "Fácil" if p["dificultad"] == 1 else "Normal" if p["dificultad"] == 2 else "Difícil"
print(f"{i}. {p['nombre']}: {p['intentos']} intentos (Dificultad: {dificultad})")
print("============================")
def elegir_dificultad():
"""Permite al usuario elegir la dificultad."""
while True:
print("\nNiveles de dificultad:")
print("1. Fácil (1-50, 10 intentos)")
print("2. Normal (1-100, 7 intentos)")
print("3. Difícil (1-200, 5 intentos)")
try:
dificultad = int(input("Elige un nivel de dificultad (1-3): "))
if 1 <= dificultad <= 3:
return dificultad
else:
print("Por favor, elige un número entre 1 y 3.")
except ValueError:
print("Por favor, introduce un número válido.")
def configurar_dificultad(nivel):
"""Configura los parámetros según el nivel de dificultad."""
if nivel == 1: # Fácil
return 1, 50, 10
elif nivel == 2: # Normal
return 1, 100, 7
else: # Difícil
return 1, 200, 5
def jugar_adivinanza():
"""Función principal del juego."""
print("¡Bienvenido al juego de adivinanza de números!")
# Elegir dificultad
nivel_dificultad = elegir_dificultad()
min_numero, max_numero, max_intentos = configurar_dificultad(nivel_dificultad)
# Generar número aleatorio
numero_secreto = random.randint(min_numero, max_numero)
intentos = 0
adivinado = False
print(f"\nHe pensado un número entre {min_numero} y {max_numero}.")
print(f"Tienes un máximo de {max_intentos} intentos.")
# Bucle principal del juego
while not adivinado and intentos < max_intentos:
intentos_restantes = max_intentos - intentos
print(f"\nIntentos restantes: {intentos_restantes}")
try:
intento = int(input("Adivina el número: "))
intentos += 1
# Evaluamos el intento
if intento < min_numero or intento > max_numero:
print(f"Por favor, introduce un número entre {min_numero} y {max_numero}.")
elif intento < numero_secreto:
print("Demasiado bajo. ¡Prueba con un número más alto!")
elif intento > numero_secreto:
print("Demasiado alto. ¡Prueba con un número más bajo!")
else:
adivinado = True
print(f"\n¡FELICIDADES! Has adivinado el número {numero_secreto} en {intentos} intentos.")
# Guardar puntuación
nombre = input("Introduce tu nombre para la tabla de puntuaciones: ")
puntuaciones = cargar_puntuaciones()
puntuaciones.append({
"nombre": nombre,
"intentos": intentos,
"dificultad": nivel_dificultad
})
guardar_puntuaciones(puntuaciones)
mostrar_puntuaciones()
except ValueError:
print("Por favor, introduce un número válido.")
if not adivinado:
print(f"\n¡GAME OVER! Se te acabaron los intentos. El número era {numero_secreto}.")
return intentos, adivinado
def menu_principal():
"""Muestra el menú principal y gestiona las opciones."""
while True:
print("\n=== JUEGO DE ADIVINANZA DE NÚMEROS ===")
print("1. Jugar partida")
print("2. Ver mejores puntuaciones")
print("3. Salir")
opcion = input("\nElige una opción (1-3): ")
if opcion == "1":
jugar_adivinanza()
elif opcion == "2":
mostrar_puntuaciones()
elif opcion == "3":
print("¡Gracias por jugar! ¡Hasta pronto!")
break
else:
print("Opción no válida. Intenta de nuevo.")
# Punto de entrada del programa
if __name__ == "__main__":
menu_principal()
Explicación del código
Nuestro juego de adivinanza de números ahora incluye las siguientes características:
-
Diferentes niveles de dificultad:
- Fácil: Número entre 1-50, 10 intentos
- Normal: Número entre 1-100, 7 intentos
- Difícil: Número entre 1-200, 5 intentos
-
Sistema de puntuaciones:
- Guarda el nombre del jugador, intentos utilizados y nivel de dificultad
- Muestra las mejores 5 puntuaciones ordenadas por intentos y dificultad
-
Persistencia de datos:
- Las puntuaciones se guardan en un archivo JSON
- Se pueden consultar las puntuaciones anteriores
-
Menú principal:
- Permite jugar múltiples partidas
- Ver la tabla de puntuaciones
- Salir del juego
-
Retroalimentación durante el juego:
- Muestra los intentos restantes
- Da pistas sobre si el número es mayor o menor
- Verifica que las entradas del usuario sean válidas
Ideas para extender el juego
Si quieres seguir mejorando este juego, aquí hay algunas ideas adicionales:
- Tiempo límite: Añadir un límite de tiempo para cada intento
- Pistas especiales: Dar pistas adicionales después de ciertos intentos (ej. "El número es par/impar")
- Modos de juego: Añadir un modo inverso donde el jugador piensa un número y el ordenador adivina
- Interfaz gráfica: Implementar una interfaz con Tkinter para hacerlo más visual
- Modo multijugador: Permitir que dos jugadores compitan por adivinar el número más rápido
Resumen
En este artículo, hemos creado un completo juego de adivinanza de números que incorpora múltiples conceptos de Python. Hemos trabajado con generación de números aleatorios, entrada de usuario, bucles, condicionales, manejo de errores, almacenamiento de datos en archivos JSON y funciones para organizar nuestro código.
Este proyecto demuestra cómo podemos combinar diferentes elementos de Python para crear una aplicación interactiva y divertida. El juego no solo sirve como práctica de programación, sino que también puede ser personalizado y extendido según tus propias ideas creativas. A medida que sigas avanzando en tu aprendizaje de Python, podrás implementar características más avanzadas para hacer tu juego aún más entretenido e interesante.