Author Topic: помогите грамотно построить код  (Read 3889 times)

0 Members and 1 Guest are viewing this topic.

Ellen

  • Освоившийся
  • **
  • Posts: 54
    • View Profile
Re: печалька
« Reply #30 on: January 22, 2023, 05:26:59 PM »

Quote

А ты не в состоянии поиск пикселей намутить что ль...? ))

Не полностью знаю команды CASE и SWITCH($position)
В какую часть подставлять поиск пикселя?
Что обрабатывают данные команды конкретно тут?

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: печалька
« Reply #31 on: January 22, 2023, 06:37:11 PM »

Quote

А ты не в состоянии поиск пикселей намутить что ль...? ))

Не полностью знаю команды CASE и SWITCH($position)
В какую часть подставлять поиск пикселя?
Что обрабатывают данные команды конкретно тут?

Ватсон, элементарно! С помощью пикселей определяешь - в какую сторону тебе нужно. И определив, присваиваешь перменной - $position, значение (либо "right", либо "left"), а далее условие SWITCH по этим значениям определает, как действовать.
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите грамотно построить код
« Reply #32 on: January 22, 2023, 06:42:50 PM »
Можно ли как то увидеть те точки, на которые ошибочно срабатывает кликер? Ну т.е. сохранение картинок в файл, с пометкой точки на котору реагирвоал кликер

Code: (clickermann) [Select]
$path = "screens\Цех"



