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


import time
import keyboard
from analysis import ChessAnalyzer
import crop


class ChessLogic:
    def __init__(self):
        self.analyzer = ChessAnalyzer()
        # Доска 8x8 в формате FEN символов ("P", "n", "" и т.д.)
        self.board_state = []
        self.is_analyzed = False
        
        # Чей ход по умолчанию (w - белые, b - черные)
        self.active_color = 'w'

    def start_initial_analysis(self):
        """Запускается при нажатии клавиши 'S'"""
        print("\n[!] Нажата клавиша 'S'. Запуск первичного анализа доски...")
        
        # Единоразовый запрос к analysis.py
        self.board_state = self.analyzer.analyze_initial_board()
        
        if self.board_state:
            self.is_analyzed = True
            print("[✓] Первичный анализ завершен!")
            self.print_board()
            print(f"Текущая FEN строка: {self.get_fen_string()}")
        else:
            print("[!] Ошибка при анализе доски.")

    def get_fen_string(self):
        """
        Преобразует текущую матрицу 8x8 в официальную FEN-строку позиции
        """
        if not self.board_state:
            return ""

        fen_rows = []
        for row in self.board_state:
            empty_count = 0
            row_fen = ""
            for cell in row:
                if cell == "":
                    empty_count += 1
                else:
                    if empty_count > 0:
                        row_fen += str(empty_count)
                        empty_count = 0
                    row_fen += cell
            if empty_count > 0:
                row_fen += str(empty_count)
            fen_rows.append(row_fen)

        # Собираем все 8 горизонталей через слэш
        position_fen = "/".join(fen_rows)
        
        # Полная FEN строка (Позиция + Чей ход + Рокировки + Взятие на проходе + Полуходы + Ходы)
        full_fen = f"{position_fen} {self.active_color} KQkq - 0 1"
        return full_fen

    def convert_coords_to_notation(self, row, col):
        """Переводит индексы (0..7, 0..7) в шахматные клетки (a8...h1)"""
        files = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
        ranks = ['8', '7', '6', '5', '4', '3', '2', '1']
        return f"{files[col]}{ranks[row]}"

    def print_board(self):
        """Вывод доски в консоль (Символы FEN)"""
        if not self.board_state:
            return
        
        print("\n    a   b   c   d   e   f   g   h")
        print("  +-------------------------------+")
        for i, row in enumerate(self.board_state):
            rank = 8 - i
            # Отображение символов FEN (Белые заглавные, Черные строчные)
            row_str = " | ".join([p if p != "" else "." for p in row])
            print(f"{rank} | {row_str} | {rank}")
            print("  +-------------------------------+")
        print("    a   b   c   d   e   f   g   h\n")

    def process_move_from_crop(self, from_cell, to_cell):
        """
        Обработка передвижения фигуры по координатам
        Пример: from_cell = (6, 4), to_cell = (4, 4)  # e2 -> e4
        """
        if not self.is_analyzed:
            print("[!] Сначала нажмите 'S' для анализа!")
            return

        from_row, from_col = from_cell
        to_row, to_col = to_cell

        moved_piece = self.board_state[from_row][from_col]

        if not moved_piece:
            print(f"[?] Клетка {self.convert_coords_to_notation(from_row, from_col)} была пустой!")
            return

        from_not = self.convert_coords_to_notation(from_row, from_col)
        to_not = self.convert_coords_to_notation(to_row, to_col)

        print(f"[♟] Ход: {moved_piece} ({from_not} -> {to_not})")

        # Переставляем фигуру в памяти
        self.board_state[to_row][to_col] = moved_piece
        self.board_state[from_row][from_col] = ""

        # Меняем очередность хода (w <-> b)
        self.active_color = 'b' if self.active_color == 'w' else 'w'

        self.print_board()
        print(f"Обновленный FEN: {self.get_fen_string()}")

    def run(self):
        """Главный цикл программы"""
        print("=========================================")
        print(" Шахматный бот запущен.")
        print(" Нажмите клавишу 'S' на клавиатуре,")
        print(" чтобы распознать начальную расстановку.")
        print("=========================================")

        # Горячая клавиша S
        keyboard.add_hotkey('s', self.start_initial_analysis)

        try:
            while True:
                time.sleep(0.1)

        except KeyboardInterrupt:
            print("\nПрограмма остановлена.")


if __name__ == '__main__':
    logic = ChessLogic()
    logic.run()