Kinoman |
Отправлено: 21 Июля, 2019 - 13:19:13
|
Прохожий
Покинул форум
Сообщений всего: 20
Дата рег-ции: Июль 2019
Репутация: 0
|
Zireael пишет: Алгоритм стырил с форума другого кликера.
Например, для красных и жёлтых цифр:
1. Ищем все красные и жёлтые пиксели.
2. Сравниваем минимальную координату по X, если красный меньше значит желтая цифра 0.
3. Сравниваем максимальную координату по X, если красный меньше значит желтая цифра 9.
4. Если пункты 2 и 3 не подошли, т. е. жёлтая цифра не 0 и не 9, то считаем среднее расстояние между цифрами.
Из минимальной координаты по X жёлтого цвета вычитаем минимальную координату по X красного и делим на среднее расстояние между цифрами. Получим позицию жёлтой цифры.
CODE:int num;
int coord[4]={574, 380, 1813, 875} // координаты поиска, левый верхний угол и правый нижний
pause(1000);
//////////////
num=find(3882184, 6081000, 40, 35); // красный, жёлтый, разбежность для красного, разбежность для жёлтого
messagebox(num);
// тоже самое для других цветов, подобрать нужную разбежность
function find(int color1, int color2, int r1, int r2)
{
int x1[9999], y1[9999], x2[9999], y2[9999];
int count1=findcolor(sizearray(x1), #x1[0],#y1[0], coord[0], coord[1], coord[2], coord[3], color1, r1,r1,r1,r1,r1,r1, -1);
int count2=findcolor(sizearray(x2), #x2[0],#y2[0], coord[0], coord[1], coord[2], coord[3], color2, r2,r2,r2,r2,r2,r2, -1);
//messagebox(format(count1)+" "+format(count2)); // сколько найдено цветов
if(count1 && count2) // если найдены
{
if(x1[0]>x2[0])return 0;
if(x1[count1-1]<x2[count2-1])return 9;
int mid=(x1[count1-1]-x1[0]) / 9.5; // среднее расстояние между цифрами
return (x2[count2-1] - x1[0]) / mid;
}
return -1; // вернёт -1 если цвета не найдены
}
Суть в том, чтобы оно ещё прожимало эту цифру... |
|
|
Zireael |
Отправлено: 21 Июля, 2019 - 13:28:06
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Суть в том, чтобы оно ещё прожимало эту цифру...
Так и в чём проблема?
CODE:num=find(3882184, 6081000, 40, 35); // красный, жёлтый, разбежность для красного, разбежность для жёлтого
messagebox(num);
if(num!=-1)key(format(num)); // нажать клавишу |
|
|
Kinoman |
Отправлено: 21 Июля, 2019 - 16:21:24
|
Прохожий
Покинул форум
Сообщений всего: 20
Дата рег-ции: Июль 2019
Репутация: 0
|
Проблема в том что я не знаю как это склеить
Я даже готов доплатить чтоб вы мне объяснили что там к чему и помогли сделать готовый скрипт.
Ну или просто сделали, а я уже с гуглом через CTRL C буду искать каждую функцию и выкупать что к чему
(Добавление)
Вот собственно сам процесс, я уже кидал. (для просмотра ссылки Вам необходимо авторизоваться) (Добавление)
Zireael пишет: Цитата: Суть в том, чтобы оно ещё прожимало эту цифру...
Так и в чём проблема?
CODE:num=find(3882184, 6081000, 40, 35); // красный, жёлтый, разбежность для красного, разбежность для жёлтого
messagebox(num);
if(num!=-1)key(format(num)); // нажать клавишу
То что сделал Кибор, мне как то более понятно... Но и у тебя идея не плохая, но в силу своей неграмотности в коде, я не могу склеить ни идею Кибора с прожиманием клавиши ни твою. |
|
|
Kibor |
Отправлено: 21 Июля, 2019 - 19:12:24
|
Эксперт
Просматривает форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Kinoman пишет: Проблема в том что я не знаю как это склеить
цвета подставьте другие кроме красного желтого
Цитата: int num;
int coord[4]={574, 380, 1813, 875} // координаты поиска, левый верхний угол и правый нижний
pause(1000);
//////////////
loop()
{
sleep(100);
num=find(3882184, 6081000, 40, 35); // красный, жёлтый, разбежность для красного, разбежность для жёлтого
if (num!=-1){key(format(num)); pause(2000); continue;} // нажать клавишу
num=find(3882184, 6081000, 40, 35); // Второй цвет
if (num!=-1){key(format(num)); pause(2000); continue;} // нажать клавишу
num=find(3882184, 6081000, 40, 35); // Третий цвет
if (num!=-1){key(format(num)); pause(2000); continue;} // нажать клавишу
num=find(3882184, 6081000, 40, 35); // Четвертый цвет
if (num!=-1){key(format(num)); pause(2000); continue;} // нажать клавишу
}
//messagebox(num);
// тоже самое для других цветов, подобрать нужную разбежность
function find(int color1, int color2, int r1, int r2)
{
int x1[9999], y1[9999], x2[9999], y2[9999];
int count1=findcolor(sizearray(x1), #x1[0],#y1[0], coord[0], coord[1], coord[2], coord[3], color1, r1,r1,r1,r1,r1,r1, -1);
int count2=findcolor(sizearray(x2), #x2[0],#y2[0], coord[0], coord[1], coord[2], coord[3], color2, r2,r2,r2,r2,r2,r2, -1);
//messagebox(format(count1)+" "+format(count2)); // сколько найдено цветов
if(count1 && count2) // если найдены
{
if(x1[0]>x2[0])return 0;
if(x1[count1-1]<x2[count2-1])return 9;
int mid=(x1[count1-1]-x1[0]) / 9.5; // среднее расстояние между цифрами
return (x2[count2-1] - x1[0]) / mid;
}
return -1; // вернёт -1 если цвета не найдены
} |
|
|
Kinoman |
Отправлено: 22 Июля, 2019 - 03:06:33
|
Прохожий
Покинул форум
Сообщений всего: 20
Дата рег-ции: Июль 2019
Репутация: 0
|
Zireael пишет: Проблема в том что слова 'Выбрано' и 'Ошибки' тем же цветом что и цифры.
Например, ищем красные и жёлтые цифры, а на экране жёлтые, зелёные и слово 'Ошибки' красным. В итоге будет считаться что на экране красные и жёлтые, т. е. неправильно.
Надо проверять чтобы разница по Y между цветами не была большой. Ну и заодно что первого цвета больше чем второго в несколько раз.
А как проверить эту разницу? Я уже немного разобрался в коде и кажется понял примерно что к чему...(Отредактировано автором: 22 Июля, 2019 - 03:07:02) |
|
|
Zireael |
Отправлено: 22 Июля, 2019 - 10:51:48
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: А как проверить эту разницу?
code (Отобразить)CODE:int j, num;
int coord[4]={873, 442, 1735, 844} // координаты поиска, левый верхний угол и правый нижний
pause(1000);
int delta=15; // максимальная разница по высоте между цифрами
//////////////
loop()
{
num=find(3882184, 6081000, 40, 35); // красный, жёлтый, разбежность для красного, разбежность для жёлтого
if (num!=-1){textout(0, 10, 10, "Красный, Жёлтый: "+format(num), 1);
//key(format(num));
pause(300); continue;}
num=find(6470604, 4751443, 50, 20); // жёлтые, зеленые
if (num!=-1){textout(0, 10, 10, "Жёлтый, Зелёный: "+format(num), 1);
//key(format(num));
pause(300); continue;}
num=find(8818573, 16184060, 20, 20); // серые, белые
if (num!=-1){textout(0, 10, 10, "Серый, Белый: "+format(num), 1);
//key(format(num));
pause(300); continue;}
num=find(7389551, 11891324, 40, 30); // зелёные, фиолетовые
if (num!=-1){textout(0, 10, 10, "Зелёный, Фиолетовый: "+format(num), 1);
// key(format(num));
pause(300); continue;}
textout(0, 10, 10, "Не найдено", 1);
sleep(100);
}
function find(int color1, int color2, int r1, int r2)
{
int x1[9999], y1[9999], x2[9999], y2[9999];
int count1=findcolor(sizearray(x1), #x1[0],#y1[0], coord[0], coord[1], coord[2], coord[3], color1, r1,r1,r1,r1,r1,r1, -1);
int count2=findcolor(sizearray(x2), #x2[0],#y2[0], coord[0], coord[1], coord[2], coord[3], color2, r2,r2,r2,r2,r2,r2, -1);
//messagebox(format(count1)+" "+format(count2));
if(count1 && count2 && count1 > count2) // если найдены и первого цвета больше чем второго
{
j=0;
// поиск координаты Y второго цвета, которая не отличается от
// координаты Y первого цвета более чем указано в delta
while(j<count2-1 && sqrt(pow(y1[0] - y2[j], 2)) > delta)j++;
if(j<count2-1) // если найдено
{
if(x1[0]>x2[j])return 0;
if(x1[count1-1]<x2[j])return 9;
int mid=(x1[count1-1]-x1[0]) / 9.5; // среднее расстояние между цифрами
return (x2[j] - x1[0]) / mid;
}
}
return -1; // вернёт -1 если цвета не найдены
}
Примерно так, подбирайте цвета и разбежность.(Отредактировано автором: 22 Июля, 2019 - 10:56:30) |
|
|
Zireael |
Отправлено: 23 Июля, 2019 - 02:14:31
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Жёлтая удочка, при том что ищем желтые цифры, даже не знаю что сказать.
Начало зоны поиска вообще не понятно откуда начинается, конец зоны, скопированный из блокнота, вообще ни о чём не говорит. Все координаты надо получать и вставлять в скрипт из вкладки 'Шпион'.
Большая часть цветов вообще найдена, это написано в левом верхнем углу, либо цвет не тот, либо разбежность недостаточна.
Подбирать параметры вообще лучше на скринах, а уже потом в игре пробовать. А также не все цвета сразу. Оставьте в скрипте только, к примеру, красный и жёлтый, если будут нормально определяться, то уже другие добавлять. |
|
|
|