3
« on: December 10, 2014, 01:16:02 PM »
Спасибо, с тех пор много воды утекло но для меня применение INT все равно стало открытием. С помощью этого доработаю свой скрипт к лучшему.
В итоге процедура распознавания 2-4значных чисел получила такой вид. И как оказалось вполне работоспособна
sub(analiz_reita)
//print("Анализируем...")
while($result!100)
// print("Анализируем...")
$result=0
// print($pX,$pY)
IF_picture_in ($pX, $pY, $px+14, $pY+17, "reit.bmp")
$result=100
// print("рейта")
$px=$px+14
goto(end_analyz)
end_if
IF_picture_in ($pX, $pY, $px+5, $pY+17, "n0.bmp")
$result=0
arrpush($arr1, 0)
// print($result)
$px=$px+7
goto(end_analyz)
end_if
IF_picture_in ($pX, $pY, $px+6, $pY+17, "n2.bmp",-1,85)
$result=2
arrpush($arr1, 2)
// print($result)
$px=$px+7
goto(end_analyz)
end_if
IF_picture_in ($pX, $pY, $px+5, $pY+17, "n3_1.bmp",-1,90)
$result=3
arrpush($arr1, 3)
// print($result)
$px=$px+6
goto(end_analyz)
end_if
IF_picture_in ($pX, $pY, $px+5, $pY+17, "n3_2.bmp",-1,90)
$result=3
arrpush($arr1, 3)
// print($result)
$px=$px+6
goto(end_analyz)
end_if
IF_picture_in ($pX, $pY, $px+5, $pY+17, "n4.bmp")
$result=4
arrpush($arr1, 4)
// print($result)
$px=$px+6
goto(end_analyz)
end_if
IF_picture_in ($pX, $pY, $px+5, $pY+17, "n5.bmp")
$result=5
arrpush($arr1, 5)
// print($result)
$px=$px+7
goto(end_analyz)
end_if
IF_picture_in ($pX, $pY, $px+5, $pY+17, "n6_1.bmp")
$result=6
arrpush($arr1, 6)
// print($result)
$px=$px+7
goto(end_analyz)
end_if
IF_picture_in ($pX, $pY, $px+6, $pY+17, "n7_1.bmp",-1,90)
$result=7
arrpush($arr1, 7)
// print($result)
$px=$px+8
goto(end_analyz)
end_if
IF_picture_in ($pX, $pY, $px+6, $pY+17, "n7_2.bmp",-1,90)
$result=7
arrpush($arr1, 7)
// print($result)
$px=$px+8
goto(end_analyz)
end_if
IF_picture_in ($pX, $pY, $px+5, $pY+17, "n8.bmp",-1,90)
$result=8
arrpush($arr1, 8)
// print($result)
$px=$px+6
goto(end_analyz)
end_if
IF_picture_in ($pX, $pY, $px+5, $pY+17, "n9.bmp")
$result=9
arrpush($arr1, 9)
// print($result)
$px=$px+6
goto(end_analyz)
end_if
IF_picture_in ($pX, $pY, $px+3, $pY+17, "n1_1.bmp",-1,95)
$result=1
arrpush($arr1, 1)
// print($result)
$px=$px+5
goto(end_analyz)
end_if
IF_picture_in ($pX, $pY, $px+4, $pY+17, "n1_2.bmp",-1,95)
$result=1
arrpush($arr1, 1)
// print($result)
$px=$px+5
goto(end_analyz)
end_if
$pX=$pX+1
//print("пропуск")
end_analyz:
if ( iskeydown(#space)=1 )
halt
END_IF
end_cyc
$reit=0
$pw=0
while(arrsize($arr1)!0)
$reit=$reit+arrpop($arr1)*pow(10,$pw)
inc($pw)
end_cyc
//print($reit," рейта")
end_sub
Вообще это часть основного скрипта в котором используется 3 способа распознавания. Распознается список из 50 пунктов в котором есть словосочетание, соответствующее ему число-рейтинг, состояние этого пункта в списке, и номер под которым оно стоит в общем списке. В каждый момент времени видно только 6 пунктов списка. см. приложенный файл.
Для распознавания рейтинга был выбран этот ввиду малого количества вариантов- символов. всего 10 и можно получить любое возможное значение, в результате их коминации
Текстовое распознавание названий - ввиду использования кириллицы и латинницы в разных регистрах(суммарно 120 символов) было решено заменить перебором готовых скринов словосочетаний, и если появляются новые или изменяются текущие, то делается автоматом скрин а потом я добавляю его в базу используемых изображений. Если искомое название найдено ему присваивается расшифровка из списка названий в текстовом файле
sub(analiz_nazvania)
$result=0
$name="неизв"
for($t=1,$t<54)
if($t<10)
IF_picture_in ($mX+216, $mY+104+60*$j, $mX+335, $mY+122+60*$j, StrConcat("Cl000",$t,".bmp"),-1,99)
$result=1
$name=INIREAD("config2.ini", $t, "Kl_names")
// print($name,$t)
$t=55
goto(end_analyz3)
end_if
end_if
if($t>9)
IF_picture_in ($mX+216, $mY+104+60*$j, $mX+335, $mY+122+60*$j, StrConcat("Cl00",$t,".bmp"),-1,99)
$result=1
$name=INIREAD("config2.ini", $t, "Kl_names")
// print($name,$t)
$t=55
goto(end_analyz3)
end_if
end_if
end_cyc
if($result=0)
screenshotex($mX+216, $mY+104+60*$j, $mX+335, $mY+122+60*$j,"Cl",0)
end_if
end_analyz3:
end_sub
Кстати здесь почему-то не работает GOTO пришлось принудительно завершать FOR изменением счетчика
Ну и третий способ разпознавания нумерации в списке реализован через PXLCRC. Это необходимо чтобы после пролистывания 6 раз вниз на следующую шестерку, можно было удостоверится что список успешно пролистан, именно 6 раз, и можно запускать две предыдущие процедуры. В остальных случаях его использование невозможно тк, в зависимости от положения в шестерке, рабочее название выглядит чуть по разному, а параметра currency как if_picture_in здесь нет.
for($i=1,$i<$i_max+1)
print("---------------------")
print("Анализируем места:",$i,"-",$i+5)
getscreen($mX, $mY, $mX+760, $mY+650)
for($j=1,$j<7)
$k=1
again1:
$pX=$mX+505
$pY=$mY+119+60*$j
analiz_reita() //распознавание рейтинга
analiz_sostoyania() //распознавание состояния
analiz_nazvania() //распознавание названия
getscreen($mX, $mY, $mX+760, $mY+650)
if_picture_in($mX, $mY, $mX+760, $mY+650, "scroller3.bmp")
for($t=$i,$t<$i+6)
lclick($_return1,$_return2)
move($mx,$mY)
waitms(rnd(800,1000))
end_cyc
end_if
for($tc=1,$tc<10)
getscreen($mX, $mY, $mX+760, $mY+650)
$p1=PXLCRC ($mX+117, $mY+175, $mX+147, $mY+200)
if(INIREAD("config.ini", $i+6,"numbers")=$p1)
$tc=12
$i=$i+5
waitms(rnd(300,600))
end_if
if($tc=9)
print("Номер клана не распознан.")
print("перезапуск через 3-6 сек...")
waitms(rnd(3000,6000))
restart()
end_if
waitms(rnd(300,600))
end_cyc
end_cyc
Наконец ведется база данных по каждому знакомому изображению.
iniwrite("config2.ini","name",$name,$name)
iniwrite("config2.ini","mesto",$i+$j-1,$name)
iniwrite("config2.ini","reit",$reit,$name)
iniwrite("config2.ini","sost",$sost,$name)
iniwrite("config2.ini","last_time",$_ms,$name)
iniwrite("config2.ini","last_hour",$_time_h,$name)
iniwrite("config2.ini","last_min",$_time_m,$name)
iniwrite("config2.ini",$i+$j-1,$name,"top")
И по каждому проходу через некоторое время проверяется сменилось ли место у какого либо пункта в списке, изменилось ли состояние или рейтинг. Если да, после этого генерируется строка в файл отчета.
if(($sost!INIREAD("config2.ini", "sost", $name))&($sost="война"))&($result_n=1))
print("Изменилось",INIREAD("config2.ini", "sost", $name),"-",$sost)
TFWRITE ("otchet.csv", StrConcat($i+$j-1,";",$reit,";",$name,";",int(($reit/iniREAD("config2.ini","reit","Valve"))*10),";",StrConcat(iniREAD("config2.ini","last_hour",$name),":", iniREAD("config2.ini","last_min",$name)),";iniREAD("config2.ini","time_exit",$name),";",int(($_ms-iniread("config2.ini","last_time",$name))/60000),";+60мин.;")) //- записывает строку в файл
end_if
Получается такой текст в файле:
39;478;Ночные стражи;5;19:59;5:59;2;+60мин.
15;765;Светлые ангелы;9;20:32;6:32;2;+60мин.
30;542;Бесславные убл.;6;21:34;7:34;1;+60мин.
Файл CSV открытый в экселе становится удобным табличным отчетом в реальном времени по любым изменениям в анализируемом списке:
М. рейт Кланы: награда в бой Выходят: прим. окно выхода
39 478 Ночные стражи 5 19:59 5:59 2 +60мин.
15 765 Светлые ангелы 9 20:32 6:32 2 +60мин.
30 542 Бесславные убл. 6 21:34 7:34 1 +60мин.
P.S. Скрипт приведен выборочно, не полностью.
P.S.2. Есть одна очень полезная штука к которой я привык в версии 4.7 и никак не мог от нее долго отказаться. это показ номера текущей выполняемой строки в нижней панели состояния. С версии 4.7 SE ее убрали. Но когда что-то не работает или преестало работать в скрипте на 300-500 строк было очень удобно посмотреть на каком месте застряло выполнение. А не замусоривать скрипт множеством print-ов.
Подскажите, есть ли возможность включить ее обратно, может через файл конфигурации как-то.