Необходимо разгадать капчу. Появляется в центре экрана с рандомным смещением и рандомного цвета, полупрозрачная с белыми плывущими волнами.
Проанализировав кучу скриншотов было выявлено, что:
- фиолетовая рамка - мето где появляется стрелка (следующий симовл всегда идёт со смещением 35 по Х)
- зелёные и красные пиксели - их цвет всегда совпадает с центральным
- синие пиксели - их цвет всегда не совпадает с центральным
Алгоритм основывается на сравнении цветов 4 диагональных пикселей, но на практике в игре угадывает не всегда, чаще всего начинает тупить на третьем символе (а максимум их 10), хотя скриншоты щёлкает как орешки.
CODE:
arrowX[1]=arrowX[0]+2;
arrowY[1]=arrowY[0]-2;
arrowX[2]=arrowX[0]+2;
arrowY[2]=arrowY[0]+2;
arrowX[3]=arrowX[0]-2;
arrowY[3]=arrowY[0]+2;
arrowX[4]=arrowX[0]-2;
arrowY[4]=arrowY[0]-2;
arrowcolor[0]=getcolor(arrowX[0], arrowY[0]);
arrowcolor[1]=getcolor(arrowX[1], arrowY[1]);
arrowcolor[2]=getcolor(arrowX[2], arrowY[2]);
arrowcolor[3]=getcolor(arrowX[3], arrowY[3]);
arrowcolor[4]=getcolor(arrowX[4], arrowY[4]);
if (arrowcolor[0]==arrowcolor[1])
{
if (arrowcolor[0]==arrowcolor[2])
{
textout(k, arrowX[3], arrowY[3], "A", 0);
kapcha[k]=65;
goto count;
}
}
else
{
if (arrowcolor[0]==arrowcolor[2])
{
if (arrowcolor[0]==arrowcolor[3])
{
textout(k, arrowX[3], arrowY[3], "W", 0);
kapcha[k]=87;
goto count;
}
}
else
{
if (arrowcolor[0]==arrowcolor[3])
{
if (arrowcolor[0]==arrowcolor[4])
{
textout(k, arrowX[3], arrowY[3], "D", 0);
kapcha[k]=68;
goto count;
}
}
else
{
if (arrowcolor[0]==arrowcolor[4])
{
if (arrowcolor[0]==arrowcolor[1])
{
textout(k, arrowX[3], arrowY[3], "S", 0);
kapcha[k]=83;
goto count;
}
}
else
{
goto vvod;
}
}
}
}
arrowX[1]=arrowX[0]+2;
arrowY[1]=arrowY[0]-2;
arrowX[2]=arrowX[0]+2;
arrowY[2]=arrowY[0]+2;
arrowX[3]=arrowX[0]-2;
arrowY[3]=arrowY[0]+2;
arrowX[4]=arrowX[0]-2;
arrowY[4]=arrowY[0]-2;
arrowcolor[0]=getcolor(arrowX[0], arrowY[0]);
arrowcolor[1]=getcolor(arrowX[1], arrowY[1]);
arrowcolor[2]=getcolor(arrowX[2], arrowY[2]);
arrowcolor[3]=getcolor(arrowX[3], arrowY[3]);
arrowcolor[4]=getcolor(arrowX[4], arrowY[4]);
if (arrowcolor[0]==arrowcolor[1])
{
if (arrowcolor[0]==arrowcolor[2])
{
textout(k, arrowX[3], arrowY[3], "A", 0);
kapcha[k]=65;
goto count;
}
}
else
{
if (arrowcolor[0]==arrowcolor[2])
{
if (arrowcolor[0]==arrowcolor[3])
{
textout(k, arrowX[3], arrowY[3], "W", 0);
kapcha[k]=87;
goto count;
}
}
else
{
if (arrowcolor[0]==arrowcolor[3])
{
if (arrowcolor[0]==arrowcolor[4])
{
textout(k, arrowX[3], arrowY[3], "D", 0);
kapcha[k]=68;
goto count;
}
}
else
{
if (arrowcolor[0]==arrowcolor[4])
{
if (arrowcolor[0]==arrowcolor[1])
{
textout(k, arrowX[3], arrowY[3], "S", 0);
kapcha[k]=83;
goto count;
}
}
else
{
goto vvod;
}
}
}
}
Получается что белые волны и полупрозрачность всё таки мешают моему алогритму. Прошу совета, как можно гарантированно угадывать капчу. Думал, что можно сравнивать, например, средний цвет верхней части капчи (внутри фиолетовой рамки) с нижней, и сравнивать каждую их них с центральным пикселем, то можно определить куда смотрит стрелка вверх или вниз. А если они примерно равны, то делать проверку уже между правой и левой частями. Но как это реализовать я не знаю, надо как то интерполировать все цвета, раскладывать по RGB или как?
Ещё вопрос.
У меня достаточно простые паттерны для поиска на экране, поэтому я не хочу использовать bmp и заморачиваться с запаковкой их в ехе, мне проще забить их в ручную в массивы один раз.
Собстенно вопросы:
Как назначить всему массиву какое нибудь значение?
Как наначить, например, только всей строке или столбцу?
Как назначить отдельным пикселям массива, одно значение чтоб это было одной строкой в коде, чтоб не печатать для каждого пикселя в отдельную строку?