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