Загрузка данных


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()