Andrew |
Отправлено: 19 Августа, 2013 - 16:51:52
|
Участник
Покинул форум
Сообщений всего: 118
Дата рег-ции: Июнь 2013
Откуда: Россия
Репутация: 9
|
HACMOPK , Так я посмотрел, сейчас скрипт набросаю, пока могу сказать, что экран надо разделить на несколько частей и искать противника по частям экрана а не сразу. Ну думаю так. Сейчас подробней рассмотрю игру.
(Добавление)
Сыграл пару боев, что об игре:
Карта динамическая почти везде, некоторые пиксили только не динамичны, статического экрана почти нет.
Если даже искать противника, стоя на одном месте, то при попадании экран трясется и опять же экран полностью динамичен.
Можно конечно находить союзников, только у союзников полоска хп, как я понял, расцветки танков у всех разные-предугадать невозможно.
Сейчас ещё в другие бои по захожу, посмотрю. |
|
|
Kibor |
Отправлено: 19 Августа, 2013 - 19:11:06
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
HACMOPK пишет: вот такой скрипт
Какой принцип работы того скрипта?
Если просто крутить башней и искать определенные цветные пикселя перед собой то по моему это ерунда, но к сожалению мне ничего не приходит лучшего в голову.
Можно ли его переложить на скрипт Кибор и посмотреть как его улучшать?
HACMOPK пишет: как передать время нажатия ума не приложу
Если можно идентифицировать врага по цвету пикселя то примерно такой код (псевдо)
Время нажатия передавать не надо. Надо просто в цикле проверять положение искомого пикселя и нажимать на кнопку поворота.
CODE: a: if (есть на экране искомый пиксель)
{
найти положение искомого цвета пикселя;
if (пиксель_искомый_не по центру)
{
посчитать какую кнопку надо нажать;
нажать на кнопку поворота;
goto a;
}
жать пробел;
}
goto a; |
|
|
HACMOPK |
Отправлено: 19 Августа, 2013 - 20:30:19
|
Участник
Покинул форум
Сообщений всего: 84
Дата рег-ции: Май 2013
Репутация: 4
|
Kibor пишет: Если просто крутить башней и искать определенные цветные пикселя перед собой то по моему это ерунда, но к сожалению мне ничего не приходит лучшего в голову.
немного не так в скрипте задано время в миллисекундах (W-это время поворота башни на 90°) далее все что слева имеет отрицательное значение, все что справа положительное. Центр экрана принимается за начальную точку отсчета или за 0°, далее идет поиск цвета ±5°и так далее т.е получается 18 зон и в зависимости от того где был найден цвет будет нажата та или иная клавиша определенное время. Потом снова происходит поиск цвета.
Kibor пишет:
Время нажатия передавать не надо. Надо просто в цикле проверять положение искомого пикселя и нажимать на кнопку поворота.
Думал о таком варианте, но думаю будет большая нагрузка на процессор и при обнаружении нескольких цветов в разных частях экрана ... в общем ничего хорошего. |
|
|
Kibor |
Отправлено: 20 Августа, 2013 - 13:03:16
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
HACMOPK пишет: будет большая нагрузка на процессор
Не будет. Картинки ищутся довольно быстро. Все боты в Кибор построены на зацикливание поиска изображений и ничего не грузит..
HACMOPK пишет: при обнаружении нескольких цветов в разных частях экрана
Надо сортировать найденные цвета по расстоянию с помощью sort... Тогда будет учитываться ближний к центру...
Вот примерный код самонаведения если враг в области видимости (его ник). Не учитывается область экрана справа где идут данные боя. Чат и все отключено.
Этот код очень не оптимален можно еще дорабатывать для улучшения результатов.
В основе предложенный мной алгоритм.
Главная проблема инерция картинки при повороте...
Для боев красные и синие.
В коде надо выбирать строки:
color_vrag[0][0]=13597755;//я красн
//color_vrag[0][0]=1389551;//я синий
CODE:int col, ex, ey;
getdisplay(col, ex, ey);
int C_ex=ex/2, C_ey=ey/2;
int v_X[5000], v_Y[5000];
int k;
int rast;
int color_vrag[1][1];
int min_max=15;
color_vrag[0][0]=13597755;//я красн
//color_vrag[0][0]=1389551;//я синий
int rrt=100;
int rrt1=50;
int rast1;
int pr;
int bx, bz, bp;
sleep(1000);
key('z');
key('x');
key(SPACE);
lo:;
key('c');
if (bz==1) {bz=0; keyup('z');}
if (bx==1) {bx=0; keyup('x');}
if (bp==1) {bp=0; keyup(SPACE);}
k=findimage(-1, #color_vrag[0][0], 0, #v_X[0], #v_Y[0], 0, 118, ex-280, ey-150, min_max, min_max, min_max, min_max, min_max, min_max, 100, 1, -1);
if (k>0)
{
sort(C_ex, C_ey, #v_X[0], #v_Y[0], k);
rast=C_ex-v_X[0];
rast1=rast;
if (rast1<0)rast1=-rast1;
///////////////////////////////////////////////////
if (rast1<=rrt)
{
bp=1; keydown(SPACE);
bit();
bp=0; keyup(SPACE);
goto lo;
}
if (rast>rrt)
{
bz=1; keydown('z');
r: k=findimage(-1, #color_vrag[0][0], 0, #v_X[0], #v_Y[0], 0, 118, ex-280, ey-150, min_max, min_max, min_max, min_max, min_max, min_max, 100, 1, -1);
if (k>0)
{
sort(C_ex, C_ey, #v_X[0], #v_Y[0], k);
rast=C_ex-v_X[0];
if (rast>rrt)goto r;
bz=0; keyup('z');
bp=1; keydown(SPACE);
keydown('x');
sleep(200);
keyup('x');
bit();
bp=0; keyup(SPACE);
}
goto lo;
}
if (rast<-rrt)
{
bx=1; keydown('x');
r1: k=findimage(-1, #color_vrag[0][0], 0, #v_X[0], #v_Y[0], 0, 118, ex-280, ey-150, min_max, min_max, min_max, min_max, min_max, min_max, 100, 1, -1);
if (k>0)
{
sort(C_ex, C_ey, #v_X[0], #v_Y[0], k);
rast=C_ex-v_X[0];
if (rast<-rrt)goto r1;
bx=0; keyup('x');
bp=1; keydown(SPACE);
keydown('z');
sleep(200);
keyup('z');
bit();
bp=0; keyup(SPACE);
}
goto lo;
}
////////////////////////////////////////////////
}
goto lo;
function bit()
{
pr=0;
q: k=findimage(-1, #color_vrag[0][0], 0, #v_X[0], #v_Y[0], 0, 118, ex-280, ey-150, min_max, min_max, min_max, min_max, min_max, min_max, 100, 1, -1);
if (k>0)
{
sort(C_ex, C_ey, #v_X[0], #v_Y[0], k);
rast=C_ex-v_X[0];
rast1=rast;
if (rast1<0)rast1=-rast1;
if (rast1<=rrt1)
{
pr=0;
sleep(20);
goto q;
}
}
if (pr<10)
{
pr++;
sleep(5);
goto q;
}
}
|
|
|
Kibor |
Отправлено: 22 Августа, 2013 - 18:41:47
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Вот доработанный скрипт для Танки Онлайн ( tankionline com )
Видео работы: автонаводки и боя в Танки онлайн
довольно неплохо наводит прицел на цели и бьет в области видимости экрана.
Можно использовать как в игре управляя танком, так и поставив танк где то в углу и наблюдать со стороны..
Настроен на бои красные синие...
В скрипте надо настроить область поиска так , что бы не попал чат боя (тот что справа)в поиск. Чат сообщений отключить. Все отключить...
Область поиска настраивается так:
findimage(-1, #color_vrag[0][0], 0, #v_X[0], #v_Y[0], 0, 118, ex-280, ey-150......
0-так оставить
118 - координата у верхнего левого угла. указать ниже панелей в игре
ex-280 - 280 это ширина чата боя..
ey-150 - 150 это высота на которую надо поднять нижнюю часть области поиска (что б не попала панель задач и браузер)
Область правого чата боя слепая... там не видит...
Может позже выложу полноценного бота, который будет сам крутить башкой...
Пока ищется только в пределах видимости..
Красным что можно подстраивать
Настроен на экран 1366 768
Цитата: int col, ex, ey;
getdisplay(col, ex, ey);
int C_ex=ex/2, C_ey=ey/2;
int v_X[5000], v_Y[5000];
int k;
int rast;
int color_vrag[1][1];
color_vrag[0][0]=13597755;//я красн //Можно подобрать цвет синего ника оптимальнее с помощью редактора Кибор
//color_vrag[0][0]=1389551;//я синий//Можно подобрать цвет красного ника оптимальнее с помощью редактора Кибор
int коэфициент_поворота=2;//От этого зависит скорость наводки, но так же и инерция проскакивания.
int точность_чистовой_наводки=10;//Эту точность держит при стрельбе
int точность_наводки=50;//Это точность при наводке
int точность_наводки_бить=100;//Это точность при которой начинает бить.
int задействовать_при_наводке_корпус=0;//0-не задействовать 1-задействовать с башней
int min_max=15;//Разбежность цвета. Точность определения (уменьшать пока нормально наводит на врага)
int razn;
int rast1;
int pr;
int bp=0;
sleep(1000);
key('z');
key('x');
key(SPACE);
lo:;
key('c');
if (bp==1) {bp=0; keyup(SPACE);}
k=findimage(-1, #color_vrag[0][0], 0, #v_X[0], #v_Y[0], 0, 118, ex-280, ey-150, min_max, min_max, min_max, min_max, min_max, min_max, 100, 1, -1);
if (k>0)
{
sort(C_ex, C_ey, #v_X[0], #v_Y[0], k);
rast=C_ex-v_X[0];
if (rast>точность_наводки)Pov_z();
if (rast<-точность_наводки)Pov_x();
rast1=rast;
if (rast1<0)rast1=-rast1;
if (rast1<точность_наводки_бить)
{
bp=1; keydown(SPACE);
if (rast>точность_чистовой_наводки){keydown('z');sleep(100);keyup('z');}
if (rast<-точность_чистовой_наводки){keydown('x');sleep(100);keyup('x');}
bit();
}
if (bp==1) {bp=0; keyup(SPACE);}
}
goto lo;
/////////////////////////////////////////
function Pov_z()
{
r: rast1=rast;
if (rast1<0)rast1=-rast1;
razn=rast1*коэфициент_поворота;
keydown('z');
if (задействовать_при_наводке_корпус==1)keydown(LEFT);
sleep(razn);
if (задействовать_при_наводке_корпус==1)keyup(LEFT);
keyup('z');
sleep(100);
k=findimage(-1, #color_vrag[0][0], 0, #v_X[0], #v_Y[0], 0, 118, C_ex, ey-150, min_max, min_max, min_max, min_max, min_max, min_max, 100, 1, -1);
if (k>0)
{
sort(C_ex, C_ey-188, #v_X[0], #v_Y[0], k);
rast=C_ex-v_X[0];
if (rast>razn/2)goto r;
if (rast1<точность_наводки_бить){bp=1; keydown(SPACE);}
sleep(100);
k=findimage(-1, #color_vrag[0][0], 0, #v_X[0], #v_Y[0], 0, 118, C_ex, ey-150, min_max, min_max, min_max, min_max, min_max, min_max, 100, 1, -1);
if (k>0){sort(C_ex, C_ey, #v_X[0], #v_Y[0], k);rast=C_ex-v_X[0];}
return;
}
if (rast1<точность_наводки_бить){bp=1; keydown(SPACE);}
sleep(100);
k=findimage(-1, #color_vrag[0][0], 0, #v_X[0], #v_Y[0], 0, 118, C_ex, ey-150, min_max, min_max, min_max, min_max, min_max, min_max, 100, 1, -1);
if (k>0){sort(C_ex, C_ey, #v_X[0], #v_Y[0], k);rast=C_ex-v_X[0];}
}
function Pov_x()
{
r: rast1=rast;
if (rast1<0)rast1=-rast1;
razn=rast1*коэфициент_поворота;
keydown('x');
if (задействовать_при_наводке_корпус==1)keydown(RIGHT);
sleep(razn);
if (задействовать_при_наводке_корпус==1)keyup(RIGHT);
keyup('x');
sleep(100);
k=findimage(-1, #color_vrag[0][0], 0, #v_X[0], #v_Y[0], C_ex, 118, ex-280, ey-150, min_max, min_max, min_max, min_max, min_max, min_max, 100, 1, -1);
if (k>0)
{
sort(0, C_ey, #v_X[0], #v_Y[0], k);
rast=v_X[0];
if (rast<-(razn/2))goto r;
if (rast1<точность_наводки_бить){bp=1; keydown(SPACE);}
sleep(100);
k=findimage(-1, #color_vrag[0][0], 0, #v_X[0], #v_Y[0], C_ex, 118, ex-280, ey-150, min_max, min_max, min_max, min_max, min_max, min_max, 100, 1, -1);
if (k>0){sort(0, C_ey, #v_X[0], #v_Y[0], k);rast=v_X[0];}
return;
}
if (rast1<точность_наводки_бить){bp=1; keydown(SPACE);}
sleep(100);
k=findimage(-1, #color_vrag[0][0], 0, #v_X[0], #v_Y[0], C_ex, 118, ex-280, ey-150, min_max, min_max, min_max, min_max, min_max, min_max, 100, 1, -1);
if (k>0){sort(0, C_ey, #v_X[0], #v_Y[0], k);rast=v_X[0];}
}
function bit()
{
pr=0;
q: k=findimage(-1, #color_vrag[0][0], 0, #v_X[0], #v_Y[0], 0, 118, ex-280, ey-150, min_max, min_max, min_max, min_max, min_max, min_max, 100, 1, -1);
if (k>0)
{
sort(C_ex, C_ey, #v_X[0], #v_Y[0], k);
rast=C_ex-v_X[0];
if (rast>точность_наводки)Pov_z();
if (rast<-точность_наводки)Pov_x();
if (rast>точность_чистовой_наводки){keydown('z');sleep(100);keyup('z');}
if (rast<-точность_чистовой_наводки){keydown('x');sleep(100);keyup('x');}
rast1=rast;
if (rast1<0)rast1=-rast1;
if (rast1<точность_наводки_бить)
{
pr=0;
sleep(20);
goto q;
}
}
if (pr<20)
{
pr++;
sleep(5);
goto q;
}
}
|
|
|
|