Author Topic: Распознование шрифта обновлённая тема  (Read 2709 times)

0 Members and 1 Guest are viewing this topic.

Gamezoo7

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Всем привет , не могу никак собрать скрипт на определения чисел, из-за изменений на новые версии возникла путаница опытных юзеров прошу помочь,  нужно определить числа после чего если она соответствует нужному мне промежутку выполнить готовый порядок действий

Gamezoo7

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Тут я приложил аналогичную версию но для распознавания цвета

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Какого шрифта? Каких чисел? Какие "новые версии"?

Зачем лепить 200 строк записи если нужны только 4 строки кликов?!
Code: (clickermann) [Select]
GETSCREEN
IF_PIXEL_IN(1161,205, 1327,232, 127744)
   LCLICK(1756,222)
   WAITMS(500)
   LCLICK(1775,976)
   WAITMS(500)
   LCLICK(780,647)
   WAITMS(500)
   LCLICK(973,605)
   WAITMS(500)
ELSE
   LCLICK(1806,112)
   WAITMS(500)
END_IF

И сразу все проще и куда понятнее...

Gamezoo7

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
проблема в том что игра на прямую не распознает когда клик чисто по пикселю без продолжительного наведения на него потому я добавил немного воды , скажем так съимитировал нормальное поведение мыши

Gamezoo7

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Вот пример , цена клинков составляет 17000, если в продаже появятся клинки за 10000 он должен мне будет их купить если нет обновить страничку, вот как-то так , раньше предметы которые скоро должны были появится в продаже помечались плашкой "на удержании" и когда она сменялась на "в продаже" тот код имитировал (частично) пользователя и покупал ее, сейчас предметы на удержании скрыли и я пытаюсь написать код на распознавание чисел(цены) но когда я заглянул в ту тему, мне было сложнава-то понять как вклинивались изменения + прошло уже минимум 3 года с той темы , потому мало-ли что изменилось.(уточнюсь меня волнует цена за штуку.) при этом я паралельно думаю можно ли сделать спектр уен допустим от 10к до 12к насколько сильно это нагрузит саму систему и тд.)
« Last Edit: July 03, 2019, 03:59:51 PM by Gamezoo7 »

Gamezoo7

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Какого шрифта? Каких чисел? Какие "новые версии"?

Зачем лепить 200 строк записи если нужны только 4 строки кликов?!
Code: (clickermann) [Select]
GETSCREEN
IF_PIXEL_IN(1161,205, 1327,232, 127744)
   LCLICK(1756,222)
   WAITMS(500)
   LCLICK(1775,976)
   WAITMS(500)
   LCLICK(780,647)
   WAITMS(500)
   LCLICK(973,605)
   WAITMS(500)
ELSE
   LCLICK(1806,112)
   WAITMS(500)
END_IF

И сразу все проще и куда понятнее...
я проверил данный скрипт не работает по указаным выше причинам

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Добавим подпрограмму плавного перемещения курсора в указанную точку.
Code: (clickermann) [Select]
SUB(mouse_move,$MOVE_END_X,$MOVE_END_Y)
   $MOVE_SPEED = 3 // множитель движения (чем больше тем медленнее)
   $MOVE_Start_X = $_xmouse
   $MOVE_Start_Y = $_ymouse
   $MOVE_X = $MOVE_Start_X
   $MOVE_Y = $MOVE_Start_Y
   $dist = DIST($MOVE_END_X,$MOVE_END_Y,$MOVE_Start_X,$MOVE_Start_Y)
   $MOVE_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
   IF($MOVE_SPEEDVAR < 1)
      $MOVE_SPEEDVAR = 1
   END_IF
   $MOVE_step=($dist-1)/$MOVE_SPEEDVAR
   $MOVE_X_step = ($MOVE_END_X-$MOVE_Start_X)/$MOVE_step
   $MOVE_Y_step = ($MOVE_END_Y-$MOVE_Start_Y)/$MOVE_step
   FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
      $MOVE_X = $MOVE_X + $MOVE_X_step
      $MOVE_Y = $MOVE_Y + $MOVE_Y_step
      MOVE(ROUND($MOVE_X,0), ROUND($MOVE_Y,0))
      WAITMS(3) // задержка движения (чем больше тем медленнее)
   END_CYC
   MOVE($MOVE_END_X, $MOVE_END_Y)
END_SUB

