Proyectos · Python · Básico

Adivina el número

El clásico juego de consola: el ordenador piensa un número y tú lo adivinas con pistas. Bucles, condiciones, errores de entrada, niveles y un récord que se guarda.

  • 5 pasos
  • 45 minutos aproximadamente
  • 61 líneas de código

Lo que vas a construir

Un juego pequeño que toca casi todo lo básico de Python: números aleatorios, input, condiciones, bucles, funciones, errores y archivos. Cada paso añade algo a un programa que funciona desde el principio.

Lo que vas a practicar

  • Generar números aleatorios
  • Repetir con while hasta que se cumpla algo
  • Validar lo que escribe la persona
  • Dividir el programa en funciones
  • Guardar un dato en un archivo

Cómo ejecutarlo: Guarda el código en un archivo adivina.py y ejecútalo en la terminal con python adivina.py (o py adivina.py en Windows).

Así funciona al final
Nivel: 1 fácil, 2 normal, 3 difícil: 1
Adivina el número (1-50): 25
Más alto.
Te quedan 9 intentos.
Adivina el número (1-50): 37
¡Has acertado en 2 intentos!
¡Nuevo récord!
¿Otra partida? (s/n): n
¡Hasta la próxima!

Antes de empezar, conviene haber hecho estas lecciones

Paso 1 de 5

Pensar un número y comprobar un intento

El módulo random de la biblioteca estándar elige números al azar: random.randint(1, 100) da un entero entre 1 y 100, ambos incluidos.

input() siempre devuelve texto, así que hay que convertirlo con int() antes de compararlo con el número secreto.

adivina.py
import random

secreto = random.randint(1, 100)
intento = int(input("Adivina el número (1-100): "))

if intento == secreto:
    print("¡Has acertado!")
else:
    print(f"No. Era el {secreto}.")
Al ejecutarlo
Adivina el número (1-100): 40
No. Era el 73.

Paso 2 de 5

Repetir hasta acertar, con pistas

Con un bucle while el juego sigue pidiendo números mientras el intento no sea el secreto. En cada vuelta da una pista: más alto o más bajo.

La variable intento empieza en 0 (un número que nunca es el secreto) para que el bucle entre la primera vez.

adivina.pyLo nuevo, resaltado
import random

secreto = random.randint(1, 100)
intento = 0

while intento != secreto:
    intento = int(input("Adivina el número (1-100): "))
    if intento < secreto:
        print("Más alto.")
    elif intento > secreto:
        print("Más bajo.")

print("¡Has acertado!")
Al ejecutarlo
Adivina el número (1-100): 50
Más alto.
Adivina el número (1-100): 75
Más bajo.
Adivina el número (1-100): 73
¡Has acertado!

Paso 3 de 5

Contar intentos y no fallar con letras

Si alguien escribe «hola», int() lanza un ValueError y el programa se cerraría. Con try y except se avisa y se vuelve a preguntar con continue, sin contar ese intento.

Un contador intentos sube en cada número válido y se muestra al final. También se rechazan los números fuera del rango.

adivina.pyLo nuevo, resaltado
import random

secreto = random.randint(1, 100)
intento = 0
intentos = 0

while intento != secreto:
    try:
        intento = int(input("Adivina el número (1-100): "))
    except ValueError:
        print("Escribe un número entero.")
        continue
    if not 1 <= intento <= 100:
        print("Tiene que estar entre 1 y 100.")
        continue
    intentos += 1
    if intento < secreto:
        print("Más alto.")
    elif intento > secreto:
        print("Más bajo.")

print(f"¡Has acertado en {intentos} intentos!")
Al ejecutarlo
Adivina el número (1-100): cincuenta
Escribe un número entero.
Adivina el número (1-100): 50
Más alto.
Adivina el número (1-100): 73
¡Has acertado en 2 intentos!

Paso 4 de 5

Niveles de dificultad con funciones

El programa crece, así que se reparte en funciones: pedir_numero se encarga de leer y validar, elegir_nivel pregunta la dificultad y jugar contiene la partida. Cada una hace una sola cosa y se puede probar por separado.

Cada nivel tiene su rango y su número máximo de intentos, guardados en un diccionario. jugar devuelve los intentos usados, o None si se acabaron.

adivina.pyLo nuevo, resaltado
import random

NIVELES = {"1": (1, 50, 10), "2": (1, 100, 7), "3": (1, 1000, 10)}


