ммм...
Но это означает, если я правильно понимаю, что алгоритм не отсеивает малые строки, что должна делать переменная $h_str ? Или я не правильно понял ее значение?
Чтобы было не совсем абстрактно, привожу полностью код, с которым вожусь. Блок по распознаванию - строка 412. Предполагаю, что все-таки что-то не то с подпрограммой lines, строка 33.
... опс, "Сообщение превышает максимально допустимую длину (20000 знаков).", придется обрезать
#name "Фарм Наземный"
// Начало основной программы - строка 800
// Изменяемые переменные
$glob_map_SUMMARNO=500 // общее число повторений работы по карте
$glob_map_for_centrirovanie_MAX_1=15 // как часто прыгаем в начало, минимальное значение
$glob_map_for_centrirovanie_MAX_2=20 // как часто прыгаем в начало, максимальное значение
$max_lvl_shaht=15 // максимальный уровень шахт, которые можем атаковать
$verojatn_proverki_voisk=1 // доля вероятности проверки войск, чем выше - тем реже проверяем
$rezhim_obuchenia=0 // если =1 то при не вводе цифры будет остановка программы
////////////////////////////////////////////////////////////////////////////////
////////// описание важных подпрограмм ////
////////////////////////////////////////////////////////////////////////////////
//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
////////////////////////////////////////////////////////////////////////////////
/////////разбивает текст на строки//////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
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_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)
END_CYC
if ($y1_text=$y2_text) //т.е. вообще везде какие-то помехи
$uspeh_raspoznav=0
GOTO(to_end_lines)
end_if
END_IF
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)
END_CYC
// print("взяли для границ цифр $y1_text= ", $y1_text)
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))
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("сюда дошли?_2-1 $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
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)
// ggclick1(795, 15, 3) //свернули окно игры
// halt
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)
int(($y2_char-$y1_char+1)/2)
//лево
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
////////////////////////////////////////////////////////////////////////////////
////////////////распознавание и обучение////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
SUB(reader,$shape,$n_char,$file_name_to_raspoznav)
// print("===>подпрогр reader")
FOR($n_str=1,$n_str<TFCOUNT($file_name_to_raspoznav)+1)
IF(STRPOS (TFREAD ($file_name_to_raspoznav,$n_str), $shape) > 0)
$t_char = STRCUT(TFREAD ($file_name_to_raspoznav,$n_str), 1, STRPOS(TFREAD($file_name_to_raspoznav,$n_str),":~")-1)
// print("символ: ", $t_char)
strfilter($t_char, "*", 0 )
$all_str = STRCONCAT ($all_str,$t_char)
$n_str=TFCOUNT($file_name_to_raspoznav)+1
$check=0
else
$check=1
END_IF
END_CYC
IF($check=1)
move(int(($x2_char_arr[$n_char]-$x1_char_arr[$n_char])/2)+$x1_char_arr[$n_char],$y2_char_arr[$n_char])
$char_write = INPUTBOX(STRCONCAT("введи цифру под номером ",$n_char+1), "", 120)
IF($char_write = "")
if ($rezhim_obuchenia=1)
print("cancel - полный останов")
halt
else
print("cancel - цифру не распознали и не знаем, НО продолжаем")
$uspeh_raspoznav=0
$all_str = STRCONCAT (99,$all_str)
end_if
END_IF
$all_str = STRCONCAT ($all_str,$char_write)
$check=0 //////////////////
FOR($n_str=1,$n_str<TFCOUNT($file_name_to_raspoznav)+1)
IF(STRPOS (TFREAD ($file_name_to_raspoznav,$n_str), STRCONCAT($char_write,":~")) =1)
TFWRITE ($file_name_to_raspoznav,STRCONCAT(TFREAD($file_name_to_raspoznav,$n_str),$shape))
TFDELETE ($file_name_to_raspoznav,$n_str)
$n_str=TFCOUNT($file_name_to_raspoznav)+1
$check=0
else
$check=1
END_IF
END_CYC
IF($check=1)
TFWRITE ($file_name_to_raspoznav,STRCONCAT($char_write,":~",$shape))
END_IF
END_IF
END_SUB
/////////////////////////////////////////////////////////////////////////////////
//==============================================================================
// головная подпрограмма для распознавания ///////
/////////////////////////////////////////////////////////////////////////////////
IF(TFCOUNT("data_gorizont.ini") = 0)
TFWRITE ("data_gorizont.ini"," ")
END_IF
IF(TFCOUNT("data_number_voisk.ini") = 0)
TFWRITE ("data_number_voisk.ini"," ")
END_IF
UNDEFINE ($all_str)
$all_str = ""
UNDEFINE ($uspeh_raspoznav)
$uspeh_raspoznav = 1 // если $uspeh_raspoznav=0 то был сбой в распознавании
sub(raspoznav, $rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2,$file_name_to_raspoznav_vhod)
UNDEFINE ($all_str)
$all_str = ""
UNDEFINE ($uspeh_raspoznav)
$uspeh_raspoznav = 1 // если $uspeh_raspoznav=0 то был сбой в распознавании
// GETSCREEN()
// COLORMODE(6)
// SCREENSHOT(["my_analiz-Тестовый__6_до_"])
//обязательная обработка изображения до двух цветов
GETSCREEN($rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2)
COLORMODE(7, $rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2)
// print("координаты к распозн: ", $rasp_x1, " ", $rasp_y1, " ", $rasp_x2, " ", $rasp_y2)
SCREENSHOTEX($rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2, ["my_analiz_уровень_шахты_ИЛИ_цифры_- до обработки"])
PXLREPLACE ($rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2, 8355839, 8355711)
PXLREPLACE ($rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2, 8388607, 8355711)
PXLREPLACE ($rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2, 8388479, 8355711)
PXLREPLACE ($rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2, 11632561, 8355711)
PXLREPLACE(234,80,234,100, -1, 8355711) //это вручную для количества войск
PXLREPLACE(200,100,234,100, -1, 8355711)
PXLREPLACE(200,80,234,100, 16353673, 15724527) // синий
PXLREPLACE(200,80,234,100, 14778337, 8355711) // розовый
SCREENSHOTEX($rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2, ["my_analiz_уровень_шахты_ИЛИ_цифры_- в рамках распознавания"])
lines($rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2)
// print("подпрогр Lines закончили, начинаем цикл")
if ($uspeh_raspoznav=1)
FOR($line=0,$line<arrsize($x1_line_arr)) // цикл можно убрать, т.к. все в одну строчку
pos_size($x1_line_arr[$line],$y1_line_arr[$line],$x2_line_arr[$line],$y2_line_arr[$line])
FOR($char=0,$char<arrsize($x1_char_arr))
shape($x1_char_arr[$char],$y1_char_arr[$char],$x2_char_arr[$char],$y2_char_arr[$char])
reader($shape_str,$char, $file_name_to_raspoznav_vhod)
END_CYC
END_CYC
else
$all_str = 0
end_if
if ($uspeh_raspoznav=0)
$all_str = 0
end_if
// print("итог распознавания в подпрогр= ", $all_str)
end_sub
////////////////////////////////////////////////////////////////////////////////
// ОСНОВНАЯ ПРОГРАММА /////
////////////////////////////////////////////////////////////////////////////////
print("--------------")
print("Начинаем фармить на поверхности")
// параметры для распознавания
$char_color = 16777215 // цвет символов
$back_color = 8355711 // цвет фона
$accur = 5 //точность (1 - макс точность; рекомендуется =5)
$h_str = 7 //минимальная высота строки
....
потести.
Сейчас только обратил внимание, что в процитированном коде условие строки 9 должно выполняться всегда, т.к. идентично строке 2 ? У меня это соответственно строки 75 и 72