GETSCREEN
IF_PIXEL_IN(1161,205, 1327,232, 127744)
   mouse_move(1756,222)
   LCLICK(1756,222)
   WAITMS(500)
   mouse_move(1775,976)
   LCLICK(1775,976)
   WAITMS(500)
   mouse_move(780,647)
   LCLICK(780,647)
   WAITMS(500)
   mouse_move(973,605)
   LCLICK(973,605)
   WAITMS(500)
ELSE
   mouse_move(1806,112)
   LCLICK(1806,112)
   WAITMS(500)
END_IF

Gamezoo7

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Добавим подпрограмму плавного перемещения курсора в указанную точку.
Code: (clickermann) [Select]
SUB(mouse_move,$MOVE_END_X,$MOVE_END_Y)
   $MOVE_SPEED = 3 // множитель движения (чем больше тем медленнее)
   $MOVE_Start_X = $_xmouse
   $MOVE_Start_Y = $_ymouse
   $MOVE_X = $MOVE_Start_X
   $MOVE_Y = $MOVE_Start_Y
   $dist = DIST($MOVE_END_X,$MOVE_END_Y,$MOVE_Start_X,$MOVE_Start_Y)
   $MOVE_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
   IF($MOVE_SPEEDVAR < 1)
      $MOVE_SPEEDVAR = 1
   END_IF
   $MOVE_step=($dist-1)/$MOVE_SPEEDVAR
   $MOVE_X_step = ($MOVE_END_X-$MOVE_Start_X)/$MOVE_step
   $MOVE_Y_step = ($MOVE_END_Y-$MOVE_Start_Y)/$MOVE_step
   FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
      $MOVE_X = $MOVE_X + $MOVE_X_step
      $MOVE_Y = $MOVE_Y + $MOVE_Y_step
      MOVE(ROUND($MOVE_X,0), ROUND($MOVE_Y,0))
      WAITMS(3) // задержка движения (чем больше тем медленнее)
   END_CYC
   MOVE($MOVE_END_X, $MOVE_END_Y)
END_SUB

GETSCREEN
IF_PIXEL_IN(1161,205, 1327,232, 127744)
   mouse_move(1756,222)
   LCLICK(1756,222)
   WAITMS(500)
   mouse_move(1775,976)
   LCLICK(1775,976)
   WAITMS(500)
   mouse_move(780,647)
   LCLICK(780,647)
   WAITMS(500)
   mouse_move(973,605)
   LCLICK(973,605)
   WAITMS(500)
ELSE
   mouse_move(1806,112)
   LCLICK(1806,112)
   WAITMS(500)
END_IF
иронично не работает, почему не ясно но нажатия переодическе не срабатывают, я поигрался со скоростями , но даже 80% нажатия у меня добиться не получилось, при этом даже лучшие результаты не имели и половины нужной скорости


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Что-то Кирил писал когда-то, что некоторые игры не принимают клики, если их тыкать в одну точку. Нужно что-то типа подергивания курсора в месте клика, и проверка - прошел клик или нет. Нужно у него уточнить. Я такого не встречал.

Gamezoo7

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Что-то Кирил писал когда-то, что некоторые игры не принимают клики, если их тыкать в одну точку. Нужно что-то типа подергивания курсора в месте клика, и проверка - прошел клик или нет. Нужно у него уточнить. Я такого не встречал.
говорю с этой вещью я справился мне нужна помощь в распознавании чисел

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Что-то Кирил писал когда-то, что некоторые игры не принимают клики, если их тыкать в одну точку. Нужно что-то типа подергивания курсора в месте клика, и проверка - прошел клик или нет. Нужно у него уточнить. Я такого не встречал.
говорю с этой вещью я справился мне нужна помощь в распознавании чисел

