Загрузка данных
import tkinter as tk
from tkinter import messagebox
import socket
import threading
import random
HOST = 'localhost' # Или IP сервера
PORT = 12345
class TicTacToeClient:
def __init__(self, master):
self.master = master
self.master.title("Крестики-Нолики")
self.sock = None
self.my_turn = False
self.symbol = None # 'X' или 'O'
self.create_main_menu()
def create_main_menu(self):
self.menu_frame = tk.Frame(self.master)
self.menu_frame.pack()
self.btn_find = tk.Button(self.menu_frame, text="Найти игрока", command=self.connect_to_server)
self.btn_find.pack(padx=10, pady=10)
def connect_to_server(self):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
self.sock.connect((HOST, PORT))
threading.Thread(target=self.listen_server, daemon=True).start()
except Exception as e:
messagebox.showerror("Ошибка", f"Не удалось подключиться: {e}")
def listen_server(self):
while True:
try:
data = self.sock.recv(1024)
if not data:
break
message = data.decode()
if message.startswith("START"):
# Игра началась
_, num = message.split()
self.create_game_board()
if random.choice([True, False]):
self.symbol = 'X'
self.my_turn = True
messagebox.showinfo("Информация", "Вам выпало ходить первым.")
self.enable_buttons()
self.status_label.config(text="Ваш ход")
else:
self.symbol = 'O'
self.my_turn = False
messagebox.showinfo("Информация", "Вам ходить вторым.")
self.disable_buttons()
self.status_label.config(text="Ожидание хода")
elif message == "YOUR_TURN":
self.my_turn = True
self.enable_buttons()
self.status_label.config(text="Ваш ход")
elif message.startswith("OPPONENT_MOVE"):
_, move = message.split()
row, col = map(int, move.split(','))
self.buttons[row][col].config(text='O' if self.symbol == 'X' else 'X')
self.disable_buttons()
self.status_label.config(text="Ваш ход")
else:
pass
except:
break
def create_game_board(self):
self.menu_frame.destroy()
self.board_frame = tk.Frame(self.master)
self.board_frame.pack()
self.buttons = []
for i in range(3):
row = []
for j in range(3):
btn = tk.Button(self.board_frame, text="", width=10, height=3,
command=lambda r=i, c=j: self.make_move(r, c))
btn.grid(row=i, column=j)
row.append(btn)
self.buttons.append(btn)
self.status_label = tk.Label(self.master, text="Ожидание хода")
self.status_label.pack()
def make_move(self, row, col):
if self.buttons[row][col]['text'] == "" and self.my_turn:
symbol = 'X' if self.symbol == 'X' else 'O'
self.buttons[row][col].config(text=symbol)
move_str = f"{row},{col}"
self.sock.sendall(move_str.encode())
self.disable_buttons()
self.status_label.config(text="Ожидание хода")
self.my_turn = False
def enable_buttons(self):
for row in self.buttons:
for btn in row:
if btn['text'] == "":
btn.config(state='normal')
def disable_buttons(self):
for row in self.buttons:
for btn in row:
btn.config(state='disabled')
if __name__ == "__main__":
root = tk.Tk()
app = TicTacToeClient(root)
root.mainloop()