Author Topic: Помогите с процедурой распознавания чисел.  (Read 12309 times)

0 Members and 2 Guests are viewing this topic.

michael

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
Всем доброго дня. Мне нужен совет
Недавно написал алгоритм для автономной бессрочной игры в одном приложении контакта. Сейчас довожу его до идеала. Возникла проблема с написанием процедуры распознавания. В игре присутствует табличка из трех  заданий и два числа характеризующие каждое из них. Необходимо распознать каждое число состоящее из 1-3 цифр и значка за ним означающего что число кончилось.  Поскольку в кликере нет массивов, то пришлось делать через файл.
В первом файле названия картинок цифр znc1.bmp - цифра "1", и тд. плюс znc11.bmp - маркер стоящий после числа. 
во второй записываются все найденные числа.
процедура не работает, поскольку из файла с результатами числа считываются как текст.
Как считать из файла с результатами значения в виде чисел?

Code: [Select]
$a=670    //$mX-201
$b=420   //$mY+217
sub(recognize)
TFCLEAR("znc_result.txt", 0)
for($j, $j<5)
for ($i, $i<12)
  if_picture_in($a,$b,$a+65,$b+30, strreadln("znc.txt",$i), 90)
$a=$_return1+4
$b=$_return2-2
TFWRITE("znc_result.txt", $i)
if (($i=11)&($j<4))   
$res1= TFRead("znc_result.txt", $j-2)*10+TFRead("znc_result.txt", $j-1)
end_if
if (($i=11)&($j=4))
$res1= TFRead("znc_result.txt", $j-3)*100 + TFRead("znc_result.txt", $j-2)*10+TFRead("znc_result.txt", $j-1)
end_if
                                if (($i=12)&($j<4))   
$res2= TFRead("znc_result.txt", $j-2)*10+TFRead("znc_result.txt", $j-1)
end_if
if (($i=12)&($j=4))
$res2= TFRead("znc_result.txt", $j-3)*100 + TFRead("znc_result.txt", $j-2)*10+TFRead("znc_result.txt", $j-1)
end_if
$i=13
end_if
           end_cyc
end_cyc
end_sub
« Last Edit: January 16, 2013, 10:26:27 AM by michael »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Помогает (если целое, как в твоём случае) к считанному числу применить INT()
Пример:
Code: (clickermann) [Select]
$res1= INT(TFRead("znc_result.txt", $j-2))*10+INT(TFRead("znc_result.txt", $j-1))
P.S. И как, находит что нужно? Я наверное не очень разобрался, но мне непонятны следующие моменты:
1. Почему циклы идут до 5 и 12 вместо 4 и 11 если описание правильное?
2. Допустим нашёл одну цифру и маркер, соответственно $i=11 и $j=2.
Что будет делать этот кусок:
Code: (clickermann) [Select]
if (($i=11)&($j<4))   
$res1= TFRead("znc_result.txt", $j-2)*10+TFRead("znc_result.txt", $j-1)
Что он будет считывать из нулевой строки? Т.е. обрабатывается только две и три цифры.

3. Почему когда нашли маркер (число кончилось) не выходим, а продолжаем искать несуществующие цифры?

4. Здесь:
Code: (clickermann) [Select]
if_picture_in($a,$b,$a+65,$b+30, strreadln("znc.txt",$i), 90)90 это цвет прозрачности? Если нет, то пропущен параметр -1

5. Главное! Если $a+65 захватывает в ширину несколько цифр, то скрипт будет правильно находить только числа с цифрами по возростанию типа 123, а вот 321 уже найдёт как 1 или 21 :o :(
Если $a+65 это точно меньше двух цифр, тогда вроде нормально.
« Last Edit: January 16, 2013, 12:15:11 PM by Vint »


HolyKirka

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Хреновая постановка задачи :) Код даже и не читал - испугался :) Прошу простить за оффтоп.

СлавьЯнИнъ

  • Активный участник
  • ***
  • Posts: 179
    • View Profile
Задача - Читать из файла в числовую переменную, а не в текстовую.
Задача простая.

А описание проги и код автор привёл, скорее всего, для порядка, прочитав как часто пишут о "чтении мыслей".
добрый смех равняет всех

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Ну и ответ дан INT(). А остальное бесплатное приложение  :)


michael

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
Спасибо, с тех пор много воды утекло но для меня применение INT все равно стало открытием. С помощью этого доработаю свой скрипт к лучшему.
В итоге процедура распознавания 2-4значных чисел получила такой вид. И как оказалось вполне работоспособна
Code: [Select]

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 символов) было решено заменить перебором готовых скринов словосочетаний, и если появляются новые или изменяются текущие, то делается автоматом скрин а потом я добавляю его в базу используемых изображений. Если искомое название найдено ему присваивается расшифровка из списка названий в текстовом файле
Code: [Select]
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 здесь нет.
Code: [Select]
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


Наконец ведется база данных по каждому знакомому изображению.

Code: [Select]

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")
И по каждому проходу через некоторое время проверяется сменилось ли место у какого либо пункта  в списке, изменилось ли состояние или рейтинг. Если да, после этого генерируется строка в файл отчета.

