Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Simple juego "Adivina el número" hecho con tkinter.
- # El número a adivinar está en un rango que va desde el 1 al 100
- # License: MIT
- # Have fun
- __author__ = "David Emanuel Sandoval"
- from tkinter import *
- from tkinter.messagebox import askyesno, showinfo
- import random
- import sys
- class Adivinando():
- """Implementa las funciones del juego"""
- def __init__(self, rango):
- self.rango = rango
- self.hint = 'Adivina el número entre el 1 y el 100,\n incluyendo a estos dos'
- self.mensaje = self.hint
- self.intentos = IntVar()
- self.intentos.set(0)
- self._numero_objetivo = self.generar_numero(self.rango)
- def generar_numero(self, rango):
- """Genera y retorna un número aleatorio dento el rango indicado."""
- return random.choice(range(1, rango))
- def get_numero(self):
- return self._numero_objetivo
- def pasar_numero(self, numero):
- """Función para ir pasándole números al juego."""
- self.numero = numero
- def comprobar_numero(self):
- """Realiza todas las comprobaciones lógicas sobre el número que se le pasa al juego."""
- self.intentos.set(self.intentos.get() + 1)
- if self.numero == self._numero_objetivo:
- self.mensaje = 'Ganaste'
- ## print('Ganaste')
- temp_mensaje = f'¡Ganaste!\nLo adivinaste en {self.intentos.get()} intentos.\nEl número es {self._numero_objetivo}'
- showinfo(title='Adivinaste', message=temp_mensaje)
- resp = askyesno(title='Adivina el Número', message='¿Desea jugar otra vez?')
- if resp:
- self.reset()
- else:
- sys.exit()
- elif self.numero > self._numero_objetivo:
- self.mensaje = f'{self.entry.get()}: Número muy grande\nIntentos: {self.intentos.get()}'
- ## print(self.mensaje)
- elif self.numero < self._numero_objetivo:
- self.mensaje = f'{self.entry.get()}: Número muy chico\nIntentos: {self.intentos.get()}'
- ## print(self.mensaje)
- def reset(self):
- """Resetea el estado del juego"""
- ## print("*"*80)
- self.intentos.set(0)
- self.mensaje = self.hint
- self._numero_objetivo = self.generar_numero(self.rango)
- ## print("Número:", self._numero_objetivo)
- ## print("Intentos:", self.intentos.get())
- class InterfazGame(Frame, Adivinando):
- """Implementa la interfaz del juego"""
- def __init__(self, parent, rango, *args, **kwargs):
- super().__init__(parent, *args, **kwargs)
- Adivinando.__init__(self, rango)
- self.makeWidgets()
- def makeWidgets(self):
- """Crea los widgets"""
- fuente = ('Arial', 30)
- self.lbl_mensaje = Label(self, text=self.mensaje, font=('Italic', 20))
- self.entry = Entry(self, font=fuente)
- # Registramos la función. Las 'letras' que se le pasan son los distintos valores que se pueden
- # tomar como criterio para validar lo que se ingresa en el entry.
- # No es necesario pasarlos todos, pero los puse para tenerlos en cuenta, por si acaso.
- vcdm = (self.entry.register(self.validar), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
- self.entry.configure(validate='key', validatecommand=vcdm) # Le función de validación 'vcdm'
- self.lbl_mensaje.grid(row=0, column=0)
- self.entry.grid(row=1, column=0)
- self.entry.focus()
- self.entry.bind('<Return>', self.on_return)
- def on_return(self, event):
- """Comprueba si se acertó al numero objetivo y lo deja saber con un mensaje"""
- if self.entry.get():
- self.pasar_numero(int(self.entry.get()))
- self.comprobar_numero()
- self.entry.delete(0, END) # Limpiamos el entry para nuevo ingreso
- self.lbl_mensaje['text'] = self.mensaje
- def validar(self, d, i, P, s, S, v, V, W):
- """Valida los valores ingresados:
- No se permiten: letras, ni símbolos, ni que el número empieze con cero, ni que haya mas de 3 cifras."""
- if d == '0': # Permitimos el borrado
- return True
- elif d == '1' and not S.isdigit(): # No permitimos ingresar letras ni símbolos
- ## print("No letras, símbolos, ni espacio")
- self.bell()
- return False
- elif d == '1': # Si se realiza una insercción
- if len(s) == 2 and int(s[0]) != 1 and int(S) != 0:
- ## print("No mas de 100 - caso 1")
- self.bell()
- return False
- elif len(s) == 2 and int(s) == 10 and int(S) != 0:
- ## print("No mas de 100:- caso 2")
- self.bell()
- return False
- elif len(s) == 3:
- ## print('No mas de tres')
- self.bell()
- return False
- elif len(s) == 2 and int(s) > 10:
- ## print('No mas de 100 - caso 3')
- self.bell()
- return False
- elif len(s) == 0 and int(S) == 0: # El número no puede empezar con 0
- ## print("Que no empieze con cero")
- self.bell()
- return False
- else:
- if int(P) > 100: # Evitamos obtener un numero mayor a 100 como resultado de pegar desde portapapeles
- ## print("El número resultante es muy grande")
- self.bell()
- return False
- else:
- return True
- def main():
- root = Tk()
- root.title("Adivina el número")
- root.resizable(False, False)
- game = InterfazGame(root, 101)
- game.pack()
- root.mainloop()
- if __name__ == '__main__':
- main()
Advertisement
Add Comment
Please, Sign In to add comment