IF($start = 0)
   $start = 1
   
   if (FExists($path)=0)
      FCREATE ($path)
   end_if
   
   GETFILELIST ($arr, STRCONCAT($path,"\*.bmp"))
   FOR($a=0,$a<ARRSIZE($arr))
      FDELETE (STRCONCAT($path,"\",$arr[$a]))
   END_CYC
   UNDEFINE ($arr)
END_IF



SUB(bordering, $x_bord1,$y_bord1, $x_bord2,$y_bord2, $color)
   PXLREPLACE($x_bord1-1,$y_bord1-1, $x_bord2+1,$y_bord1-1, -1, $color)
   PXLREPLACE($x_bord1-1,$y_bord2+1, $x_bord2+1,$y_bord2+1, -1, $color)
   PXLREPLACE($x_bord1-1,$y_bord1-1, $x_bord1-1,$y_bord2+1, -1, $color)
   PXLREPLACE($x_bord2+1,$y_bord1-1, $x_bord2+1,$y_bord2+1, -1, $color)
END_SUB

GETSCREEN(771, 567, 786, 682)
IF_PIXEL_IN(771, 567, 786, 682, 1446725, 1579598, 2301001, 5653088)
   bordering ($_return1,$_return2, $_return1,$_return2, 255)
   
   GETFILELIST ($arr, STRCONCAT($path,"\*.bmp"))
   $n = ARRSIZE($arr)
   UNDEFINE ($arr)
   
   SCREENSHOTFIX(771, 567, 786, 682, STRCONCAT($path,"\",$n,".bmp"), 0)
   
   $left_time = 0
   IF($right_time < $_ms)
      KEYDOWN(#RIGHT)
      WAITMS(40)
      KEYUP(#RIGHT)
      $right_time = $_ms + 100
   END_IF
ELSE
   $right_time = 0
   IF($left_time < $_ms)
      KEYDOWN(#LEFT)
      WAITMS(40)
      KEYUP(#LEFT)
      $left_time = $_ms + 100
   END_IF
END_IF

WAITMS(50)

При запуске этого кода возникает ошибка
Игнорируя её, скрипт запускается, но останавливается самопроизвольно со звуком ошибки, почему?

Ты вот эту переменную в скрипте оставляешь? ($path = "screens\Цех")
Я не ду... Потому и не бу...

Ellen

  • Освоившийся
  • **
  • Posts: 54
    • View Profile
Re: помогите грамотно построить код
« Reply #33 on: January 22, 2023, 07:32:39 PM »

Quote

Ты вот эту переменную в скрипте оставляешь? ($path = "screens\Цех")

Нет, пробовал оставлять только screens или давал другое имя, все равно упирается в ошибку, тут скорее всего всё работает просто я слаб знаниями в области этих переменных...  ???

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите грамотно построить код
« Reply #34 on: January 22, 2023, 07:37:28 PM »

Quote

Ты вот эту переменную в скрипте оставляешь? ($path = "screens\Цех")

Нет, пробовал оставлять только screens или давал другое имя, все равно упирается в ошибку, тут скорее всего всё работает просто я слаб знаниями в области этих переменных...  ???

Ахах  ;D Я тут (на этом форуме) лет 10 назад Винта с этими переменными так достал, что он мне в личку начал писать и интересоваться - я действительно никак понять не могу, или троллю форум своими вопросами  ;D

Короче вот мой скрипт полный.

Code: (clickermann) [Select]
#include "subs\bordering.cms"
#include "subs\MouseClick.cms"



$path = "screens\Цех"


IF($start = 0)
   $start = 1
   
   if (FExists($path)=0)
      FCREATE ($path)
   end_if
   
   GETFILELIST ($arr, "screens\Цех\*.bmp")
   FOR($a=0,$a<ARRSIZE($arr))
      FDELETE (STRCONCAT("screens\Цех\",$arr[$a]))
   END_CYC
   UNDEFINE ($arr)
END_IF

THREAD(hotkeys, 1)
   
   IF(ISKEYDOWN(#DOWN)=1)
      LOGWRITE ("Стоп...")
      $script = 0
      WHILE(ISKEYDOWN(#DOWN)=1)
         WAITMS(50)
      END_CYC
   END_IF
   
   IF(ISKEYDOWN(#LEFT)=1)
      LOGWRITE ("Поехали!")
      $position = "left"
      $script = 1
      WHILE(ISKEYDOWN(#LEFT)=1)
         WAITMS(50)
      END_CYC
   END_IF
   
   IF(ISKEYDOWN(#RIGHT)=1)
      LOGWRITE ("Поехали!")
      $position = "right"
      $script = 1
      WHILE(ISKEYDOWN(#RIGHT)=1)
         WAITMS(50)
      END_CYC
   END_IF
   
   WAITMS(50)
   
END_THREAD



IF($script > 0)
   
   GETSCREEN (1061,800, 1505,1351)
   
   bordering (1061+170,917, 1061+194,1032, 255) // Обводим поле 1
   bordering (1061+243,917, 1061+267,1032, 255) // Обводим поле 2
   bordering (1086,917, 1259-32,1032, 255) // Обводим поле 3
   bordering (1300+32,917, 1479,1032, 255) // Обводим поле 4
   
   $pos = "_"
   IF_PICTURE_IN (1061+81,800+517, 1061+86,800+521, "screens\упс.bmp", -1, 100) // Здесь определяем фейл и конец игры
      MouseClick("L", $_return1+50, $_return2+10) // И кликаем, чтобы начать игру заново
      WAITMS(1000)
   else
      IF_PIXEL_IN(1061+170,917, 1061+194,1032, 1446725,5256016)  // Здесь ищем пиксель в поле 1
         bordering ($_return1,$_return2, $_return1,$_return2, 255) // Обводим его, для инфы на скрине
         $pos = "right"
      else
         
      END_IF
     
      IF_PIXEL_IN(1061+243,917, 1061+267,1032, 1446725,5256016) // Здесь ищем пиксель в поле 2
         bordering ($_return1,$_return2, $_return1,$_return2, 255) // Тоже обводим
         $pos = "left"
      else
         
      END_IF
   END_IF
   
   IF($pos = "_") // Если в поле 1 и 2 пиксели были не найдены, то ищем пиксели в поле 3 и 4. Причем не нужно в левый поиск пихать пиксели правых веток и наоборот.
     
      IF_PIXEL_IN(1086,917, 1259-32,1032, 5605331,10072785,10784132)
         bordering ($_return1,$_return2, $_return1,$_return2, 255)
         $pos = "right"
      else
         
      END_IF
     
      IF_PIXEL_IN(1300+32,917, 1479,1032, 1916556,5589345)
         bordering ($_return1,$_return2, $_return1,$_return2, 255)
         $pos = "left"
      else
         
      END_IF
     
   END_IF
   
   GETFILELIST ($arr, "screens\Цех\*.bmp") // Здесь чисто считаем сколько уже сохранено скринов, чтобы
   $n = ARRSIZE($arr) // скрины сохранять по порядку
   UNDEFINE ($arr)
   SCREENSHOTFIX(1061,800, 1505,1251, STRCONCAT("screens\Цех\",$n,".bmp"), 0)
   
   IF($pos ! "_") // Если в каком-то из полей была определена ветка
      $position = $pos // То присваиваем значение right или left
   END_IF
   
   // Ну, а если ветка не была найдена вообще, то пусть перс долбит с той стороны, с которой долбил на прошлом кругу скрипта
   
   SWITCH($position)
      CASE("right")
         
         $left_time = 0
         IF($right_time < $_ms)
            KEYPRESS(#RIGHT)
            $right_time = $_ms + 150
         END_IF
         
      CASE("left")
         
         $right_time = 0
         IF($left_time < $_ms)
            KEYPRESS(#LEFT)
            $left_time = $_ms + 150
         END_IF
         
   END_SWITCH
   
END_IF

WAITMS(50)

По поводу MouseClick("L", $_return1+50, $_return2+10) - http://crapware.aidf.org/forum/index.php?topic=5750.0 Ато тоже голову сломаешь над этим...  ;D



В 1 и 2 зоне ищем ветки, на которых НЕ висят куски льда. Эти ветки мы ищем по цвету пикселей, взятых "из под мышки" этих веток.
В зонах 3 и 4 мы ищем ветки, на которых висят куски льда. Их мы ищем по пикселям, взятым со срезов веток.



Все пиксели ищем без COLORMODE. Они так уникальнее...
Итог...

« Last Edit: January 22, 2023, 09:02:46 PM by Hito »
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите грамотно построить код
« Reply #35 on: January 22, 2023, 08:26:05 PM »

Quote

Ты вот эту переменную в скрипте оставляешь? ($path = "screens\Цех")

Нет, пробовал оставлять только screens или давал другое имя, все равно упирается в ошибку, тут скорее всего всё работает просто я слаб знаниями в области этих переменных...  ???

Изучи вот это: (правда примечание тут ошибочное)


И вот это:


Code: (clickermann) [Select]
$path = "screens\Цех" // В переменную $path мы подставляем значение - "screens\Цех"
Code: (clickermann) [Select]
if (FExists($path)=0) // Тут у нас по сути получается - if (FExists("screens\Цех")=0). Это условие "звучит" так - "Если этих папок нет"
Code: (clickermann) [Select]
FCREATE ($path) // И если не существуют, то создаем их, чтобы потом в них скрины сохранять.
Жаль, что когда тут просят помощи, в итоге приходится тратить время, на ссылки в справку кликера, которую вы похоже даже не открываете. Я в свое время хоть и ставил на уши этот форум своими вопросами, эту справку читал и перечитывал раз 300 и потом уже доставал своими вопросами о том, что я никак не мог понять...
« Last Edit: January 22, 2023, 08:32:45 PM by Hito »
Я не ду... Потому и не бу...

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: помогите грамотно построить код
« Reply #36 on: January 23, 2023, 09:52:11 AM »

Изучи вот это: (правда примечание тут ошибочное)


Code: (clickermann) [Select]
if (FExists($path)=0) // Тут у нас по сути получается - if (FExists("screens\Цех")=0). Это условие "звучит" так - "Если этих папок нет"
Жаль, что когда тут просят помощи, в итоге приходится тратить время, на ссылки в справку кликера, которую вы похоже даже не открываете. Я в свое время хоть и ставил на уши этот форум своими вопросами, эту справку читал и перечитывал раз 300 и потом уже доставал своими вопросами о том, что я никак не мог понять...

Причина очень простая. Ты не указал версию кликера под которую писал скрипт. Нужно всегда указывать версии ПО, особенно если используешь не релизные версии.
FExists появилась только в 4.14 (и FCREATE там же), а версия 4.14 с бэты так и не вылезла. Человек наверняка использует версию 4.13.


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: помогите грамотно построить код
« Reply #37 on: January 23, 2023, 09:54:51 AM »
А че пропал-то?  ;D Вкурил - для чего все это?  ;D ;D ;D Я только с утра вкурил...  ;D На сколько редко ошибается? Сколько поинтов максимально собирал? ))
Я уже уходя с работы тему увидел. Набросал скрипт, потестил, сделал ещё 3 варианта и свалил домой. А дома у меня выходные  :D поэтому такие конкурсы не для меня. Нафиг это олимпиадное программирование на время.


Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите грамотно построить код
« Reply #38 on: January 23, 2023, 02:52:47 PM »

Изучи вот это: (правда примечание тут ошибочное)


Code: (clickermann) [Select]
if (FExists($path)=0) // Тут у нас по сути получается - if (FExists("screens\Цех")=0). Это условие "звучит" так - "Если этих папок нет"
Жаль, что когда тут просят помощи, в итоге приходится тратить время, на ссылки в справку кликера, которую вы похоже даже не открываете. Я в свое время хоть и ставил на уши этот форум своими вопросами, эту справку читал и перечитывал раз 300 и потом уже доставал своими вопросами о том, что я никак не мог понять...

Причина очень простая. Ты не указал версию кликера под которую писал скрипт. Нужно всегда указывать версии ПО, особенно если используешь не релизные версии.
FExists появилась только в 4.14 (и FCREATE там же), а версия 4.14 с бэты так и не вылезла. Человек наверняка использует версию 4.13.

Да просто кликер уже не развивается и я забыл про версии.
« Last Edit: January 23, 2023, 02:55:02 PM by Hito »
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите грамотно построить код
« Reply #39 on: January 23, 2023, 02:53:55 PM »
А че пропал-то?  ;D Вкурил - для чего все это?  ;D ;D ;D Я только с утра вкурил...  ;D На сколько редко ошибается? Сколько поинтов максимально собирал? ))
Я уже уходя с работы тему увидел. Набросал скрипт, потестил, сделал ещё 3 варианта и свалил домой. А дома у меня выходные  :D поэтому такие конкурсы не для меня. Нафиг это олимпиадное программирование на время.

Ну, там просто если залогиниться, то становится видно, что это всё ради реальных лаве ))))
Я не ду... Потому и не бу...