def pedir_numero(minimo, maximo):
    while True:
        try:
            numero = int(input(f"Adivina el número ({minimo}-{maximo}): "))
        except ValueError:
            print("Escribe un número entero.")
            continue
        if minimo <= numero <= maximo:
            return numero
        print(f"Tiene que estar entre {minimo} y {maximo}.")


def elegir_nivel():
    while True:
        nivel = input("Nivel: 1 fácil, 2 normal, 3 difícil: ").strip()
        if nivel in NIVELES:
            return NIVELES[nivel]
        print("Elige 1, 2 o 3.")


def jugar(minimo, maximo, limite):
    secreto = random.randint(minimo, maximo)
    for intentos in range(1, limite + 1):
        intento = pedir_numero(minimo, maximo)
        if intento == secreto:
            return intentos
        print("Más alto." if intento < secreto else "Más bajo.")
        print(f"Te quedan {limite - intentos} intentos.")
    print(f"Se acabaron los intentos. Era el {secreto}.")
    return None


resultado = jugar(*elegir_nivel())
if resultado:
    print(f"¡Has acertado en {resultado} intentos!")
Al ejecutarlo
Nivel: 1 fácil, 2 normal, 3 difícil: 2
Adivina el número (1-100): 50
Más bajo.
Te quedan 6 intentos.
Adivina el número (1-100): 25
¡Has acertado en 2 intentos!

Paso 5 de 5

Jugar otra vez y guardar el récord

Un bucle exterior pregunta si quieres jugar otra vez. El récord (la partida con menos intentos) se guarda en un archivo record.txt, así que se conserva aunque cierres el programa.

Si el archivo todavía no existe, leer_record captura FileNotFoundError y devuelve None. Al escribirlo se usa encoding="utf-8" para que funcione igual en cualquier sistema.

adivina.pyLo nuevo, resaltado
import random
from pathlib import Path

NIVELES = {"1": (1, 50, 10), "2": (1, 100, 7), "3": (1, 1000, 10)}
ARCHIVO_RECORD = Path("record.txt")


def pedir_numero(minimo, maximo):
    while True:
        try:
            numero = int(input(f"Adivina el número ({minimo}-{maximo}): "))
        except ValueError:
            print("Escribe un número entero.")
            continue
        if minimo <= numero <= maximo:
            return numero
        print(f"Tiene que estar entre {minimo} y {maximo}.")


def elegir_nivel():
    while True:
        nivel = input("Nivel: 1 fácil, 2 normal, 3 difícil: ").strip()
        if nivel in NIVELES:
            return NIVELES[nivel]
        print("Elige 1, 2 o 3.")


def jugar(minimo, maximo, limite):
    secreto = random.randint(minimo, maximo)
    for intentos in range(1, limite + 1):
        intento = pedir_numero(minimo, maximo)
        if intento == secreto:
            return intentos
        print("Más alto." if intento < secreto else "Más bajo.")
        print(f"Te quedan {limite - intentos} intentos.")
    print(f"Se acabaron los intentos. Era el {secreto}.")
    return None


def leer_record():
    try:
        return int(ARCHIVO_RECORD.read_text(encoding="utf-8"))
    except (FileNotFoundError, ValueError):
        return None


def guardar_record(intentos):
    ARCHIVO_RECORD.write_text(str(intentos), encoding="utf-8")


while True:
    resultado = jugar(*elegir_nivel())
    if resultado:
        print(f"¡Has acertado en {resultado} intentos!")
        record = leer_record()
        if record is None or resultado < record:
            guardar_record(resultado)
            print("¡Nuevo récord!")
    if input("¿Otra partida? (s/n): ").strip().lower() != "s":
        print("¡Hasta la próxima!")
        break
Al ejecutarlo
Nivel: 1 fácil, 2 normal, 3 difícil: 1
Adivina el número (1-50): 25
Más alto.
Te quedan 9 intentos.
Adivina el número (1-50): 37
¡Has acertado en 2 intentos!
¡Nuevo récord!
¿Otra partida? (s/n): n
¡Hasta la próxima!

Retos para seguir

Has terminado el proyecto. Si quieres ir más allá, prueba a añadirle esto por tu cuenta:

  1. Muestra el récord actual al empezar cada partida.
  2. Guarda un récord distinto para cada nivel (pista: un diccionario guardado en JSON).
  3. Haz que el ordenador adivine tu número con búsqueda binaria: siempre prueba el valor del medio.

Conceptos clave

Repasa la ruta de Python o elige otro proyecto.