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