Вот написал на основе твоей картинки (конечно лучше бы было если б она была в PNG формате)
Code: (clickermann) [Select]
SUB(recognize, $x1,$y1, $x2,$y2)
   GETFILELIST($Letters_arr, "Letters\*.bmp")
   FOR($Let_num=0,$Let_num<ARRSIZE($Letters_arr))
      STRSEPARATE($Letters_arr[$Let_num], "_", $a_l)
      SCANPICTURE($ARR_SCAN, $x1,$y1, $x2,$y2, STRCONCAT("Letters\", $Letters_arr[$Let_num]), -1, STRREPLACE($a_l[ARRSIZE($a_l)-1],".bmp",""))
      UNDEFINE($a_l)
      FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
         ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
         ARRPUSH($ARR_OUT, STRCUT($Letters_arr[$Let_num], 1, 1))
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
   $siz = ARRSIZE($ARR_OUT)
   $srtcheck = 0
   $srt = 0
   FOR($a=$siz-2,($a>0)&($srt=0),-2)
      FOR($b=0,$b<$a,2)
         IF($ARR_OUT[$b] > $ARR_OUT[$b+2])
            $srtcheck = 1
            $tmp = $ARR_OUT[$b]
            $tmp2 = $ARR_OUT[$b+1]
            $ARR_OUT[$b] = $ARR_OUT[$b+2]
            $ARR_OUT[$b+1] = $ARR_OUT[$b+3]
            $ARR_OUT[$b+2] = $tmp
            $ARR_OUT[$b+3] = $tmp2
         END_IF
      END_CYC
      IF($srtcheck = 0)
         $srt = 1
      END_IF
   END_CYC
   $str = ""
   FOR($a=0,$a<ARRSIZE($ARR_OUT),2)
      IF(STRLEN($str) > 0)
         IF($ARR_OUT[$a]-$ARR_OUT[$a-2] > 100) // обпределение пробела
            $str = STRCONCAT($str, " ")
         END_IF
         $str = STRCONCAT($str, $ARR_OUT[$a+1])
      ELSE
         $str = $ARR_OUT[$a+1]
      END_IF
   END_CYC
   UNDEFINE($ARR_OUT)
   UNDEFINE($ARR_SCAN)
END_SUB

GETSCREEN
COLORMODE(6)
SCANPICTURE($ARR_SCAN2, 0,0, $_xmax,$_ymax, "Впродаже.bmp", -1, 80) // поиск "В продаже", уточнить область поиска
COLORMODE(8)
FOR($i=0,$i<ARRSIZE($ARR_SCAN2),2)
   recognize($ARR_SCAN2[$i]+320, $ARR_SCAN2[$i+1]-7, $ARR_SCAN2[$i]+402, $ARR_SCAN2[$i+1]+16) // область распознавания
   LOGWRITE("№: ", $i, " ", $str)
   IF($str <= 10000) // действие если значение меньше или равно 10000
      LCLICK($ARR_SCAN2[$i], $ARR_SCAN2[$i+1]) // клик "В продаже"
      WAITMS(500)
      LCLICK(10,10) // Клик "Купить", уточнить координату
      WAITMS(500)
      $i=9999 // выход из цикла
      HALT // Стоп (если таребуется)
   END_IF
END_CYC
UNDEFINE($ARR_SCAN2)

IF($i ! 9999) // если не найдено подходящей цены
   LCLICK(10,10) // Клик "Обновить", уточнить координату
END_IF

WAITMS(2000)



Прилагаю архив. В нем пример который гарантированно по твоей картинке распознает цену в каждой строке.
В логе можно увидеть результат.

В папке "Letters" находятся картинки чисел.
Картинки получены в режиме цветокоррекции COLORMODE( 8 )
Формат имени картинки должен быть таким: "2_90.bmp"
2 - символ который изображен на картинке
90 - процент совпадения при поиске картинки.
Разделителем параметров считается символ "_"

Можно поместить несколько картинок вариантов одного и того же числа, задав каждой свой процент совпадения.
"2_1_90.bmp"
"2_2_100.bmp"
"2_3_80.bmp"
Для параметров важен первый символ и последнее число, то что по середине не важно.

В скрипте два цикла, первый ищет все слова "В продаже", второй относительно этого слова проверяет цену.
Не знаю как там у тебя выделяется товар, написал просто клик по слову "В продаже".
Если цена подходящая выделяетс товар и кликает по кнопке  "Купить", и останавливает выполнение.
Если не найдено подходящей цены, жмет обновить и опять по кругу.
« Last Edit: July 04, 2019, 01:04:12 PM by Oraven »

Gamezoo7

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Что-то Кирил писал когда-то, что некоторые игры не принимают клики, если их тыкать в одну точку. Нужно что-то типа подергивания курсора в месте клика, и проверка - прошел клик или нет. Нужно у него уточнить. Я такого не встречал.
говорю с этой вещью я справился мне нужна помощь в распознавании чисел

Вот написал на основе твоей картинки (конечно лучше бы было если б она была в PNG формате)
Code: (clickermann) [Select]
SUB(recognize, $x1,$y1, $x2,$y2)
   GETFILELIST($Letters_arr, "Letters\*.bmp")
   FOR($Let_num=0,$Let_num<ARRSIZE($Letters_arr))
      STRSEPARATE($Letters_arr[$Let_num], "_", $a_l)
      SCANPICTURE($ARR_SCAN, $x1,$y1, $x2,$y2, STRCONCAT("Letters\", $Letters_arr[$Let_num]), -1, STRREPLACE($a_l[ARRSIZE($a_l)-1],".bmp",""))
      UNDEFINE($a_l)
      FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
         ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
         ARRPUSH($ARR_OUT, STRCUT($Letters_arr[$Let_num], 1, 1))
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
   $siz = ARRSIZE($ARR_OUT)
   $srtcheck = 0
   $srt = 0
   FOR($a=$siz-2,($a>0)&($srt=0),-2)
      FOR($b=0,$b<$a,2)
         IF($ARR_OUT[$b] > $ARR_OUT[$b+2])
            $srtcheck = 1
            $tmp = $ARR_OUT[$b]
            $tmp2 = $ARR_OUT[$b+1]
            $ARR_OUT[$b] = $ARR_OUT[$b+2]
            $ARR_OUT[$b+1] = $ARR_OUT[$b+3]
            $ARR_OUT[$b+2] = $tmp
            $ARR_OUT[$b+3] = $tmp2
         END_IF
      END_CYC
      IF($srtcheck = 0)
         $srt = 1
      END_IF
   END_CYC
   $str = ""
   FOR($a=0,$a<ARRSIZE($ARR_OUT),2)
      IF(STRLEN($str) > 0)
         IF($ARR_OUT[$a]-$ARR_OUT[$a-2] > 100) // обпределение пробела
            $str = STRCONCAT($str, " ")
         END_IF
         $str = STRCONCAT($str, $ARR_OUT[$a+1])
      ELSE
         $str = $ARR_OUT[$a+1]
      END_IF
   END_CYC
   UNDEFINE($ARR_OUT)
   UNDEFINE($ARR_SCAN)
END_SUB

GETSCREEN
COLORMODE(6)
SCANPICTURE($ARR_SCAN2, 0,0, $_xmax,$_ymax, "Впродаже.bmp", -1, 80) // поиск "В продаже", уточнить область поиска
COLORMODE(8)
FOR($i=0,$i<ARRSIZE($ARR_SCAN2),2)
   recognize($ARR_SCAN2[$i]+320, $ARR_SCAN2[$i+1]-7, $ARR_SCAN2[$i]+402, $ARR_SCAN2[$i+1]+16) // область распознавания
   LOGWRITE("№: ", $i, " ", $str)
   IF($str <= 10000) // действие если значение меньше или равно 10000
      LCLICK($ARR_SCAN2[$i], $ARR_SCAN2[$i+1]) // клик "В продаже"
      WAITMS(500)
      LCLICK(10,10) // Клик "Купить", уточнить координату
      WAITMS(500)
      $i=9999 // выход из цикла
      HALT // Стоп (если таребуется)
   END_IF
END_CYC
UNDEFINE($ARR_SCAN2)

IF($i ! 9999) // если не найдено подходящей цены
   LCLICK(10,10) // Клик "Обновить", уточнить координату
END_IF

WAITMS(2000)



Прилагаю архив. В нем пример который гарантированно по твоей картинке распознает цену в каждой строке.
В логе можно увидеть результат.

В папке "Letters" находятся картинки чисел.
Картинки получены в режиме цветокоррекции COLORMODE( 8 )
Формат имени картинки должен быть таким: "2_90.bmp"
2 - символ который изображен на картинке
90 - процент совпадения при поиске картинки.
Разделителем параметров считается символ "_"

Можно поместить несколько картинок вариантов одного и того же числа, задав каждой свой процент совпадения.
"2_1_90.bmp"
"2_2_100.bmp"
"2_3_80.bmp"
Для параметров важен первый символ и последнее число, то что по середине не важно.

В скрипте два цикла, первый ищет все слова "В продаже", второй относительно этого слова проверяет цену.
Не знаю как там у тебя выделяется товар, написал просто клик по слову "В продаже".
Если цена подходящая выделяетс товар и кликает по кнопке  "Купить", и останавливает выполнение.
Если не найдено подходящей цены, жмет обновить и опять по кругу.
Скрипт конечно красивый но не рабочий слово в продаже он не находит, про клики я уже писал , скорость крипта тоже оставляет желать лучшего, но это всё мелочи главное что по мне лучше изменить это поиск нужного числа , а не кнопки в продаже , в ближайшие время я его сам коректну и загружу

Gamezoo7

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Code: [Select]
SUB(recognize, $x1,$y1, $x2,$y2)
   GETFILELIST($Letters_arr, "Letters\*.bmp")
   FOR($Let_num=0,$Let_num<ARRSIZE($Letters_arr))
      STRSEPARATE($Letters_arr[$Let_num], "_", $a_l)
      SCANPICTURE($ARR_SCAN, $x1,$y1, $x2,$y2, STRCONCAT("Letters\", $Letters_arr[$Let_num]), -1, STRREPLACE($a_l[ARRSIZE($a_l)-1],".bmp",""))
      UNDEFINE($a_l)
      FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
         ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
         ARRPUSH($ARR_OUT, STRCUT($Letters_arr[$Let_num], 1, 1))
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
   $siz = ARRSIZE($ARR_OUT)
   $srtcheck = 0
   $srt = 0
   FOR($a=$siz-2,($a>0)&($srt=0),-2)
      FOR($b=0,$b<$a,2)
         IF($ARR_OUT[$b] > $ARR_OUT[$b+2])
            $srtcheck = 1
            $tmp = $ARR_OUT[$b]
            $tmp2 = $ARR_OUT[$b+1]
            $ARR_OUT[$b] = $ARR_OUT[$b+2]
            $ARR_OUT[$b+1] = $ARR_OUT[$b+3]
            $ARR_OUT[$b+2] = $tmp
            $ARR_OUT[$b+3] = $tmp2
         END_IF
      END_CYC
      IF($srtcheck = 0)
         $srt = 1
      END_IF
   END_CYC
   $str = ""
   FOR($a=0,$a<ARRSIZE($ARR_OUT),2)
      IF(STRLEN($str) > 0)
         IF($ARR_OUT[$a]-$ARR_OUT[$a-2] > 100) // обпределение пробела
            $str = STRCONCAT($str, " ")
         END_IF
         $str = STRCONCAT($str, $ARR_OUT[$a+1])
      ELSE
         $str = $ARR_OUT[$a+1]
      END_IF
   END_CYC
   UNDEFINE($ARR_OUT)
   UNDEFINE($ARR_SCAN)
END_SUB

GETSCREEN
COLORMODE(6)
SCANPICTURE($ARR_SCAN2, 1161, 205, 1327, 232, "Впродаже.bmp", -1, 80) // поиск "В продаже", уточнить область поиска
COLORMODE(8)
FOR($i=0,$i<ARRSIZE($ARR_SCAN2),2)
   recognize($ARR_SCAN2[$i]+320, $ARR_SCAN2[$i+1]-7, $ARR_SCAN2[$i]+402, $ARR_SCAN2[$i+1]+16) // область распознавания
   LOGWRITE("№: ", $i, " ", $str)
   IF($str <= 10000) // действие если значение меньше или равно 10000
      waitms(40 + $S_CORR)
     move(1756,222)
     waitms(60 + $S_CORR)
     lDown(1756,222)
     waitms(53 + $S_CORR)
     lUp(1756,222)
     waitms(14 + $S_CORR)
     // deleted
     waitms(9 + $S_CORR)
     keyUp(118) // клик "В продаже"
     
     
      waitms(7 + $S_CORR)
      move(1775,976)
      waitms(100 + $S_CORR)
      lDown(1775,976)
      waitms(85 + $S_CORR)
      lUp(1775,976)
      waitms(83 + $S_CORR)
     // deleted
     waitms(9 + $S_CORR)
     keyUp(118) // Клик "Купить", уточнить координату
      WAITMS(500)
      $i=9999 // выход из цикла
      HALT // Стоп (если таребуется)
   END_IF
END_CYC
UNDEFINE($ARR_SCAN2)

IF($i ! 9999) // если не найдено подходящей цены
   waitms(100 + $S_CORR)
move(1806,112)
waitms(100 + $S_CORR)
  lDown(1806,112)
waitms(100 + $S_CORR)
  lUp(1804,113)
waitms(100 + $S_CORR)
// deleted
waitms(100 + $S_CORR)
  keyUp(118) // Клик "Обновить", уточнить координату
END_IF

WAITMS(2000)

вот немного доделанная версия, я потестил заменив условие обнаружения на цвет надписи но все равно ничего не присходит

Gamezoo7

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
В общем провел я пару эксперементов, но даже чужие программы на определение чисел не находят вообще числа на картинках, что делать не знаю , опытные кодеры помогите

TonyJ

  • Зашел в гости
  • *
  • Posts: 1
    • View Profile
Понял
« Last Edit: July 09, 2019, 08:07:07 PM by TonyJ »