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
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.
2
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!
3
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!
4
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!
5
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:
Muestra el récord actual al empezar cada partida.
Guarda un récord distinto para cada nivel (pista: un diccionario guardado en JSON).
Haz que el ordenador adivine tu número con búsqueda binaria: siempre prueba el valor del medio.
Con tu permiso usamos Google Analytics, que guarda cookies, para saber cuántas personas visitan la web y qué páginas les resultan útiles. No usamos cookies de publicidad y tus archivos nunca salen de tu navegador. Puedes cambiar de opinión cuando quieras en «Configurar cookies», al pie de la página. Más información.