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


import chess
import chess.engine

class ChessEngine:
    def __init__(self, engine_path="stockfish.exe", time_limit=0.1):
        self.engine_path = engine_path
        self.time_limit = time_limit
        self.engine = None
        self.enabled = True  # Флаг активности Stockfish
        self._start_engine()

    def _start_engine(self):
        try:
            self.engine = chess.engine.SimpleEngine.popen_uci(self.engine_path)
            
            # Экономия ОЗУ под 2 ГБ системы
            options = {
                "Hash": 16,
                "Threads": 1
            }
            for key, value in options.items():
                if key in self.engine.options:
                    self.engine.configure({key: value})
                    
            print("[ОК] Stockfish запущен!")
        except Exception as e:
            print(f"[ПРЕДУПРЕЖДЕНИЕ] Движок не найден по пути {self.engine_path}. Работаем без Stockfish.")
            self.enabled = False

    def toggle(self):
        """Переключает активное состояние движка."""
        self.enabled = not self.enabled
        return self.enabled

    def analyze_fen(self, fen):
        if not self.enabled or not self.engine:
            return None, "Движок отключен [S - включить]"

        try:
            board = chess.Board(fen)
            result = self.engine.analyse(board, chess.engine.Limit(time=self.time_limit))
            
            best_move = result.get("pv")[0] if "pv" in result and result["pv"] else None
            score = result.get("score")

            if score.is_mate():
                eval_str = f"Мат в {score.relative.mate()}"
            else:
                cp = score.relative.score() / 100.0
                eval_str = f"{'+' if cp > 0 else ''}{cp:.2f}"

            return best_move.uci() if best_move else None, eval_str

        except Exception as e:
            return None, f"Ошибка FEN: {e}"

    def close(self):
        if self.engine:
            self.engine.quit()