Загрузка данных
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()