У меня есть игра, которую я пытаюсь автоматизировать. Игра работает так: на экране есть несколько лампочек, и только одна из них горит. При нажатии на него загорается еще один. Если вы нажмете не ту лампочку, вы будете оштрафованы на 5 секунд, и в общей сложности вы получите 60 секунд.
Мне удалось набрать 90 баллов по телефону. Однако я хотел бы получить более 150 или, по крайней мере, приблизиться.
Итак, я написал эту программу на C ++, но она набирает всего около 85 баллов.
#include <bits/stdc++.h>
#define _WIN32_WINNT 0x0500
#include"windows.h"
using namespace std;
inline bool if_yell(HDC &dc, int x, int y){
COLORREF color = GetPixel(dc, x, y);
if( (int)GetRValue(color)==251 && (int)GetGValue(color)==190 &&
(int)GetBValue(color)==43)return 1;
return 0;
}
int px[]={327,1014,508,849,332,1014,331,1015,501,849,670,676,564,689},py[]={214,214,385,386,558,558,903,901,731,730,561,904,657,891};
int main()
{
HDC dc = GetDC(NULL);
POINT _cursor;
COLORREF color;
int ls=-1;
while(1){
for(int i=0;i<14;++i){
if(if_yell(dc,px[i],py[i]) && ls!=i){
INPUT Inputs[3] = {0};
Inputs[0].type = INPUT_MOUSE;
Inputs[0].mi.dx = px[i]*34; // desired X coordinate
Inputs[0].mi.dy = py[i]*61; // desired Y coordinate
Inputs[0].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
Inputs[1].type = INPUT_MOUSE;
Inputs[1].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
Inputs[2].type = INPUT_MOUSE;
Inputs[2].mi.dwFlags = MOUSEEVENTF_LEFTUP;
SendInput(3, Inputs, sizeof(INPUT));
ls=i;
}
}
}
return 0;
}
Тогда я попытался использовать Selenium IDE. Я записал себя, играя, и вот что получилось Я добавил больше одинаковых команд и запустил его.
Это довольно быстро. Он набирает около 102 баллов, но я бы хотел получить еще лучший результат, если это возможно. Пожалуйста, помогите мне.
Я также думал об использовании AutoHotKey. После реализации чего-то похожего на код C ++ я обнаружил, что его производительность довольно посредственная. Но, возможно, поможет написание сценария для каждой лампочки, чтобы она работала быстрее. Я попытался запустить скрипт Selenium на компьютере с Linux и Windows, но безуспешно.
Изменить: Вы могли бы подумать, что C ++ будет нажимать кнопку почти мгновенно, но это не так. Так откуда же может возникнуть задержка?
Я сделал сценарий с Канту селен IDE для хрома потому что это поддерживает в то время как / ENDWHILE. С Pause 50
Команда, которую я набрал 180 и более надежно. И без паузы я даже > 280 очков, но иногда это слишком быстро, и игра зависает 😉
Ниже приведен мой сценарий, вы можете скопировать и вставить этот код непосредственно на вкладку «Представление исходного кода (JSON)» в IDE kantu.
{
"CreationDate": "2018-5-5",
"Commands": [
{
"Command": "store",
"Target": "fast",
"Value": "!replayspeed"},
{
"Command": "open",
"Target": "(URL HERE)",
"Value": ""},
{
"Command": "click",
"Target": "link=Start!",
"Value": ""},
{
"Command": "while",
"Target": "3 > 1",
"Value": ""},
{
"Command": "clickAt",
"Target": "css=#game > ul > li.active",
"Value": "87,85"},
{
"Command": "comment",
"Target": "Pause => Slow down a bit...",
"Value": ""},
{
"Command": "pause",
"Target": "50",
"Value": ""},
{
"Command": "endWhile",
"Target": "",
"Value": ""}
]
}
Вот скриншот:
Спасибо, что поделились URL. Это было весело 🙂
Других решений пока нет …