Ir al contenido principal

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:

  1. Limitar el número de intentos
  2. Permitir múltiples partidas
  3. Llevar un registro de puntuaciones
  4. 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:

  1. 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
  2. Sistema de puntuaciones:

    • Guarda el nombre del jugador, intentos utilizados y nivel de dificultad
    • Muestra las mejores 5 puntuaciones ordenadas por intentos y dificultad
  3. Persistencia de datos:

    • Las puntuaciones se guardan en un archivo JSON
    • Se pueden consultar las puntuaciones anteriores
  4. Menú principal:

    • Permite jugar múltiples partidas
    • Ver la tabla de puntuaciones
    • Salir del juego
  5. 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:

  1. Tiempo límite: Añadir un límite de tiempo para cada intento
  2. Pistas especiales: Dar pistas adicionales después de ciertos intentos (ej. "El número es par/impar")
  3. Modos de juego: Añadir un modo inverso donde el jugador piensa un número y el ordenador adivina
  4. Interfaz gráfica: Implementar una interfaz con Tkinter para hacerlo más visual
  5. 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.