Curso-lenguaje-python/python-total/dia_04/13_programa04.py

124 lines
3.3 KiB
Python
Raw Permalink Normal View History

2023-04-12 21:54:25 +02:00
"""
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!")