import time
import ctypes
import pyautogui
# 1. Отключаем проблемы с масштабированием экрана в Windows (125%, 150%)
try:
ctypes.windll.shcore.SetProcessDpiAwareness(2)
except Exception:
try:
ctypes.windll.user32.SetProcessDpiAware()
except Exception:
pass
# Задержка между действиями pyautogui
pyautogui.PAUSE = 0.05
def square_to_screen_coords(square_str, roi, is_black=False):
"""
Преобразует нотацию клетки ('e2') в координаты на экране (X, Y)
на основе прямоугольника доски roi = {'left': ..., 'top': ..., 'width': ..., 'height': ...}
"""
col_file = square_str[0] # 'a' - 'h'
row_rank = square_str[1] # '1' - '8'
col_idx = ord(col_file) - ord('a')
row_idx = 8 - int(row_rank)
# Если играем за чёрных — доска развернута на 180 градусов
if is_black:
col_idx = 7 - col_idx
row_idx = 7 - row_idx
cell_w = roi["width"] / 8.0
cell_h = roi["height"] / 8.0
# Вычисляем центр клетки
center_x = int(roi["left"] + (col_idx + 0.5) * cell_w)
center_y = int(roi["top"] + (row_idx + 0.5) * cell_h)
return center_x, center_y
def execute_move(move_uci, roi, is_black=False):
"""
Делает физические клики мышью по доске.
"""
if not move_uci or len(move_uci) < 4:
return
from_sq = move_uci[0:2]
to_sq = move_uci[2:4]
x_from, y_from = square_to_screen_coords(from_sq, roi, is_black)
x_to, y_to = square_to_screen_coords(to_sq, roi, is_black)
# Клик 1: Исходная фигура
pyautogui.click(x_from, y_from)
time.sleep(0.05)
# Клик 2: Клетка назначения
pyautogui.click(x_to, y_to)
# 3. Если это превращение пешки (например, 'e7e8q')
if len(move_uci) == 5:
time.sleep(0.1)
# Клик по выбору Ферзя
pyautogui.click(x_to, y_to)