А вот это существенно более сложный алгоритм - уже для фарма наземных шахт. Постарался максимально закомментировать, чтобы было понятно какие настройки за что отвечают
...опс, "Сообщение превышает максимально допустимую длину (20000 знаков)", кодом вставить не получается, поэтому вставляю только начало и прилагается файлом
#name "Фарм Наземный - поштучное распознавание"
// Скрипт для Gods and Glory, фарм наземных шахт
// По замечаниям и предложениям - пишите на gsukhado@yandex.ru
#define xmul(:$x_gr_new+INT((
#define )xmul:-$x_gr_ish)*$x_peresch)
#define ymul(:$y_gr+INT((
#define )ymul:-$y_gr)*$y_peresch)
// Изменяемые переменные
$glob_map_SUMMARNO=50000 // общее число повторений работы по карте
//$glob_map_for_centrirovanie_MAX_1=15 // как часто прыгаем в начало, минимальное значение
//$glob_map_for_centrirovanie_MAX_2=20 // как часто прыгаем в начало, максимальное значение
$max_lvl_shaht=15 // максимальный уровень шахт, которые можем атаковать
$verojatn_proverki_voisk=3 // доля вероятности проверки войск, чем выше - тем реже проверяем
$rezhim_obuchenia=-1 // если =1 то дается больше времени на ввод цифры, если =2 то вообще все смотрим без атак, если = -1 то атакуем все без проверок уровня
$zadania_berem=0 // обычно =1 но на случай если надо сутки не брать задания
$verojatn_zadania_berem=4 // доля вероятности брать задания, чем выше - тем реже проверяем
$menshe_etogo_nabirat_voiska=690
$delaem_poisk_monet=1
$podtv_zavershenie_MAX=2 // количество экранов с уже собранными монетами
$tsentriruem_po_citadel_OR_alians=1 // если =1 то центрирование по цитадели, иначе - по альянсу
$nout=1 // номер компа для задания размеров рабочей области (для выставления координат)
$x_mash_ish=442
$y_mash_ish=856
$x_gr_ish=6 // размер неизменяемой границы слева
if($nout=4)
$x_gr_new=36
else
$x_gr_new=6
end_if
$y_gr=46 // размер неизменяемой границы сверху
switch($nout)
case(0) // вариант для ноута-1
$x_mash_stavim=374
$y_mash_stavim=734
case(1) // вариант для ноута-2
$x_mash_stavim=442
$y_mash_stavim=856
case(2) // вариант для стационара
$x_mash_stavim=518
$y_mash_stavim=990
case(3) // вариант для виртуалки для ноута (малое разрешение)
$x_mash_stavim=374
$y_mash_stavim=734
default
print("Значение $nout какое-то странное = ", $nout)
end_switch
$x_peresch=($x_mash_stavim-2*$x_gr_new)/($x_mash_ish-2*$x_gr_ish)
$y_peresch=($y_mash_stavim-2*$y_gr)/($y_mash_ish-2*$y_gr)
//на случай если надо быстро сделать скрин экрана
//print("Тестовый скрин начали")
//waitms(1700+rnd(0,200))
//getscreen()
//colormode(6)
//SCREENSHOT(["my_analiz-Тестовый__6_"])
//colormode(7)
//SCREENSHOT(["my_analiz-Тестовый__7_"])
//print("Тестовый скрин Завершили. ОСТАНОВ")
/halt
////////////////////////////////////////////////////////////////////////////////
////////// описание важных подпрограмм ////
////////////////////////////////////////////////////////////////////////////////
//lines($x1_text,$y1_text,$x2_text,$y2_text) // определяет координаты строк
//ответ - массивы $x1_line_arr,$y1_line_arr,$x2_line_arr,$y2_line_arr
/////////
//pos_size($x1_line,$y1_line,$x2_line,$y2_line) // координаты и количество символов
//ответ - массивы $x1_char_arr,$y1_char_arr,$x2_char_arr,$y2_char_arr
////////
//shape($x1_char,$y1_char,$x2_char,$y2_char) //очертание каждого символа
//ответ - строка очертания вида 01110311112042200240~
////////
//reader($shape) //обучение и распознавание
//если цифра не распознана, то вылезет окно ввода, где нужно вписать нужную цифру, на эту цифру указывает курсор.
//ответ - строка $all_str
////////////////////////////////////////////////////////////////////////////////
//==============================================================================
//процедура клика с рандомным отклонением от точки клика на количество точек от 0 до $rc по обеим осям
//======
sub(ggclick2, $var_in_1, $var_in_2, $var_in_3)
$rc2=$var_in_3
$nx2=INT($var_in_1+2*rnd(0-$rc2,$rc2)) //горизонтально двукратное отклонение
$ny2=INT($var_in_2+rnd(0-$rc2,$rc2))
// print("Задали значения клика: nx2=", $nx2, "(при вход.=", $var_in_1,") ny2=", $ny2,"(при вход.=", $var_in_2,") rc2=", $rc2)
move($nx2,$ny2)
ldown($nx2,$ny2)
waitms(80+rnd(0,60))
lup($nx2,$ny2)
end_sub
sub(ggclick1, $var_in_1, $var_in_2, $var_in_3)
$rc1=$var_in_3
$nx1=INT($var_in_1+rnd(0-$rc1,$rc1)) //горизонтально однократное отклонение
$ny1=INT($var_in_2+rnd(0-$rc1,$rc1))
// print("Задали значения клика: nx2=", $nx2, "(при вход.=", $var_in_1,") ny2=", $ny2,"(при вход.=", $var_in_2,") rc2=", $rc2)
move($nx1,$ny1)
// print("клик на: ", $nx1, " " , $ny1) //проверка что работаем в нужной точке
waitms(400+rnd(0,60))
ldown($nx1,$ny1)
waitms(80+rnd(0,60))
lup($nx1,$ny1)
end_sub
/////////////////////////////////////////////////////////
// работа с окном ////////////////
sub(move_wind)
$hwnd1=0
$hwnd1 = wndfind("BlueStacks") // получаем HWND окна Блюстака
if ($hwnd1 > 0)
print("нашли окно BlueStack = ", $hwnd1)
else
print("почему-то найти не смогли")
end_if
WNDBUMP ($hwnd1) // Окно на передний план
WNDPOS ($hwnd1, 0, 0) // подвинули окно в левый верхний угол
waitms(1000+rnd(0,200))
WNDGETINFO ($hwnd1, $tmp_var1, $tmp_var2, $tmp_var3, $tmp_var4)
print("Окно размером", $tmp_var1, " ", $tmp_var2, " на ", $tmp_var3, " ", $tmp_var4)
waitms(600+rnd(0,50))
WNDSIZE($hwnd1,$x_mash_stavim,$y_mash_stavim)
//WNDSIZE($hwnd1,370,734)
print("изменили размер окна")
waitms(200+rnd(0,20))
//WNDGETINFO ($hwnd1, $tmp_var1, $tmp_var2, $tmp_var3, $tmp_var4)
//print("окно", $tmp_var1, " ", $tmp_var2)
//print("на ", $tmp_var3, " ", $tmp_var4)
//halt
end_sub
//==============================================================================
////////////////////////////////////////////////////////////////////////////////
/////////разбивает текст на строки//////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
SUB(lines,$x1_text,$y1_text,$x2_text,$y2_text)
UNDEFINE ($x1_line_arr)
UNDEFINE ($y1_line_arr)
UNDEFINE ($x2_line_arr)
UNDEFINE ($y2_line_arr)
// print("===>подпрогр Lines")
IF(PXLCOUNT($x1_text,$y1_text,$x1_text,$y2_text,$char_color)=($y2_text-$y1_text+1))
print("...(первый столбец забит фоном, НЕ учитывается)")
while(PXLCOUNT($x1_text,$y1_text,$x1_text,$y2_text,$char_color)=($y2_text-$y1_text+1))
inc($x1_text)
// print("увеличиваем $x1_text= ", $x1_text , " при $x2_text= ", $x2_text)
END_CYC
if (($x1_text+3)>$x2_text) //т.е. вообще везде какие-то помехи
$uspeh_raspoznav=0
GOTO(to_end_lines)
end_if
END_IF
IF_PIXEL_IN($x1_text,$y1_text, $x1_text,$y2_text, $char_color)
print("...(текст не влазит в границы распознавания слева)")
$uspeh_raspoznav=0
GOTO(to_end_lines)
END_IF
IF_PIXEL_IN($x2_text,$y1_text, $x2_text,$y2_text, $char_color)
print("...(текст не влазит в границы распознавания справа)")
$uspeh_raspoznav=0
GOTO(to_end_lines)
END_IF
IF(PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)<($x2_text-$x1_text+1))
print("...(первая строка обрезана, НЕ учитывается)") // в т.ч. скидывает помехи?
while(PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)<($x2_text-$x1_text+1))
inc($y1_text)
// print("увеличиваем $y1_text= ", $y1_text , " при $y2_text= ", $y2_text)
END_CYC
if (($y1_text+$h_str-2)>$y2_text) //т.е. вообще везде какие-то помехи
$uspeh_raspoznav=0
GOTO(to_end_lines)
end_if
END_IF
// print("начинаем глючный $y1_text= ", $y1_text , " $y2_text= ", $y2_text)
while($y1_text<$y2_text)
// print("исходное $y1_text= ", $y1_text, " и $y2_text=", $y2_text)
while((PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)=($x2_text-$x1_text+1))&($y1_text<$y2_text))
inc($y1_text)
// print("увеличиваем $y1_text= ", $y1_text , " при $y2_text= ", $y2_text)
END_CYC
// print("взяли для границ цифр $y1_text= ", $y1_text)
// SCREENSHOTEX($x1_text,$y1_text,$x2_text,$y2_text, ["my_analiz_кол-во войск_- верхняя граница"])
IF($y1_text<$y2_text)
arrpush($x1_line_arr, $x1_text)
arrpush($y1_line_arr, $y1_text)
$h_str_temp=0
while(($h_str_temp<$h_str)&($y1_text<$y2_text))
// print("вошли в цикл $h_str_temp= ", $h_str_temp)
while(((PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color))<($x2_text-$x1_text+1))&($y1_text<$y2_text))
inc($y1_text)
inc($h_str_temp)
END_CYC
// print("сюда дошли?_ $h_str_temp=", $h_str_temp, " $h_str=", $h_str, " $y1_text=", $y1_text, " $y2_text=", $y2_text)
IF(($h_str_temp<$h_str)&($y1_text<$y2_text))
while((PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)=($x2_text-$x1_text+1))&($y1_text<$y2_text))
inc($y1_text)
END_CYC
$h_str_temp = 0
$del_arr = arrpop($x1_line_arr)
$del_arr = arrpop($y1_line_arr)
arrpush($x1_line_arr, $x1_text)
arrpush($y1_line_arr, $y1_text)
END_IF
END_CYC
END_IF
// print("после if ?")
IF(PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)=($x2_text-$x1_text+1))
arrpush($x2_line_arr, $x2_text)
arrpush($y2_line_arr, $y1_text-1)
else
print("...(последняя строка обрезана, НЕ учитывается)")
$del_arr = arrpop($x1_line_arr)
$del_arr = arrpop($y1_line_arr)
END_IF
END_CYC
// print("итог Lines- количество строк = ",arrsize($x1_line_arr))
// координаты в лог и скрины
//FOR($a=0,$a<arrsize($x1_line_arr))
// print($x1_line_arr[$a]," ",$y1_line_arr[$a]," ",$x2_line_arr[$a]," ",$y2_line_arr[$a])
// SCREENSHOTEX($x1_line_arr[$a],$y1_line_arr[$a],$x2_line_arr[$a],$y2_line_arr[$a], ["подпрогр_Lines_скрин_итога_"])
//END_CYC
IF(arrsize($x1_line_arr)=0)
print("...(текста не найдено)")
$uspeh_raspoznav=0
GOTO(to_end_lines)
END_IF
to_end_lines:
END_SUB
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////размер и количество символов в строке//////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
SUB(pos_size,$x1_line,$y1_line,$x2_line,$y2_line)
// print("===>подпрогр pos_size")
UNDEFINE ($x1_char_arr)
UNDEFINE ($y1_char_arr)
UNDEFINE ($x2_char_arr)
UNDEFINE ($y2_char_arr)
FOR($x1_line_temp=$x1_line,$x1_line_temp<$x2_line+1)
FOR($y1_line_temp=$y1_line,$y1_line_temp<$y2_line+1)
IF(pxl($x1_line_temp,$y1_line_temp)=$char_color)
arrpush($x1_char_arr,$x1_line_temp)
while(PXLCOUNT($x1_line_temp,$y1_line,$x1_line_temp,$y2_line,$back_color)<$y2_line-$y1_line+1)
inc($x1_line_temp)
END_CYC
arrpush($x2_char_arr,$x1_line_temp-1)
END_IF
END_CYC
END_CYC
FOR($i_char=0,$i_char<arrsize($x1_char_arr))
SCANPXL ($pix_temp,$x1_char_arr[$i_char],$y1_line,$x2_char_arr[$i_char],$y2_line,$char_color)
arrpush($y1_char_arr,$pix_temp[1])
arrpush($y2_char_arr,$pix_temp[arrsize($pix_temp)-1])
UNDEFINE ($pix_temp)
END_CYC
// print("количество символов в строке - ",arrsize($x1_char_arr))
//скрины каждого символа
// FOR($a=0,$a<arrsize($x1_char_arr))
// SCREENSHOTEX($x1_char_arr[$a],$y1_char_arr[$a],$x2_char_arr[$a],$y2_char_arr[$a], ["подпр_Pos_size_очертание_символа_"])
// END_CYC
END_SUB
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////очертание символов//////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
SUB(shape,$x1_char,$y1_char,$x2_char,$y2_char)
// print("===>подпрогр shape")
UNDEFINE($left_1)
UNDEFINE($left_2)
UNDEFINE($left_3)
UNDEFINE($left_4)
UNDEFINE($left_5)
UNDEFINE($right_1)
UNDEFINE($right_2)
UNDEFINE($right_3)
UNDEFINE($right_4)
UNDEFINE($right_5)
UNDEFINE($up_1)
UNDEFINE($up_2)
UNDEFINE($up_3)
UNDEFINE($up_4)
UNDEFINE($up_5)
UNDEFINE($down_1)
UNDEFINE($down_2)
UNDEFINE($down_3)
UNDEFINE($down_4)
UNDEFINE($down_5)
//лево
FOR($temp=$x1_char,(pxl($temp,$y2_char)!$char_color)&($temp<$x2_char))
inc($left_1)
END_CYC
$left_1 = ROUND($left_1/($x2_char-$x1_char+1)/$accur,-1)*10
IF($left_1 > 9)
$left_1 = 9
END_IF
FOR($temp=$x1_char,(pxl($temp,$y2_char-ROUND(($y2_char-$y1_char)/4,0))!$char_color)&($temp<$x2_char))
inc($left_2)
END_CYC
$left_2 = ROUND($left_2/($x2_char-$x1_char+1)/$accur,-1)*10
IF($left_2 > 9)
$left_2 = 9
END_IF
FOR($temp=$x1_char,(pxl($temp,$y2_char-ROUND(($y2_char-$y1_char)/2,0))!$char_color)&($temp<$x2_char))
inc($left_3)
END_CYC
$left_3 = ROUND($left_3/($x2_char-$x1_char+1)/$accur,-1)*10
IF($left_3 > 9)
$left_3 = 9
END_IF
FOR($temp=$x1_char,(pxl($temp,$y1_char+ROUND(($y2_char-$y1_char)/4,0))!$char_color)&($temp<$x2_char))
inc($left_4)
END_CYC
$left_4 = ROUND($left_4/($x2_char-$x1_char+1)/$accur,-1)*10
IF($left_4 > 9)
$left_4 = 9
END_IF
FOR($temp=$x1_char,(pxl($temp,$y1_char)!$char_color)&($temp<$x2_char))
inc($left_5)
END_CYC
$left_5 = ROUND($left_5/($x2_char-$x1_char+1)/$accur,-1)*10
IF($left_5 > 9)
$left_5 = 9
END_IF
//право
FOR($temp=$x2_char,(pxl($temp,$y2_char)!$char_color)&($temp>$x1_char),-1)
inc($right_1)
END_CYC
$right_1 = $right_1 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
$right_1 = ROUND($right_1/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
IF($right_1 > 9)
$right_1 = 9
END_IF
FOR($temp=$x2_char,(pxl($temp,$y2_char-ROUND(($y2_char-$y1_char)/4,0))!$char_color)&($temp>$x1_char),-1)
inc($right_2)
END_CYC
$right_2 = $right_2 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
$right_2 = ROUND($right_2/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
IF($right_2 > 9)
$right_2 = 9
END_IF
FOR($temp=$x2_char,(pxl($temp,$y2_char-ROUND(($y2_char-$y1_char)/2,0))!$char_color)&($temp>$x1_char),-1)
inc($right_3)
END_CYC
$right_3 = $right_3 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
$right_3 = ROUND($right_3/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
IF($right_3 > 9)
$right_3 = 9
END_IF
FOR($temp=$x2_char,(pxl($temp,$y1_char+ROUND(($y2_char-$y1_char)/4,0))!$char_color)&($temp>$x1_char),-1)
inc($right_4)
END_CYC
$right_4 = $right_4 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
$right_4 = ROUND($right_4/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
IF($right_4 > 9)
$right_4 = 9
END_IF
FOR($temp=$x2_char,(pxl($temp,$y1_char)!$char_color)&($temp>$x1_char),-1)
inc($right_5)
END_CYC
$right_5 = $right_5 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
$right_5 = ROUND($right_5/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
IF($right_5 > 9)
$right_5 = 9
END_IF
//верх
FOR($temp=$y1_char,(pxl($x1_char,$temp)!$char_color)&($temp<$y2_char))
inc($up_1)
END_CYC
$up_1 = ROUND($up_1/($y2_char-$y1_char+1)/$accur,-1)*10
IF($up_1 > 9)
$up_1 = 9
END_IF
FOR($temp=$y1_char,(pxl($x1_char+ROUND(($x2_char-$x1_char)/4,0),$temp)!$char_color)&($temp<$y2_char))
inc($up_2)
END_CYC
$up_2 = ROUND($up_2/($y2_char-$y1_char+1)/$accur,-1)*10
IF($up_2 > 9)
$up_2 = 9
END_IF
FOR($temp=$y1_char,(pxl($x1_char+ROUND(($x2_char-$x1_char)/2,0),$temp)!$char_color)&($temp<$y2_char))
inc($up_3)
END_CYC
$up_3 = ROUND($up_3/($y2_char-$y1_char+1)/$accur,-1)*10
IF($up_3 > 9)
$up_3 = 9
END_IF
FOR($temp=$y1_char,(pxl($x2_char-ROUND(($x2_char-$x1_char)/4,0),$temp)!$char_color)&($temp<$y2_char))
inc($up_4)
END_CYC
$up_4 = ROUND($up_4/($y2_char-$y1_char+1)/$accur,-1)*10
IF($up_4 > 9)
$up_4 = 9
END_IF
FOR($temp=$y1_char,(pxl($x2_char,$temp)!$char_color)&($temp<$y2_char))
inc($up_5)
END_CYC
$up_5 = ROUND($up_5/($y2_char-$y1_char+1)/$accur,-1)*10
IF($up_5 > 9)
$up_5 = 9
END_IF
//низ
FOR($temp=$y2_char,(pxl($x1_char,$temp)!$char_color)&($temp>$y1_char),-1)
inc($down_1)
END_CYC
$down_1 = ROUND($down_1/($y2_char-$y1_char+1)/$accur,-1)*10
IF($down_1 > 9)
$down_1 = 9
END_IF
FOR($temp=$y2_char,(pxl($x1_char+ROUND(($x2_char-$x1_char)/4,0),$temp)!$char_color)&($temp>$y1_char),-1)
inc($down_2)
END_CYC
$down_2 = ROUND($down_2/($y2_char-$y1_char+1)/$accur,-1)*10
IF($down_2 > 9)
$down_2 = 9
END_IF
FOR($temp=$y2_char,(pxl($x1_char+ROUND(($x2_char-$x1_char)/2,0),$temp)!$char_color)&($temp>$y1_char),-1)
inc($down_3)
END_CYC
$down_3 = ROUND($down_3/($y2_char-$y1_char+1)/$accur,-1)*10
IF($down_3 > 9)
$down_3 = 9
END_IF
FOR($temp=$y2_char,(pxl($x2_char-ROUND(($x2_char-$x1_char)/4,0),$temp)!$char_color)&($temp>$y1_char),-1)
inc($down_4)
END_CYC
$down_4 = ROUND($down_4/($y2_char-$y1_char+1)/$accur,-1)*10
IF($down_4 > 9)
$down_4 = 9
END_IF
FOR($temp=$y2_char,(pxl($x2_char,$temp)!$char_color)&($temp>$y1_char),-1)
inc($down_5)
END_CYC
$down_5 = ROUND($down_5/($y2_char-$y1_char+1)/$accur,-1)*10
IF($down_5 > 9)
$down_5 = 9
END_IF
// print($left_1," ",$left_2," ",$left_3," ",$left_4," ",$left_5)
// print($right_1," ",$right_2," ",$right_3," ",$right_4," ",$right_5)
// print($up_1," ",$up_2," ",$up_3," ",$up_4," ",$up_5)
// print($down_1," ",$down_2," ",$down_3," ",$down_4," ",$down_5)
$shape_str=STRCONCAT($left_1,$left_2,$left_3,$left_4,$left_5,$right_1,$right_2,$right_3,$right_4,$right_5,$up_1,$up_2,$up_3,$up_4,$up_5,$down_1,$down_2,$down_3,$down_4,$down_5,"~")
//print($shape_str)
END_SUB