ProyectoFinalPython/solapas/TicTacToe.py

92 lines
3.2 KiB
Python

import time
import tkinter as tk
from tkinter import messagebox
import threading
import random
class TicTacToe:
def __init__(self, parent):
"""
Inicializa el juego de Tic Tac Toe.
Args:
parent (tk.Frame): Frame donde se colocará el juego.
"""
self.parent = parent
self.board = [""] * 9 # Representación del tablero 3x3
self.current_player = "X" # Jugador que inicia la partida
self.vs_computer = False # Modo jugador vs máquina
# Título del juego
title = tk.Label(self.parent, text="Tic Tac Toe", font=("Helvetica", 16, "bold"))
title.pack(pady=10)
# Botón para alternar entre modos de juego
self.mode_button = tk.Button(self.parent, text="Modo: Jugador vs Jugador", command=self.toggle_mode)
self.mode_button.pack(pady=5)
# Crear la cuadrícula del tablero
self.buttons = []
self.board_frame = tk.Frame(self.parent)
self.board_frame.pack()
for i in range(9):
button = tk.Button(
self.board_frame,
text="",
font=("Helvetica", 20),
width=5,
height=2,
command=self.create_button_command(i)
)
button.grid(row=i // 3, column=i % 3)
self.buttons.append(button)
# Mensaje que indica el turno del jugador
self.status_label = tk.Label(self.parent, text="Turno: X", font=("Helvetica", 12))
self.status_label.pack(pady=5)
def toggle_mode(self):
"""Alterna entre los modos Jugador vs Jugador y Jugador vs Máquina."""
self.vs_computer = not self.vs_computer
mode_text = "Modo: Jugador vs Máquina" if self.vs_computer else "Modo: Jugador vs Jugador"
self.mode_button.config(text=mode_text)
self.reset_game()
def reset_game(self):
"""Reinicia el juego a su estado inicial."""
self.board = [""] * 9
self.current_player = "X"
for button in self.buttons:
button.config(text="", state=tk.NORMAL)
self.status_label.config(text="Turno: X")
def make_move(self, index):
"""Registra un movimiento y actualiza el tablero."""
if self.board[index] == "":
self.board[index] = self.current_player
self.buttons[index].config(text=self.current_player)
winner = self.check_winner()
if winner:
self.end_game(f"¡Ganador: {winner}!")
return
elif "" not in self.board:
self.end_game("¡Empate!")
return
self.current_player = "O" if self.current_player == "X" else "X"
self.status_label.config(text=f"Turno: {self.current_player}")
def check_winner(self):
"""Verifica si hay un ganador en el juego."""
winning_combinations = [
(0, 1, 2), (3, 4, 5), (6, 7, 8), # Filas
(0, 3, 6), (1, 4, 7), (2, 5, 8), # Columnas
(0, 4, 8), (2, 4, 6) # Diagonales
]
for a, b, c in winning_combinations:
if self.board[a] == self.board[b] == self.board[c] and self.board[a] != "":
return self.board[a]
return None