From 9abdca650ce8f87e8136575a0c94dc5d3136a39c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moran?= Date: Thu, 12 Dec 2024 13:03:44 +0100 Subject: [PATCH] Nuevo juego --- app/__pycache__/game.cpython-313.pyc | Bin 3828 -> 6937 bytes app/game.py | 142 +++++++++++++++++++-------- main.py | 8 +- 3 files changed, 106 insertions(+), 44 deletions(-) diff --git a/app/__pycache__/game.cpython-313.pyc b/app/__pycache__/game.cpython-313.pyc index f832a2856a17548d2396a804535fdc8f4a2bff90..6f64a2fe31e48a75447394dad0dd7e388796d3e2 100644 GIT binary patch literal 6937 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 diff --git a/app/game.py b/app/game.py index 09750e0..0ab6962 100644 --- a/app/game.py +++ b/app/game.py @@ -1,52 +1,112 @@ +import pygame import threading -import tkinter as tk import random import time +import tkinter as tk +from tkinter import Frame, Canvas, messagebox, Button class HiloJuego: - def __init__(self, frame): - self.frame = frame - - self.score = 0 + def __init__(self, parent): + self.parent = parent self.running = False - - self.label_score = tk.Label(frame, text=f"Puntaje: {self.score}", font=("Arial", 16), bg="lightgray") - self.label_score.pack(pady=10) - - self.start_button = tk.Button(frame, text="Iniciar Juego", command=self.iniciar_juego) - self.start_button.pack(pady=5) - - self.target_button = tk.Button(frame, text="¡Click me!", state="disabled", command=self.incrementar_puntaje) - self.target_button.pack(pady=20) - - def iniciar_juego(self): - self.running = True self.score = 0 - self.label_score.config(text=f"Puntaje: {self.score}") - self.start_button.config(state="disabled") - self.target_button.config(state="normal") - - # Hilo para mover el botón - self.hilo_movimiento = threading.Thread(target=self.mover_boton) - self.hilo_movimiento.daemon = True - self.hilo_movimiento.start() + self.misses = 0 # Contador de fallos + self.max_misses = 3 # Número máximo de fallos permitidos + self.circles = [] - def mover_boton(self): + # Crear el canvas dentro del frame proporcionado + self.canvas = Canvas(parent, width=200, height=100, bg="black") + self.canvas.pack(fill="both", expand=True) + + # Crear botón para iniciar el juego + self.start_button = Button(parent, text="Iniciar Juego", command=self.start_game) + self.start_button.pack(pady=10) + + class Circle: + def __init__(self, x, y, radius, duration): + self.x = x + self.y = y + self.radius = radius + self.duration = duration + self.appeared_at = time.time() + + def is_expired(self): + return time.time() - self.appeared_at > self.duration + + def generate_circles(self): while self.running: - x = random.randint(50, self.frame.winfo_width() - 100) - y = random.randint(50, self.frame.winfo_height() - 100) + x = random.randint(50, 750) + y = random.randint(50, 550) + radius = 40 + duration = random.uniform(1.5, 3.0) + circle = self.Circle(x, y, radius, duration) + self.circles.append(circle) + time.sleep(random.uniform(0.5, 1.5)) - self.target_button.place(x=x, y=y) - time.sleep(1) + def main_loop(self): + self.canvas.bind("", self.on_click) - def incrementar_puntaje(self): - self.score += 1 - self.label_score.config(text=f"Puntaje: {self.score}") - - #Fin del juego - if self.score >= 10: - self.running = False - self.start_button.config(state="normal") - self.target_button.config(state="disabled") - self.target_button.place_forget() - self.label_score.config(text=f"¡Juego Terminado! Puntaje final: {self.score}") + # Inicia el hilo para generar círculos + circle_thread = threading.Thread(target=self.generate_circles) + circle_thread.daemon = True + circle_thread.start() + + while self.running: + self.canvas.delete("all") + + # Dibujar círculos + for circle in self.circles[:]: + if circle.is_expired(): + self.circles.remove(circle) + self.misses += 1 + if self.misses >= self.max_misses: + self.end_game() + return + else: + self.canvas.create_oval( + circle.x - circle.radius, circle.y - circle.radius, + circle.x + circle.radius, circle.y + circle.radius, + outline="red", width=3 + ) + + # Mostrar puntaje y fallos + self.canvas.create_text(10, 10, anchor="nw", text=f"Score: {self.score}", fill="white", font=("Arial", 16)) + self.canvas.create_text(10, 40, anchor="nw", text=f"Misses: {self.misses}/{self.max_misses}", fill="white", font=("Arial", 16)) + + self.canvas.update() + time.sleep(0.016) + + def on_click(self, event): + if not self.running: + return + x, y = event.x, event.y + hit = False + for circle in self.circles[:]: + if (x - circle.x) ** 2 + (y - circle.y) ** 2 <= circle.radius ** 2: + self.score += 1 + self.circles.remove(circle) + hit = True + break + if not hit: + self.misses += 1 + if self.misses >= self.max_misses: + self.end_game() + + def start_game(self): + if not self.running: + self.running = True + self.score = 0 + self.misses = 0 + self.circles = [] + self.start_button.pack_forget() # Ocultar el botón al iniciar el juego + game_thread = threading.Thread(target=self.main_loop) + game_thread.daemon = True + game_thread.start() + + def end_game(self): + self.running = False + messagebox.showinfo("Game Over", f"Has perdido. Puntaje final: {self.score}") + self.start_button.pack(pady=10) # Mostrar el botón nuevamente al finalizar el juego + + def stop(self): + self.running = False diff --git a/main.py b/main.py index b5b8a03..f767625 100644 --- a/main.py +++ b/main.py @@ -126,8 +126,10 @@ for i in range(1, 6): notebook.add(tab, text="Gestor de tareas", padding=4) gestor_tareas.GestorTareas(tab) elif i == 4: - notebook.add(tab,text='Juego', padding=4) - hilo_juego = game.HiloJuego(tab) + notebook.add(tab, text='Juego', padding=4) + game_frame = tk.Frame(tab) + game_frame.pack(fill="both", expand=True) + hilo_juego = game.HiloJuego(game_frame) else: notebook.add(tab, text=f"Solapa {i}", padding=4) # Añadir un Label en cada solapa para diferenciarla @@ -197,4 +199,4 @@ panel_i = panel_izquierdo.PanelIzquierdo(frame_izquierdo, text_scrapping) root.protocol("WM_DELETE_WINDOW", detener_aplicacion) # Ejecución de la aplicación -root.mainloop() \ No newline at end of file +root.mainloop()