From 332d0465b6425c98a744e0d98ca7cb7b2dec35f7 Mon Sep 17 00:00:00 2001 From: Santiago Parra Date: Fri, 13 Dec 2024 23:15:46 +0100 Subject: [PATCH] Implemetacion de la tercra solapa que es el juego del tictactou --- app/main.py | 11 ++- app/widgets/TicTacToeTab.py | 83 ++++++++++++++++++ .../__pycache__/TicTacToeTab.cpython-313.pyc | Bin 0 -> 6128 bytes 3 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 app/widgets/TicTacToeTab.py create mode 100644 app/widgets/__pycache__/TicTacToeTab.cpython-313.pyc diff --git a/app/main.py b/app/main.py index b22d801..4088df4 100644 --- a/app/main.py +++ b/app/main.py @@ -1,19 +1,19 @@ +import threading import tkinter as tk from tkinter import Menu from tkinter import ttk -import threading +from app.ConfigMgr import ConfigMgr from app.chat_server.Server import Server from app.widgets import ClockLabel -from app.ConfigMgr import ConfigMgr from app.widgets.ChatTab import ChatTab from app.widgets.MusicDownloadTab import MusicDownloadTab from app.widgets.MusicPlayerTab import MusicPlayerTab +from app.widgets.TicTacToeTab import TicTacToeTab from app.widgets.TodoTab import TodoTab from app.widgets.UsageLabels import CPULabel, RAMLabel, BatteryLabel, NetworkLabel from app.widgets.WeatherTab import WeatherTab - stop_event = threading.Event() def on_closing(): @@ -128,6 +128,11 @@ todo_tab = TodoTab(notebook, stop_event=stop_event) todo_tab.pack(fill="both", expand=True) notebook.add(todo_tab, text="Todo List") +# Add the TodoTab to the notebook +tic_tac_toe_tab = TicTacToeTab(notebook, stop_event=stop_event) +tic_tac_toe_tab.pack(fill="both", expand=True) +notebook.add(tic_tac_toe_tab, text="Tic Tac Toe") + # Create the chat and music player frames within the right frame frame_chat = tk.Frame(frame_right, bg="lightgreen") frame_music_player = tk.Frame(frame_right) diff --git a/app/widgets/TicTacToeTab.py b/app/widgets/TicTacToeTab.py new file mode 100644 index 0000000..d69cf3f --- /dev/null +++ b/app/widgets/TicTacToeTab.py @@ -0,0 +1,83 @@ +import tkinter as tk +from tkinter import Frame, Button, Label, StringVar, messagebox +from app.widgets.abc import ThreadedTab + +class TicTacToeTab(ThreadedTab): + + def __init__(self, root: Frame | tk.Tk, **kwargs): + self.current_player = StringVar(value="X") # Start with player X + self.board = [[None for _ in range(3)] for _ in range(3)] # 3x3 board + super().__init__(root, **kwargs) + + def build(self): + # Create the main frame for the Tic Tac Toe interface + self.game_frame = Frame(self) + self.game_frame.pack(fill="both", expand=True) + + # Create the label to display the current player + self.player_label = Label(self.game_frame, textvariable=self.current_player, font=("Arial", 16)) + self.player_label.pack(padx=5, pady=5) + + # Create the grid for the Tic Tac Toe board + self.board_frame = Frame(self.game_frame) + self.board_frame.pack(expand=True) + + for row in range(3): + for col in range(3): + button = Button( + self.board_frame, + text="", + font=("Arial", 24), + width=5, + height=2, + command=lambda r=row, c=col: self.make_move(r, c) + ) + button.grid(row=row, column=col, padx=5, pady=5) + self.board[row][col] = button + + def make_move(self, row, col): + button = self.board[row][col] + # Check if the cell is already occupied + if button["text"] == "": + button["text"] = self.current_player.get() + if self.check_winner(): + messagebox.showinfo("Game Over", f"Player {self.current_player.get()} wins!") + self.reset_board() + elif self.is_draw(): + messagebox.showinfo("Game Over", "It's a draw!") + self.reset_board() + else: + self.switch_player() + else: + messagebox.showwarning("Invalid Move", "This cell is already taken!") + + def switch_player(self): + self.current_player.set("O" if self.current_player.get() == "X" else "X") + + def check_winner(self): + # Check rows, columns, and diagonals + for i in range(3): + if self.board[i][0]["text"] == self.board[i][1]["text"] == self.board[i][2]["text"] != "": + return True + if self.board[0][i]["text"] == self.board[1][i]["text"] == self.board[2][i]["text"] != "": + return True + if self.board[0][0]["text"] == self.board[1][1]["text"] == self.board[2][2]["text"] != "": + return True + if self.board[0][2]["text"] == self.board[1][1]["text"] == self.board[2][0]["text"] != "": + return True + return False + + def is_draw(self): + # Check if all cells are filled + return all(self.board[row][col]["text"] != "" for row in range(3) for col in range(3)) + + def reset_board(self): + # Clear the board + for row in range(3): + for col in range(3): + self.board[row][col]["text"] = "" + self.current_player.set("X") + + def task(self): + # Placeholder for threaded behavior if needed + pass diff --git a/app/widgets/__pycache__/TicTacToeTab.cpython-313.pyc b/app/widgets/__pycache__/TicTacToeTab.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c9fb437a6b6c4a59fcf8fd6e35f0964553ca2ab GIT binary patch literal 6128 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 k_-?bxG7R%~QvFYI