Code: [Select]
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
Получается такой текст в файле:
Code: [Select]
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-ов.
Подскажите, есть ли возможность включить ее обратно, может через файл конфигурации как-то.
« Last Edit: December 10, 2014, 01:34:11 PM by michael »

michael

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
Да, это метро. я бы сказал что все умеет. Это как хобби на логику уже)
Задача максимум - включил и забыл.
Т.е. полностью автономная система, способная выполнять все игровые задачи самостоятельно в течении неск. дней, недель, месяцев.Игра очень статичная, мало обновляется, в отличие от "В окопе2 или "Спарты". поэтому тут все даром.  Функции такие:

1. Автобои с друзьями, с фильтром по фракции и призвольно от указанного уровня по убыванию (например не выше 45-го). пропуск безоружных соперников или отдельных исключений. +бои на арене. После достижения лимита, выполнение прекращается.
2. сбор зарплаты за 8 часовую работу, и установка новой у Начальника станции. Автопроверка после старта новых игровых суток что работа задана а не слетела.
3. Проверка и сбор ежедневного бонуса за вход в игру.
4. Обыск палаток.
5. Выполнение заданий Начальника станции, либо с упором на пульки(внутриигр. валюту)  либо на опыт, или просто на определенных монстров или на задания с репутацией. Реализована система приоритетов в любых сочетаниях, например в приоритете задания на репутацию, а если таковых нет то выбирается задание с упором на пульки.
6. Реализована схема бесплатной игры когда  бесплатные ресурсы за день исчерпаны, выполнение игр. функций прекращается до наступления новых игр. суток.
Также частично платной игры, когда добавлен параметр количества пополнений энергии в сутки за донат(например сколько раз можно сьесть мясо чтобы восстановить) , которые будут отыграны дополнительно а потом выполнение этой конкретной задачи останавливается до новых игр. суток.
И схема полностью донатной игры, когда круглосуточно ведется выполнение задач за донат. Хорошо оттестирована только бесплатная игра, остальное слабо.
7. плавающие координаты, после старта(перезапуска) игры находится опорное изображение, и от него высчитывается "прямоугольник" окна игры.
8. защита от сбоев внутри игры. Это распознавание внутриигровых ошибок которые могут появиться и соответствующая реакция на них. Например если прервана связь с сервером то обновляется, если ошибка требующая перезагрузки - приложение перезагружается через ф5.
9. Защита от внешнеигровых сбоев. Например завис браузер, или вылетел флеш плеер, или просто открылась другая страница. Если что убивается процесс через батник, и запускается заново через execute, ярлык со ссылкой на страницу. + автоматический перезапуск через n-e количество часов или с началом новых игровых суток.
10. С вводом клановых войн: участие в КВ - только бесплатными боями или + указанным кол-вом боев за донат. На время Кл.войны часть других игровых функций откладываются.
11. Анализ изменений топа и генерация отчета в виде таблицы чтобы ловить кланы на бой, или избегать кланы типа СЛ, ФФ и прочих акул-лидеров.
12. работа по ситуации и через распознавание, и максимальный уход от цикличных нажатий через равные промежутки времени по одному и тому же месту.
13. скрининг всех основных действий по игре и автоудаление файлов сверх указанной давности. через батник

из творческих экспериментов:
1. создание самостоятельного игрового клана, живущего своей игровой жизнью, обьявляющего войну, забирающего награду после войны, отыгрывание боев несколькими персами попеременно в каждой войне этого клана. В перерывах между войнами автоперелогинивание между 5-10 персами, набор ими внутриигр. валюты, и наполнение казны клана.
2. Создание плагина на дельфи, для анализа и статистики. Вернее вначале когда не знал, как плагин написать, был просто обмен через буфер обмена. кликер помещает туда строку распознанных данных (ряд чисел) с маркером, другое приложение видит что это ему, получает данные обрабатывает и возвращает в буфер ответ(другой ряд значений) с другим маркером. кликер видит по маркеру что это для него, -  принимает и действует. Да-да, мсье знает толк в извращениях)))

PS Все это было написано еще на версии 4.7, кроме 11 пункта, и без вмешательства в код, память процесса, или обмен данных с сервером.  Сейчас перехожу на 4.11.

Kedrick

  • Освоившийся
  • **
  • Posts: 70
    • View Profile
Начинаю жалеть что меня нет фкантактике ))
Хотя подобный размах это именно то, что я и сам замучиваю, когда пишу для себя "простенький скрипт" для замены меня в игре.

Луций

  • Активный участник
  • ***
  • Posts: 248
  • чат в телеге: https://t.me/klickermannchat
    • View Profile
    • Пишу скрипты на заказ:
автор скрипт доделал? очень нннада

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Ты про какой скрипт?


Луций

  • Активный участник
  • ***
  • Posts: 248
  • чат в телеге: https://t.me/klickermannchat
    • View Profile
    • Пишу скрипты на заказ:
распознание чисел в квестах метро, для определения самого выгодного