EmaSMach

Juego - Game: "Adivina el número" - "Guess the number"

Jul 18th, 2018
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.78 KB | None | 0 0
  1. # Simple juego "Adivina el número" hecho con tkinter.
  2. # El número a adivinar está en un rango que va desde el 1 al 100
  3. # License: MIT
  4. # Have fun
  5. __author__ = "David Emanuel Sandoval"
  6.  
  7.  
  8. from tkinter import *
  9. from tkinter.messagebox import askyesno, showinfo
  10. import random
  11. import sys
  12.  
  13. class Adivinando():
  14.     """Implementa las funciones del juego"""
  15.     def __init__(self, rango):
  16.         self.rango = rango
  17.         self.hint = 'Adivina el número entre el 1 y el 100,\n incluyendo a estos dos'
  18.         self.mensaje = self.hint
  19.         self.intentos = IntVar()
  20.         self.intentos.set(0)
  21.         self._numero_objetivo = self.generar_numero(self.rango)
  22.        
  23.     def generar_numero(self, rango):
  24.         """Genera y retorna un número aleatorio dento el rango indicado."""
  25.         return random.choice(range(1, rango))
  26.  
  27.     def get_numero(self):
  28.         return self._numero_objetivo
  29.  
  30.     def pasar_numero(self, numero):
  31.         """Función para ir pasándole números al juego."""
  32.         self.numero = numero
  33.  
  34.     def comprobar_numero(self):
  35.         """Realiza todas las comprobaciones lógicas sobre el número que se le pasa al juego."""
  36.         self.intentos.set(self.intentos.get() + 1)
  37.         if self.numero == self._numero_objetivo:
  38.             self.mensaje = 'Ganaste'
  39. ##            print('Ganaste')
  40.             temp_mensaje = f'¡Ganaste!\nLo adivinaste en {self.intentos.get()} intentos.\nEl número es {self._numero_objetivo}'
  41.             showinfo(title='Adivinaste', message=temp_mensaje)
  42.             resp = askyesno(title='Adivina el Número', message='¿Desea jugar otra vez?')
  43.             if resp:
  44.                 self.reset()
  45.             else:
  46.                 sys.exit()
  47.         elif self.numero > self._numero_objetivo:
  48.             self.mensaje = f'{self.entry.get()}: Número muy grande\nIntentos: {self.intentos.get()}'
  49. ##            print(self.mensaje)
  50.         elif self.numero < self._numero_objetivo:
  51.             self.mensaje = f'{self.entry.get()}: Número muy chico\nIntentos: {self.intentos.get()}'
  52. ##            print(self.mensaje)
  53.  
  54.     def reset(self):
  55.         """Resetea el estado del juego"""
  56. ##        print("*"*80)
  57.         self.intentos.set(0)
  58.         self.mensaje = self.hint
  59.         self._numero_objetivo = self.generar_numero(self.rango)
  60. ##        print("Número:", self._numero_objetivo)
  61. ##        print("Intentos:", self.intentos.get())
  62.  
  63.        
  64. class InterfazGame(Frame, Adivinando):
  65.     """Implementa la interfaz del juego"""
  66.     def __init__(self, parent, rango, *args, **kwargs):
  67.         super().__init__(parent, *args, **kwargs)
  68.         Adivinando.__init__(self, rango)
  69.  
  70.         self.makeWidgets()
  71.  
  72.     def makeWidgets(self):
  73.         """Crea los widgets"""
  74.         fuente = ('Arial', 30)
  75.         self.lbl_mensaje = Label(self, text=self.mensaje, font=('Italic', 20))
  76.         self.entry = Entry(self, font=fuente)
  77.  
  78.         # Registramos la función. Las 'letras' que se le pasan son los distintos valores que se pueden
  79.         # tomar como criterio para validar lo que se ingresa en el entry.
  80.         # No es necesario pasarlos todos, pero los puse para tenerlos en cuenta, por si acaso.
  81.         vcdm = (self.entry.register(self.validar), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
  82.        
  83.         self.entry.configure(validate='key', validatecommand=vcdm) # Le función de validación 'vcdm'
  84.        
  85.         self.lbl_mensaje.grid(row=0, column=0)
  86.         self.entry.grid(row=1, column=0)
  87.         self.entry.focus()
  88.  
  89.         self.entry.bind('<Return>', self.on_return)
  90.  
  91.     def on_return(self, event):
  92.         """Comprueba si se acertó al numero objetivo y lo deja saber con un mensaje"""
  93.         if self.entry.get():
  94.             self.pasar_numero(int(self.entry.get()))
  95.             self.comprobar_numero()
  96.             self.entry.delete(0, END) # Limpiamos el entry para nuevo ingreso
  97.             self.lbl_mensaje['text'] = self.mensaje
  98.  
  99.     def validar(self, d, i, P, s, S, v, V, W):
  100.         """Valida los valores ingresados:
  101.        No se permiten: letras, ni símbolos, ni que el número empieze con cero, ni que haya mas de 3 cifras."""
  102.         if d == '0': # Permitimos el borrado
  103.             return True
  104.         elif d == '1' and not S.isdigit(): # No permitimos ingresar letras ni símbolos
  105. ##            print("No letras, símbolos, ni espacio")
  106.             self.bell()
  107.             return False
  108.         elif d == '1': # Si se realiza una insercción
  109.             if len(s) == 2 and int(s[0]) != 1 and int(S) != 0:
  110. ##                print("No mas de 100 - caso 1")
  111.                 self.bell()
  112.                 return False
  113.             elif len(s) == 2 and int(s) == 10 and int(S) != 0:
  114. ##                print("No mas de 100:- caso 2")
  115.                 self.bell()
  116.                 return False
  117.             elif len(s) == 3:
  118. ##                print('No mas de tres')
  119.                 self.bell()
  120.                 return False
  121.             elif len(s) == 2 and int(s) > 10:
  122. ##                print('No mas de 100 - caso 3')
  123.                 self.bell()
  124.                 return False
  125.             elif len(s) == 0 and int(S) == 0: # El número no puede empezar con 0
  126. ##                print("Que no empieze con cero")
  127.                 self.bell()
  128.                 return False
  129.             else:
  130.                 if int(P) > 100: # Evitamos obtener un numero mayor a 100 como resultado de pegar desde portapapeles
  131. ##                    print("El número resultante es muy grande")
  132.                     self.bell()
  133.                     return False
  134.                 else:
  135.                     return True
  136.        
  137.  
  138. def main():
  139.     root = Tk()
  140.     root.title("Adivina el número")
  141.     root.resizable(False, False)
  142.     game = InterfazGame(root, 101)
  143.     game.pack()
  144.     root.mainloop()
  145.    
  146.    
  147. if __name__ == '__main__':
  148.     main()
Advertisement
Add Comment
Please, Sign In to add comment