Un juego de adivinar números es un proyecto pequeño pero muy completo para practicar valores aleatorios, bucles, condiciones, funciones, validación de entradas y estado de una partida. El ordenador elige un número secreto y el jugador recibe pistas hasta acertar o quedarse sin intentos.
En esta guía construiremos un juego de adivinar números en Python con niveles de dificultad, control de intentos, validación, repetición de partidas y una función de comparación que puede probarse de forma independiente.
Cómo funciona el juego
- El jugador selecciona una dificultad.
- El programa genera un entero secreto dentro de un rango.
- La persona introduce un intento.
- El programa valida el dato.
- Se muestra una pista: demasiado bajo, demasiado alto o correcto.
- La ronda termina al acertar o consumir los intentos.
- El jugador puede iniciar otra partida.
La generación del número utiliza el módulo random de Python.
Versión más sencilla
import random
secreto = random.randint(1, 100)
intento = int(input("Adivina un número del 1 al 100: "))
if intento == secreto:
print("¡Correcto!")
elif intento < secreto:
print("Demasiado bajo")
else:
print("Demasiado alto")Esta versión acepta un solo intento y termina con un error cuando el usuario escribe texto que no puede convertirse a entero.
Repetir con while
import random
secreto = random.randint(1, 100)
intento = None
while intento != secreto:
intento = int(input("Tu intento: "))
if intento < secreto:
print("Demasiado bajo")
elif intento > secreto:
print("Demasiado alto")
print("¡Lo encontraste!")El valor inicial None permite entrar en el bucle antes de que exista un intento real.
Validar la entrada
def leer_entero(mensaje, minimo, maximo):
while True:
texto = input(mensaje).strip()
try:
valor = int(texto)
except ValueError:
print("Introduce un número entero.")
continue
if minimo <= valor <= maximo:
return valor
print(f"Escribe un número entre {minimo} y {maximo}.")La función repite la pregunta hasta recibir un entero válido dentro del intervalo.
Limitar los intentos
MAX_INTENTOS = 7
for numero_intento in range(1, MAX_INTENTOS + 1):
restantes = MAX_INTENTOS - numero_intento
intento = leer_entero("Tu intento: ", 1, 100)
if intento == secreto:
print(f"¡Correcto en {numero_intento} intentos!")
break
if intento < secreto:
print("Demasiado bajo")
else:
print("Demasiado alto")
print(f"Intentos restantes: {restantes}")
else:
print(f"El número secreto era {secreto}.")El bloque else del bucle se ejecuta solamente cuando no se produce break.
Evitar intentos repetidos
numeros_probados = set()
intento = leer_entero("Tu intento: ", 1, 100)
if intento in numeros_probados:
print("Ya probaste ese número.")
else:
numeros_probados.add(intento)Un conjunto almacena valores únicos y permite comprobar repeticiones de forma clara.
Separar la lógica de las pistas
def comparar_intento(intento, secreto):
if intento < secreto:
return "bajo"
if intento > secreto:
return "alto"
return "correcto"La función no lee ni imprime nada, por lo que es fácil de probar.
Añadir niveles de dificultad
DIFICULTADES = {
"facil": {"maximo": 50, "intentos": 10},
"normal": {"maximo": 100, "intentos": 7},
"dificil": {"maximo": 500, "intentos": 9},
}La dificultad puede cambiar tanto el rango como el número de oportunidades.
Código completo
import random
DIFICULTADES = {
"facil": {"maximo": 50, "intentos": 10},
"normal": {"maximo": 100, "intentos": 7},
"dificil": {"maximo": 500, "intentos": 9},
}
def leer_entero(mensaje, minimo, maximo):
while True:
texto = input(mensaje).strip()
try:
valor = int(texto)
except ValueError:
print("Introduce un número entero.")
continue
if minimo <= valor <= maximo:
return valor
print(f"Escribe un número entre {minimo} y {maximo}.")
def elegir_dificultad():
while True:
print("Niveles: facil, normal, dificil")
opcion = input("Dificultad: ").strip().lower()
if opcion in DIFICULTADES:
return opcion
print("Elige facil, normal o dificil.")
def comparar_intento(intento, secreto):
if intento < secreto:
return "bajo"
if intento > secreto:
return "alto"
return "correcto"
def jugar_ronda(generador=None):
generador = generador or random.Random()
dificultad = elegir_dificultad()
ajustes = DIFICULTADES[dificultad]
maximo = ajustes["maximo"]
max_intentos = ajustes["intentos"]
secreto = generador.randint(1, maximo)
probados = set()
intento_numero = 0
print(f"Elegí un número entre 1 y {maximo}.")
while intento_numero < max_intentos:
intento = leer_entero("Tu intento: ", 1, maximo)
if intento in probados:
print("Ya probaste ese número.")
continue
probados.add(intento)
intento_numero += 1
resultado = comparar_intento(intento, secreto)
if resultado == "correcto":
print(f"¡Correcto! Usaste {intento_numero} intentos.")
return True
restantes = max_intentos - intento_numero
print(f"Demasiado {resultado}. Quedan {restantes} intentos.")
print(f"Sin intentos. El número era {secreto}.")
return False
def quiere_repetir():
while True:
respuesta = input("¿Jugar otra vez? [s/n]: ").strip().lower()
if respuesta in {"s", "si", "sí"}:
return True
if respuesta in {"n", "no"}:
return False
print("Escribe s o n.")
def main():
print("Juego de adivinar números")
while True:
jugar_ronda()
if not quiere_repetir():
print("¡Gracias por jugar!")
break
if __name__ == "__main__":
main()Probar la función de comparación
from juego_adivinar import comparar_intento
def test_comparar_intento():
assert comparar_intento(3, 8) == "bajo"
assert comparar_intento(10, 8) == "alto"
assert comparar_intento(8, 8) == "correcto"La guía de Pytest para principiantes explica cómo ejecutar estas pruebas.
Errores frecuentes
- Generar un nuevo secreto dentro del bucle de intentos.
- Olvidar que
input()devuelve texto. - Contar entradas inválidas o repetidas como intentos.
- Crear un bucle sin condición real de salida.
- Colocar todo el programa en el nivel global.
- Mostrar accidentalmente el número secreto.
Ideas para ampliar el proyecto
- Calcular una puntuación según los intentos restantes.
- Guardar récords en JSON.
- Añadir pistas de “más cerca” y “más lejos”.
- Crear un modo para dos jugadores.
- Hacer una versión gráfica con Turtle.
- Aceptar la dificultad mediante argumentos de terminal.
Conclusión
Un juego de adivinar números en Python enseña varios fundamentos en un proyecto compacto: generación aleatoria, validación, bucles, funciones, conjuntos y pruebas. Una vez que la versión básica funcione, añade mejoras de una en una para mantener el código comprensible.
Lectura relacionada
El control de intentos repetidos resulta más claro cuando conoces bien los conjuntos en Python.
Documentación oficial
Consulta la documentación de Python sobre el módulo random y la referencia de la función input(), las dos piezas centrales de la interacción del juego.




