Kibor
Отправлено: 09 Февраля, 2021 - 19:12:04
Эксперт
Покинул форум
Сообщений всего: 8203
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
Написание бота для Русская Рыбалка 3 в реальном времени с пояснениями.
Удобная структура программы.
Использование инструментов Кибор.
VIDEO
Скрипт
code (Отобразить ) CODE: win w=window (-1, -1, -1, -1, 1026, 735, -1);
if (w==0){messagebox ("Нет окна"); goto er;}
activate(w);
pause(1000);
win w2;
int Попловок[7][25];
if (load_images()==-1){messagebox ("Нет изображения"); goto er;}
enabletimer(0);
A:;
Заброс();
Подсечка();
Лов();
er:;
function Лов()
{
int Z=1;
keydown('g');
loop()
{
if (Z==1)
{
if (getcolor(451, 562, w)==0)
{
keyup('g');
Z=0;
}
}
if (Z==0)
{
if (getcolor(431, 562, w)!=0)
{
keydown('g');
Z=1;
}
}
sleep(10);
}
}
function Садок()
{
w2=window (-1, -1, -1, -1, 800, 600, -1);
if (w2!=0)
{
if (getcolor(5, 12, w2)==2050466)
{
sleep(500);
mouse(LEFT, 781, 16, 0, w2);
pause(1000);
goto global A;
}
}
}
function Еда()
{
w2=window (-1, -1, -1, -1, 330, 220, -1);
if (w2!=0)
{
if (getcolor(5, 12, w2)==539037)
{
sleep(500);
mouse(LEFT, 311, 16, 0, w2);
pause(1000);
/////////////
mouse(LEFT, 180, 683, 0, w);
pause(1000);
w2=window (-1, -1, -1, -1, 500, 390, -1);
if (w2!=0)
{
if (getcolor(5, 19, w2)==1918112)
{
sleep(500);
mouse(LEFT, 438, 271, 0, w2);
sleep(500);
mouse(LEFT, 486, 14, 0, w2);
pause(1000);
goto global A;
}
}
////////////
}
}
}
CREATE_TIMER(0, 1000)//Номер таймера, выполнение таймера через мсек.
{
Еда();
Садок();
}
function Подсечка()
{
int x, y;
while(findimage(1, #Попловок[0][0], -1, #x, #y, 0, 0, w.width, w.height, w)==1)sleep(50);
key(32);
sleep(500);
}
function Заброс()
{
mouse(LEFT, 477+rand(-10, 10), 298+rand(-10, 10), 0, w);
pause(1000);
}
function load_images()
{
if (loadimage (#Попловок[0][0], "C:\Рус_Рибалка3\imges\Попловок.bmp")<1) return -1;
return 1;
}
Kibor
Отправлено: 10 Февраля, 2021 - 13:59:53
Эксперт
Покинул форум
Сообщений всего: 8203
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
Доработка бота для Русская Рыбалка 3
Учим бот распознавать и парсить текст и вести лог о пойманной рыбе:
Название, вес, на что поймана и где.
VIDEO
Скрипт распознавания
code (Отобразить ) CODE: win w=window (-1, -1, -1, -1, 1026, 735, -1);
if (w==0){messagebox ("Нет окна"); goto er;}
activate(w);
pause(1000);
win w2;
string Text[4];
loadsymbolbase ("C:\basetext.sib");
mouse(LEFT, 272, 679, 0, w);
pause(1000);
s: w2=window (-1, -1, -1, -1, 800, 600, -1);
if (w2==0) goto s;
while (getcolor(5, 12, w2)!=2050466) sleep(50);
sleep(500);
readtext (NUM | RU | MARK, #Text[0], 6, 1, -1, -1, -1, -1, -1, 0, 0, 31, 49, 353, 129, w2);
regexreplace(-1, #Text[0], Text[0], "0", "о");
regexreplace(-1, #Text[0], Text[0], "3", "з");
//messagebox (Text[0]);//тест
regexreplace(-1, #Text[1], Text[1], " ", "");
regexsearch(1, #Text[1], Text[1], "(?<=:)(.*)(?=гр)");
regexreplace(-1, #Text[1], Text[1], "о", "0");
regexreplace(-1, #Text[1], Text[1], "з", "3");
//messagebox (Text[1]);//тест
regexreplace(1, #Text[2], Text[2], ": ", ":");
regexsearch(1, #Text[2], Text[2], "(?<=:)(.*)");
regexreplace(-1, #Text[2], Text[2], "0", "о");
regexreplace(-1, #Text[2], Text[2], "3", "з");
//messagebox (Text[2]);//тест
regexreplace(1, #Text[3], Text[3], ": ", ":");
regexsearch(1, #Text[3], Text[3], "(?<=:)(.*)");
regexreplace(-1, #Text[3], Text[3], "0", "о");
regexreplace(-1, #Text[3], Text[3], "3", "з");
//messagebox (Text[3]);//тест
if (fopen ("C:\Рус_Рибалка3\log.txt", "a")!=0)
{//если открылся
fwrite(Text[0]);
fwrite(ENDL);//записываем в файл перевод строки
fwrite(Text[1]);
fwrite(ENDL);//записываем в файл перевод строки
fwrite(Text[2]);
fwrite(ENDL);//записываем в файл перевод строки
fwrite(Text[3]);
fwrite(ENDL);//записываем в файл перевод строки
fwrite("----------------------------------------------");
fwrite(ENDL);//записываем в файл перевод строки
fclose();//закрываем файл
}
er:;
Скрипт бота с функцией распознавания
code (Отобразить ) CODE: win w=window (-1, -1, -1, -1, 1026, 735, -1);
if (w==0){messagebox ("Нет окна"); goto er;}
activate(w);
pause(1000);
win w2;
string Text[4];
loadsymbolbase ("C:\basetext.sib");
int Попловок[7][25];
if (load_images()==-1){messagebox ("Нет изображения"); goto er;}
enabletimer(0);
A:;
Заброс();
Подсечка();
Лов();
er:;
function Лог()
{
while (getcolor(5, 12, w2)!=2050466) sleep(50);
sleep(500);
readtext (NUM | RU | MARK, #Text[0], 6, 1, -1, -1, -1, -1, -1, 0, 0, 31, 49, 353, 129, w2);
regexreplace(-1, #Text[0], Text[0], "0", "о");
regexreplace(-1, #Text[0], Text[0], "3", "з");
//messagebox (Text[0]);//тест
regexreplace(-1, #Text[1], Text[1], " ", "");
regexsearch(1, #Text[1], Text[1], "(?<=:)(.*)(?=гр)");
regexreplace(-1, #Text[1], Text[1], "о", "0");
regexreplace(-1, #Text[1], Text[1], "з", "3");
//messagebox (Text[1]);//тест
regexreplace(1, #Text[2], Text[2], ": ", ":");
regexsearch(1, #Text[2], Text[2], "(?<=:)(.*)");
regexreplace(-1, #Text[2], Text[2], "0", "о");
regexreplace(-1, #Text[2], Text[2], "3", "з");
//messagebox (Text[2]);//тест
regexreplace(1, #Text[3], Text[3], ": ", ":");
regexsearch(1, #Text[3], Text[3], "(?<=:)(.*)");
regexreplace(-1, #Text[3], Text[3], "0", "о");
regexreplace(-1, #Text[3], Text[3], "3", "з");
//messagebox (Text[3]);//тест
if (fopen ("C:\Рус_Рибалка3\log.txt", "a")!=0)
{//если открылся
fwrite(Text[0]);
fwrite(ENDL);//записываем в файл перевод строки
fwrite(Text[1]);
fwrite(ENDL);//записываем в файл перевод строки
fwrite(Text[2]);
fwrite(ENDL);//записываем в файл перевод строки
fwrite(Text[3]);
fwrite(ENDL);//записываем в файл перевод строки
fwrite("----------------------------------------------");
fwrite(ENDL);//записываем в файл перевод строки
fclose();//закрываем файл
}
}
function Лов()
{
int Z=1;
keydown('g');
loop()
{
if (Z==1)
{
if (getcolor(451, 562, w)==0)
{
keyup('g');
Z=0;
}
}
if (Z==0)
{
if (getcolor(431, 562, w)!=0)
{
keydown('g');
Z=1;
}
}
sleep(10);
}
}
function Садок()
{
w2=window (-1, -1, -1, -1, 800, 600, -1);
if (w2!=0)
{
if (getcolor(5, 12, w2)==2050466)
{
sleep(500);
Лог();
mouse(LEFT, 781, 16, 0, w2);
pause(1000);
goto global A;
}
}
}
function Еда()
{
w2=window (-1, -1, -1, -1, 330, 220, -1);
if (w2!=0)
{
if (getcolor(5, 12, w2)==539037)
{
sleep(500);
mouse(LEFT, 311, 16, 0, w2);
pause(1000);
/////////////
mouse(LEFT, 180, 683, 0, w);
pause(1000);
w2=window (-1, -1, -1, -1, 500, 390, -1);
if (w2!=0)
{
if (getcolor(5, 19, w2)==1918112)
{
sleep(500);
mouse(LEFT, 438, 271, 0, w2);
sleep(500);
mouse(LEFT, 486, 14, 0, w2);
pause(1000);
goto global A;
}
}
////////////
}
}
}
CREATE_TIMER(0, 1000)//Номер таймера, выполнение таймера через мсек.
{
Еда();
Садок();
}
function Подсечка()
{
int x, y;
while(findimage(1, #Попловок[0][0], -1, #x, #y, 0, 0, w.width, w.height, w)==1)sleep(50);
key(32);
sleep(500);
}
function Заброс()
{
mouse(LEFT, 477+rand(-10, 10), 298+rand(-10, 10), 0, w);
pause(1000);
}
function load_images()
{
if (loadimage (#Попловок[0][0], "C:\Рус_Рибалка3\imges\Попловок.bmp")<1) return -1;
return 1;
}
Kibor
Отправлено: 11 Февраля, 2021 - 17:46:51
Эксперт
Покинул форум
Сообщений всего: 8203
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
Поиск и выбор не корректно распознанных пунктов меню в Русская Рыбалка 3 с помощью распознавания текста.
Пункт меню можно выбрать с помощью регулярного выражения, но на этом видео показано как распознавать меню и выбирать их в случае если текст не совсем корректно распознан, что не возможно сделать с помощью регулярного выражения. Используется вставка скрипта Python в скрипт Кибор.
VIDEO
Простой скрипт поиска пункта меню с помощью регулярного выражения (нельзя найти не корректно распознанный текст и зависим от перевода строк)
Все упрощается до нескольких строк
CODE: readtext (RU, #Text, 13, 1, -1, -1, -1, -1, #Color_Fon[0], 73, 0, 183, 92, 332, 528, w2);
if (regexsearch(1, #Text, Text, "продать на^r^nбарахолке")==1)
{
//regexstart возвращаем Номер символа в тексте с которого начинается найденный фрагмент текста
//symbolxpos symbolypos возвращают координаты указанного номера символа в распознанном тексте.
//Кликаем по координатам
mousemove(183+symbolxpos(regexstart(0))+20, 92+symbolypos(regexstart(0))-5, w2);
pause(1000);
}
Упрощенный скрипт
code (Отобразить ) CODE:
/*
Ищем пункт
Продать на
Барахолке
с помощью регулярного выражения
*/
win w=window (-1, -1, -1, -1, 1026, 735, -1);
if (w==0){messagebox ("Нет окна"); goto er;}
activate(w);
pause(1000);
win w2;
loadsymbolbase ("C:\basetext.sib");
int Color_Fon[1];
Color_Fon[0]=8421549;
mouse(LEFT, 272, 679, 0, w);
pause(1000);
s: w2=window (-1, -1, -1, -1, 800, 600, -1);
if (w2==0) goto s;
while (getcolor(5, 12, w2)!=2050466) sleep(50);
sleep(500);
mouse(LEFT, 53, 269, 0, w2);
pause(1000);
string Text;
loop(3)
{
if (Выбор_меню("продать на^r^nбарахолке")==1) break;
mouse(LEFT, 658, 499, 0, w2);
pause(1000);
}
er:;
function Выбор_меню(string Find)
{
readtext (RU, #Text, 13, 1, -1, -1, -1, -1, #Color_Fon[0], 73, 0, 183, 92, 332, 528, w2);
if (regexsearch(1, #Text, Text, Find)==1)
{
//regexstart возвращаем Номер символа в тексте с которого начинается найденный фрагмент текста
//symbolxpos symbolypos возвращают координаты указанного номера символа в распознанном тексте.
mousemove(183+symbolxpos(regexstart(0))+20, 92+symbolypos(regexstart(0))-5, w2);
pause(1000);
return 1;
}
return 0;
}
Более сложный с этого видео (можно найти некорректно распознанный текст и не зависим от перевода строк)
code (Отобразить ) CODE:
/*
Ищем пункт меню даже если он не корректно распознан
*/
if (runpython()==0){messagebox ("Не удалось запустить Python"); goto er;}//Запускаем интерпретатор Python
sendgetpython("import difflib");
win w=window (-1, -1, -1, -1, 1026, 735, -1);
if (w==0){messagebox ("Нет окна"); goto er;}
activate(w);
pause(1000);
win w2;
loadsymbolbase ("C:\basetext.sib");
int Color_Fon[1];
Color_Fon[0]=8421549;
mouse(LEFT, 272, 679, 0, w);
pause(1000);
s: w2=window (-1, -1, -1, -1, 800, 600, -1);
if (w2==0) goto s;
while (getcolor(5, 12, w2)!=2050466) sleep(50);
sleep(500);
mouse(LEFT, 53, 269, 0, w2);
pause(1000);
string Text2[50];
int k_menu;
string menu[50];
int x_menu[50], y_menu[50];
string menu_v=getcontrol(EDIT_0);
loop(3)
{
if (Выбор_меню()==1) break;
mouse(LEFT, 658, 499, 0, w2);
pause(1000);
}
closepython();//Завершаем работу с интерпретатором
er:;
function compare(string s1, string s2)
{
sendgetpython("s1=^'"+s1+"^'");
sendgetpython("s2=^'"+s2+"^'");
__python
normalized1 = s1.lower()
normalized2 = s2.lower()
matcher = difflib.SequenceMatcher(None, normalized1, normalized2)
__end_python
return formatsn(sendgetpython("matcher.ratio()"));
}
function Выбор_меню()
{
initialarray(#Text2[0], "");
readtext (RU, #Text2[0], 13, 1, -1, -1, -1, -1, #Color_Fon[0], 73, 0, 183, 92, 332, 528, w2);
//messagebox (Text2[0]);//тест
//messagebox (Text2[1]);//тест
k_menu=0;
for (int n=0; n<sizearray(Text2); n++)
{
if (Text2[n]=="")
{
k_menu++;
break;
}
//messagebox (Text2[n]);
if (n==0)
{
menu[k_menu]=Text2[n];
x_menu[k_menu]=symbolxpos(n, 0);
y_menu[k_menu]=symbolypos(n, 0);
}
else
{
if (symbolypos(n, 0)-symbolypos(n-1, 0)<20)menu[k_menu]=menu[k_menu]+" "+Text2[n];
else
{
k_menu++;
menu[k_menu]=Text2[n];
x_menu[k_menu]=symbolxpos(n, 0);
y_menu[k_menu]=symbolypos(n, 0);
}
}
}
//прадать на борахалке
//продать на барахолке
for (n=0; n<k_menu; n++)
{
//messagebox (menu[n]);//тест
//if (menu[n]==menu_v)
if (compare(menu[n], menu_v)>0.8)
{
mousemove(183+x_menu[n]+20, 92+y_menu[n]-5, w2);
pause(1000);
return 1;
}
}
return 0;
}
CREATE_INTERFACE
{
DIALOG "Название окна" 237 180 //РазмерX РазмерY
BUTTONSCRIPT "Запустить" 125 121 100 25 //ПозицияX ПозицияY РазмерX РазмерY
//Добавление контролов управления ......
STATIC_0 "Пункт меню" 10 10 90 18 //ПозицияX ПозицияY РазмерX РазмерY
EDIT_0 "продать на барахолке" 105 8 120 18 //ПозицияX ПозицияY РазмерX РазмерY
}
Kibor
Отправлено: 12 Февраля, 2021 - 02:05:54
Эксперт
Покинул форум
Сообщений всего: 8203
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
Скрипт который может найти некорректно распознанный текст и не зависим от перевода строк без использования Python.
Используется Кибор функция сравнения строк comparestr
code (Отобразить ) CODE:
/*
Ищем пункт меню даже если он не корректно распознан
*/
win w=window (-1, -1, -1, -1, 1026, 735, -1);
if (w==0){messagebox ("Нет окна"); goto er;}
activate(w);
pause(1000);
win w2;
loadsymbolbase ("C:\basetext.sib");
int Color_Fon[1];
Color_Fon[0]=8421549;
mouse(LEFT, 272, 679, 0, w);
pause(1000);
s: w2=window (-1, -1, -1, -1, 800, 600, -1);
if (w2==0) goto s;
while (getcolor(5, 12, w2)!=2050466) sleep(50);
sleep(500);
mouse(LEFT, 53, 269, 0, w2);
pause(1000);
string Text2[50];
int k_menu;
string menu[50];
int x_menu[50], y_menu[50];
string menu_v=getcontrol(EDIT_0);
loop(3)
{
if (Выбор_меню()==1) break;
mouse(LEFT, 658, 499, 0, w2);
pause(1000);
}
er:;
function Выбор_меню()
{
initialarray(#Text2[0], "");
readtext (RU, #Text2[0], 13, 1, -1, -1, -1, -1, #Color_Fon[0], 73, 0, 183, 92, 332, 528, w2);
//messagebox (Text2[0]);//тест
//messagebox (Text2[1]);//тест
k_menu=0;
for (int n=0; n<sizearray(Text2); n++)
{
if (Text2[n]=="")
{
k_menu++;
break;
}
//messagebox (Text2[n]);
if (n==0)
{
menu[k_menu]=Text2[n];
x_menu[k_menu]=symbolxpos(n, 0);
y_menu[k_menu]=symbolypos(n, 0);
}
else
{
if (symbolypos(n, 0)-symbolypos(n-1, 0)<20)menu[k_menu]=menu[k_menu]+" "+Text2[n];
else
{
k_menu++;
menu[k_menu]=Text2[n];
x_menu[k_menu]=symbolxpos(n, 0);
y_menu[k_menu]=symbolypos(n, 0);
}
}
}
//прадать на борахалке
//продать на барахолке
for (n=0; n<k_menu; n++)
{
//messagebox (menu[n]);//тест
//if (menu[n]==menu_v)
if (comparestr(menu[n], menu_v)>0.75)
{
mousemove(183+x_menu[n]+20, 92+y_menu[n]-5, w2);
pause(1000);
return 1;
}
}
return 0;
}
CREATE_INTERFACE
{
DIALOG "Название окна" 237 180 //РазмерX РазмерY
BUTTONSCRIPT "Запустить" 125 121 100 25 //ПозицияX ПозицияY РазмерX РазмерY
//Добавление контролов управления ......
STATIC_0 "Пункт меню" 10 10 90 18 //ПозицияX ПозицияY РазмерX РазмерY
EDIT_0 "продать на барахолке" 105 8 120 18 //ПозицияX ПозицияY РазмерX РазмерY
}