Как сделать бота?

Бот для игры Stronghold Kingdoms.

Эмулятор мыши на Python.
Как управлять движением мыши и кликами на Питоне.



Для опытных игроков Stronghold Kingdoms, играющих в игру несколько лет
и имеющих десятки замков, становится актуальной проблема ремонта
большого количества замков и обновления в них войск.

Эти действия достаточно однообразны и требуют, тем не менее,
тратить некоторое количество личного времени на щелканье мышью
и многочисленное повторение однообразных манипуляций.

Итак, рассмотрим вариант автоматизации некоторых основных действий
с помощью автономного управления движением мыши и кликами на объектах игры.

Допустим, имеется 20 замков. В каждом из них есть сохранение инфраструктуры
и расположения войск.

Наш эмулятор будет обходить каждый замок, ремонтировать постройки,
восстанавливать инфраструктуру и восстанавливать расположение войск.
Можно также каждый раз набирать некоторое количество лучников,
рыцарей или пикинеров.

Действия будут механическими и в этом варианте бота не будут присутствовать
даже зачатки искусственного интеллекта.

Начинаем программировать бота
для Stronghold Kingdoms на Python.



Stronghold Kingdoms использует стандартный Windows API для рабочего стола.
Поэтому первая строка нашей программы должна быть такой:

import win32api, win32con, time


Для использования библиотек win32api, win32con нужно установить
стандартное расширение pywin32 для Python. Содержит все модули.

Официальная страница:
https://pypi.python.org/pypi/pywin32

Тут можно выбрать версию под вашу систему и версию Python:
https://sourceforge.net/projects/pywin32/files/pywin32/Build%20220/


Теперь определим метод click, для выполнения действия “щелчок левой кнопкой мыши”:

def click(x,y):
    win32api.SetCursorPos((x,y))
    time.sleep(.1)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)
    time.sleep(.1)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)

Некоторую задержку времени выполнения программы в Питоне вызываем с помощью
метода time.sleep(). В качестве аргумента указываем секунды.

Наш метод перемещает курсор мыши в координаты (x, y)
и делает эмуляцию щелчка левой кнопкой мыши.


Теперь необходимо запрограммировать последовательность действий
и необходимые координаты для кликов мыши.

data=[      
       
       (1589,122), # 1. castle menu
       (1813,228), # 2. more menu 
       (1782,277), # 3. repair
       (1803,379), # 4. additional menu
       (1027,541), # 5. castle up repair
       (1065,726), # 6. ok
       (1773,299), # 7. accept             
       (1487,61)    # 8. change village
       
     ]

Здесь используются примерные координаты для полноэкранного режима игры
с разрешением монитора 1920 на 1080 точек.

Порядок координат и действий:

  1. Меню “Переключиться в режим замка”
  2. Кнопка “Открыть опции постройки замка”
  3. Кнопка “Починить”
  4. Кнопка “Дополнительные настройки”
  5. Кнопка “Восстановить инфраструктуру”
  6. Кнопка “Ок” , подтверждение, если ничего не размещено или пустой клик, в другом  случае.
  7. Кнопка “Принять изменения”, если они были или пустой клик, в противном  случае.
  8. Изменить деревню на следующую, кнопка “вправо”



Далее используем в цикле эти данные для нужных координат и щелчков мыши.

for i in range(20):    
    for k in range (8):        
        click(data[k][0], data[k][1])

В этом примере используется количество замков равное 20.
Для каждого замка последовательность действий повторяется.

Таким же образом программируется процесс восстановления войск и набора
некоторого стандартного количества новых бойцов в каждый замок.