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


import time
import keyboard
from analysis import ChessAnalyzer
import crop


class ChessLogic:
    def __init__(self):
        self.analyzer = ChessAnalyzer()
        
        # Флаги управления состоянием
        self.trigger_analysis = False
        self.is_analyzed = False
        
        # Состояние доски 8x8 (содержит символы фигур, например: 'wP', 'bK' или '')
        self.board_state = []
        
        self.active_color = 'w'  # 'w' - белые, 'b' - черные
        self.en_passant_target = None

    def convert_coords_to_notation(self, row, col):
        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 on_hotkey_pressed(self):
        """Хук клавиатуры взводит флаг запуска"""
        self.trigger_analysis = True

    def process_initial_analysis(self):
        """Первичная фиксация расстановки доски через ChessAnalyzer"""
        print("\n[!] Нажата 'S'. Первичный анализ доски через ChessAnalyzer...")
        
        # Получаем кадр (изображение доски или экрана)
        board_img = crop.get_board_image() if hasattr(crop, 'get_board_image') else crop.find_chessboard_strictly_1to1()[1]

        if board_img is None:
            print("[!] Ошибка: Не удалось получить изображение доски!")
            return

        # Анализируем доску напрямую через analysis
        self.board_state = self.analyzer.get_board_state(board_img)
        
        if self.board_state:
            self.is_analyzed = True
            print("[✓] Начальная позиция успешно проанализирована!")
            self.print_board()
            print(f"Начальный FEN: {self.get_fen_string()}\n")
        else:
            print("[!] Ошибка: не удалось распознать фигуры на доске.")

    def get_fen_string(self):
        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)

        position_fen = "/".join(fen_rows)
        
        ep_str = "-"
        if self.en_passant_target:
            ep_str = self.convert_coords_to_notation(*self.en_passant_target['target_pos'])

        return f"{position_fen} {self.active_color} KQkq {ep_str} 0 1"

    def print_board(self):
        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
            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 track_board_changes(self):
        """
        Постоянный опрос ChessAnalyzer:
        Запрашивает новый снимок, сравнивает его с сохранённой матрицей self.board_state
        и регистрирует смену позиции при изменении.
        """
        # Захватываем текущий кадр
        board_img = crop.get_board_image() if hasattr(crop, 'get_board_image') else crop.find_chessboard_strictly_1to1()[1]
        
        if board_img is None:
            return

        # Получаем актуальное состояние доски от анализатора
        new_board_state = self.analyzer.get_board_state(board_img)

        if not new_board_state:
            return

        # Проверяем, изменилась ли позиция по сравнению с сохранённой
        if new_board_state != self.board_state:
            print("[⚡ CHANGE DETECTED]: Анализатор зафиксировал изменение на доске!")
            self.board_state = new_board_state
            
            # Переключаем очерёдность хода
            self.active_color = 'b' if self.active_color == 'w' else 'w'
            
            self.print_board()
            print(f"Обновленный FEN: {self.get_fen_string()}\n")

    def run(self):
        print("=========================================")
        print(" Шахматный бот запущен.")
        print(" Нажмите 'S' для старта постоянного анализа.")
        print("=========================================")

        keyboard.add_hotkey('s', self.on_hotkey_pressed)

        try:
            while True:
                # 1. Если была нажата 'S', запускаем первичный анализ
                if self.trigger_analysis:
                    self.trigger_analysis = False
                    self.process_initial_analysis()

                # 2. После включения постоянно запрашиваем данные у analysis.py
                if self.is_analyzed:
                    self.track_board_changes()

                time.sleep(0.2)  # Частота опроса анализатора

        except KeyboardInterrupt:
            print("\nПрограмма завершена.")


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