124 lines
3.3 KiB
Python
124 lines
3.3 KiB
Python
|
"""
|
||
|
Programa día 4 - Juego "Adivina el número"
|
||
|
"""
|
||
|
# Importamos módulos
|
||
|
from random import randint
|
||
|
import itertools
|
||
|
import threading
|
||
|
import time
|
||
|
import sys
|
||
|
import os
|
||
|
|
||
|
|
||
|
# Funciones
|
||
|
|
||
|
# Función limpiar consola
|
||
|
def clearConsole():
|
||
|
command = 'clear'
|
||
|
if os.name in ('nt', 'dos'): # If Machine is running on Windows, use cls
|
||
|
command = 'cls'
|
||
|
os.system(command)
|
||
|
|
||
|
# Función de la animación para 'pensar'
|
||
|
|
||
|
|
||
|
def animate():
|
||
|
for c in itertools.cycle(['|', '/', '-', '\\']):
|
||
|
if DONE:
|
||
|
break
|
||
|
sys.stdout.write('\rPensando un número ' + c)
|
||
|
sys.stdout.flush()
|
||
|
time.sleep(0.1)
|
||
|
sys.stdout.write('\rYa tengo el número! ')
|
||
|
sys.stdout.write('\nA ver si aciertas, dime un número: ')
|
||
|
|
||
|
|
||
|
# Función validar input es un número
|
||
|
def validar(dato, tipos):
|
||
|
for tipo in tipos:
|
||
|
try:
|
||
|
return tipo(dato)
|
||
|
except ValueError:
|
||
|
pass
|
||
|
return None
|
||
|
|
||
|
|
||
|
# Limpiar la terminal
|
||
|
clearConsole()
|
||
|
|
||
|
# Mensaje bienvenida
|
||
|
print("\n#########################")
|
||
|
print("JUEGO - Adivina el número")
|
||
|
print("#########################\n")
|
||
|
|
||
|
# Pregunta nombre, saluda y explica el juego (Con opción a salir)
|
||
|
nombre = input("¿Cuál es tu nombre? ")
|
||
|
print(f"\nOk {nombre}, voy a pensar un número del 1 al 100.")
|
||
|
print("Tienes 8 intentos para adivinarlo\n")
|
||
|
|
||
|
# Filigrana como que piensa la máquina
|
||
|
|
||
|
DONE = False
|
||
|
t = threading.Thread(target=animate)
|
||
|
t.start()
|
||
|
|
||
|
# El tiempo de ejecución
|
||
|
time.sleep(3)
|
||
|
DONE = True
|
||
|
|
||
|
# Guardando el número secreto
|
||
|
n_secreto = randint(1, 100)
|
||
|
|
||
|
# Bucle de intentos y control de flujo
|
||
|
for intentos in range(8):
|
||
|
|
||
|
# Calcular intentos restantes
|
||
|
lista_intentos = list(range(8))
|
||
|
lista_intentos.reverse()
|
||
|
intentos_restantes = lista_intentos.pop(intentos)
|
||
|
|
||
|
# Pregunta posible número y valida que es de type número
|
||
|
while True:
|
||
|
n_posible = input("Dime un número: ")
|
||
|
x = validar(n_posible, (int, float, complex))
|
||
|
if x is None:
|
||
|
print("Error: El dato introducido no es un número\n")
|
||
|
else:
|
||
|
break
|
||
|
|
||
|
# Para comparar el número se necesita que sea integer
|
||
|
n_posible = int(n_posible)
|
||
|
|
||
|
# Posibles casuísticas
|
||
|
# Si el número no está en el rango especificado
|
||
|
if (n_posible < 1) or (n_posible > 100):
|
||
|
print("\nEse número no está entre el 1 y el 100")
|
||
|
print(
|
||
|
f"Desperdiciaste un turno, te quedan {intentos_restantes} intentos")
|
||
|
|
||
|
# Si el número es menor
|
||
|
elif n_posible > n_secreto:
|
||
|
print(
|
||
|
f"\nLo siento, has fallado.Te quedan {intentos_restantes} intentos.")
|
||
|
print("\n\tPista --> El número es menor.\n")
|
||
|
|
||
|
# Si el número es mayor
|
||
|
elif n_posible < n_secreto:
|
||
|
print(
|
||
|
f"\nLo siento, has fallado.Te quedan {intentos_restantes} intentos.")
|
||
|
print("\n\tPista --> El número es mayor.\n")
|
||
|
|
||
|
# Si se acierta el número
|
||
|
elif n_posible == n_secreto:
|
||
|
print("\n¡Ole! ¡¡¡¡HAS ACERTADO!!!!")
|
||
|
intentos += 1
|
||
|
print(f"¡Felicidades {nombre}!\nLo conseguiste en {intentos} intentos")
|
||
|
break
|
||
|
|
||
|
# Si se agotan los intentos
|
||
|
if intentos == 7:
|
||
|
print(
|
||
|
f"\n¡Vaya! Has gastado los 8 intentos.\nEl número pensado era el {n_secreto}.\n Otra vez será...\nCiao!")
|
||
|
|
||
|
print("\n¡Espero que te hayas divertido!")
|