Author Topic: Помогите изменить подпрограмму analiz  (Read 3626 times)

0 Members and 1 Guest are viewing this topic.

zanogu

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Привет!
Возможна не в ту тему :)
Помогите пожалуйста упростить код
Подпрограмма analiz разрослось до некоторых объемов, делает анализ там где не нужно, хочется упростить.
Возможна описать подпрограмму так чтоб анализ экрана происходил точечно, не прогоняя весь массив данных?

//Блок констант
DEFINE ($a, 1)//
DEFINE ($b, 2)//
DEFINE ($c, 3)//
.....
DEFINE ($N, n)//

//Блок анализа экрана
sub (analiz)
$atrue = PXLCRC (x,y,x1,y1)//
$btrue = PXLCRC (x,y,x1,y1)//
$ctrue = PXLCRC (x,y,x1,y1)//
..........
$Ntrue = PXLCRC (x,y,x1,y1)//
end_sub

analiz ()
if ($a  = $atrue)
lclick (x,y)//
end_if

analiz ()
if ($b  = $btrue)
lclick (x,y)//
end_if

analiz ()
if ($c  = $ctrue)
lclick (x,y)//
end_if
............
analiz ()
if ($N  = $Ntrue)
lclick (x,y)//
end_if

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Помогите изменить подпрограмму analiz
« Reply #1 on: February 10, 2017, 12:06:09 PM »
Зачем анализировать кучу точек если ниже идет конкретное условие?
Почему просто не написать
Code: (clickermann) [Select]
if ($a  = PXLCRC (x,y,x1,y1))
lclick (x,y)//
end_if

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Помогите изменить подпрограмму analiz
« Reply #2 on: February 10, 2017, 05:01:40 PM »
Возможна не в ту тему :)

Не в ту.


zanogu

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Re: Помогите изменить подпрограмму analiz
« Reply #3 on: February 10, 2017, 08:44:10 PM »
Зачем анализировать кучу точек если ниже идет конкретное условие?
Почему просто не написать
Code: (clickermann) [Select]
if ($a  = PXLCRC (x,y,x1,y1))
lclick (x,y)//
end_if

Мда, все оригинально и просто. Спасибо

Еще вопрос
(x,y,x1,y1) загнать в константу можно?
Например:
Define ($a, 1, x,y,x1,y1)// знаю что не правильно но принцып думаю понятен
If ($a = pxlcrc)
Lclick (x,y)
End_if

Просто по скрипту потом искать координаты при больших массивах неудобно будет

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Помогите изменить подпрограмму analiz
« Reply #4 on: February 10, 2017, 09:07:43 PM »
если я правильно понял, то возможно вот так
Code: (clickermann) [Select]
//Блок констант
//выгоднее было бы писать твои константы в массив, с ним проще вызывать далее подпрограммы через тотже цикл.
DEFINE ($a, 1)//
DEFINE ($b, 2)//
DEFINE ($c, 3)//


sub (analiz,$N)
   //если после клика картинка меняется, не забываем про getscreen
   if ($N = PXLCRC (x,y,x1,y1)) //тут координаты я так понял из прочитанного выше - постоянны
      lclick (x,y)// если координаты клика могут разниться, то и их можно дописать в пораметры подпрограммы
      //в этом случае их также придется добавлять при вызове.
   end_if
end_sub

analiz ($a)
analiz ($b)
analiz ($c)


а вот про это
Quote
Еще вопрос
(x,y,x1,y1) загнать в константу можно?
Например:
Define ($a, 1, x,y,x1,y1)// знаю что не правильно но принцып думаю понятен
If ($a = pxlcrc)
Lclick (x,y)
End_if
даже  и забыл, так как сразу "нет", какаято глупая затея :D .  впринципе если бы была возможность писать функции, то можно было бы.... :D
« Last Edit: February 10, 2017, 09:13:52 PM by dramster »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Помогите изменить подпрограмму analiz
« Reply #5 on: February 10, 2017, 09:46:31 PM »
всеже немного почитал более внимательно. и пришел к выводу, что ты сканируешь какието отдельные участки экрана, и если их хэш совпадет с записанным ранее, то клик в какоето место. но в этом случае все координаты и значения хэш походу будут разнится. и написанное мной выше тебе не подойдет. вот тебе вариант, где все ппараметры вынесены в подпрограмме, таким образом легче будет ничего не попутать в вызовах, и никаких констант.
Code: (clickermann) [Select]
sub (analiz,$crc,$x,$y,$x1,$y1,$x_click,$y_click)
   //если после клика картинка меняется, не забываем про getscreen
   if ($crc = PXLCRC ($x,$y,$x1,$y1))
      lclick ($x_click,$y_click)
   end_if
end_sub

analiz (4343434352,100,100,110,110,105,104) //тут пишешь через запятую - значение PXLCRC, координаты анализа, и координаты клика (7 значений через запятую)




zanogu

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Re: Помогите изменить подпрограмму analiz
« Reply #6 on: February 10, 2017, 11:56:12 PM »
всеже немного почитал более внимательно. и пришел к выводу, что ты сканируешь какието отдельные участки экрана, и если их хэш совпадет с записанным ранее, то клик в какоето место. но в этом случае все координаты и значения хэш походу будут разнится. и написанное мной выше тебе не подойдет. вот тебе вариант, где все ппараметры вынесены в подпрограмме, таким образом легче будет ничего не попутать в вызовах, и никаких констант.
Code: (clickermann) [Select]
sub (analiz,$crc,$x,$y,$x1,$y1,$x_click,$y_click)
   //если после клика картинка меняется, не забываем про getscreen
   if ($crc = PXLCRC ($x,$y,$x1,$y1))
      lclick ($x_click,$y_click)
   end_if
end_sub

analiz (4343434352,100,100,110,110,105,104) //тут пишешь через запятую - значение PXLCRC, координаты анализа, и координаты клика (7 значений через запятую)




Спасибо очень помогли. Пофантазировал
Сделал так

// New Script
// Author: Anonymous
// Version: 1.0 (10.02.2017)

#autorun

wndpos( wndfind("BlueStacks App Player"), 0, 0)
$h = WNDFIND ("BlueStacks App Player")
HSET ($h, 1)// привязка мыши к окну

//Тут будет блок констант для удобства замены или правки. Возможно уберу в текстовый файл с вызовом.
#define $a:3216221726,484,311,486,312,365,304

sub (analiz, $1,$x,$y,$x1,$y1,$x_click,$y_click)
   getscreen
   if ($1= pxlcrc ($x,$y,$x1,$y1)
      lclick ($x_click,$y_click)
   end_if
end_sub

analiz ($a)


halt // for single run

Игра иногда апдейтится нужно менять хэш.
Для меня удобно когда есть блок где все хеши в одном месте.
Использую ряд скриптов для разных задач. И все они используююь идентичные константы
Так будет в одном месте и хэш и координаты ну и клик :)

Еще раз спасибо

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Помогите изменить подпрограмму analiz
« Reply #7 on: February 11, 2017, 12:23:23 AM »
#define $a:3216221726,484,311,486,312,365,304   - во ты выдал канешна  ;D

я конечно читал там чето в справке когдато про МАКРОСЫ ПРЕПРОЦЕССОРА, но както ну вообще ниразу не пришло мне в голову чтото этоковое применить  ;D.

а это штука еще и работает  :o, да еще и так как положено  :o
Code: (clickermann) [Select]
#define $a:3216221726,484,311,486,312,365,304


sub (analiz,$crc,$x,$y,$x1,$y1,$x_click,$y_click)
   
   print($crc)
   print($x)
   MOVE($x_click,$y_click)
     
end_sub


wait(1)
analiz ($a)


halt
в логе то что требовалось, курсор перемещен


честно, ниразу даже на форуме не видел  ;D

i0

  • Оплот сообщества
  • ****
  • Posts: 353
  • CMann 4.13.014 final, ie, presto, win7 x86, x64
    • View Profile
Re: Помогите изменить подпрограмму analiz
« Reply #8 on: February 11, 2017, 12:25:44 AM »
zanogu
только $1 - недопустимое имя переменной. имя не должно начинаться с цифры (по крайней мере так в справке Джонни написал)

zanogu

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Re: Помогите изменить подпрограмму analiz
« Reply #9 on: February 11, 2017, 12:37:44 PM »
zanogu
только $1 - недопустимое имя переменной. имя не должно начинаться с цифры (по крайней мере так в справке Джонни написал)

Спасибо, учту

zanogu

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Re: Помогите изменить подпрограмму analiz
« Reply #10 on: March 05, 2017, 11:40:37 AM »

#define $Arena:3216221726,484,311,486,312,365,304,2,end,Центральная прлощадка игры
.....
#define $EnterArena:3216221726,484,311,486,312,365,304,2,Arena,Вход в арену

sub (analiz, $crc,$x,$y,$x1,$y1,$x_click,$y_click,$pausa,$perekluchatel,$log)
start:
   if ($restart<15)
      // Проверка на подгруз игры
      getscreen
      colormode (6)
      if_picture_in (455,285,502,339, "load.bmp", 0,80)
         logwrite ("Пауза подгрузка")
         inc ($restart)
         wait (3)
         goto (start)
      end_if
      //Проверка на рекламу
      getscreen
      if ($AddTrue = PXLCRC (48,39,48,39))
         logwrite ("Закрываю окно рекламы")
         lclick (665, 531)
         wait (3)
         goto (start)
      end_if
   else
      logwrite ("Рестрат", $restart)
      if ($restart>15)
         $restart=0
         restart()
         goto (start)
      end_if
   end_if
   getscreen
   if (($crc = pxlcrc ($x,$y,$x1,$y1)) & ($restart<15))
      logwrite ($crc)
      $restart = 0
      lclick ($x_click,$y_click)
      logwrite ($log)
      wait ($pausa)
   else
      restart ()
      $restart=0
      goto ($perekluchatel)
   end_if
end_sub

arena:
analiz ($EnterArena)//Розвернуть нижнюю панель игры
analiz ($ArenaPanel)//Переход в тип арены
analiz ($ArenaChous)//Выбор типа арены
for ($i, $i>5)
   analiz ($ArenaTake)
   lclick (838,503)
   wait (3)
   analiz ($ArenaAttake)
   analiz ($ArenaDrop)
   analiz ($ArenaWinLost)
end_cyc
$i=0

end:
hult


Если использвать цыкл for или while, то при входе в него крашится/ошибка pop () по всех переменных из подпрограммы analiz начиная с
$y=pop()
$x1=pop()
$y1=pop()
...
$log

Если не использовать цыклы тогда все норм. Вопрос где я налошил?

open_78

  • Активный участник
  • ***
  • Posts: 285
  • v4.13.014 x64
    • View Profile
Re: Помогите изменить подпрограмму analiz
« Reply #11 on: March 05, 2017, 12:53:39 PM »
Code: (clickermann) [Select]
#define $Arena:3216221726,484,311,486,312,365,304,2,end,Центральная прлощадка игры
.....
#define $EnterArena:3216221726,484,311,486,312,365,304,2,Arena,Вход в арену

sub (analiz, $crc,$x,$y,$x1,$y1,$x_click,$y_click,$pausa,$perekluchatel,$log)
start:
   if ($restart<15)
      //
      getscreen
      colormode (6)
      if_picture_in (455,285,502,339, "load.bmp", 0,80)
         logwrite ("Пауза подгрузка")
         inc ($restart)
         wait (3)
         goto (start)
      end_if
      //
      getscreen
      if ($AddTrue = PXLCRC (48,39,48,39))
         logwrite ("Закрываю окно рекламы")
         lclick (665, 531)
         wait (3)
         goto (start)
      end_if
   else
      logwrite ("Рестрат", $restart)
      if ($restart>15)
         $restart=0
         restart()
         goto (start)
      end_if
   end_if
   getscreen
   if (($crc = pxlcrc ($x,$y,$x1,$y1)) & ($restart<15))
      logwrite ($crc)
      $restart = 0
      lclick ($x_click,$y_click)
      logwrite ($log)
      wait ($pausa)
   else
      restart ()
      $restart=0
      goto ($perekluchatel)
   end_if
end_sub

arena:
analiz ($EnterArena)//
analiz ($ArenaPanel)//
analiz ($ArenaChous)//
for ($i=0, $i<5) //правильно. У тебя for - ($i, $i>5)
   analiz ($ArenaTake)
   lclick (838,503)
   wait (3)
   analiz ($ArenaAttake)
   analiz ($ArenaDrop)
   analiz ($ArenaWinLost)
end_cyc
$i=0  // Это не нужно

end:
HALT //правильно. У тебя - hult
« Last Edit: March 05, 2017, 12:55:10 PM by open_78 »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Помогите изменить подпрограмму analiz
« Reply #12 on: March 05, 2017, 01:15:52 PM »
Не используй в #define знак доллара как в переменной, потом по скрипту непонятно где замена а где переменные.
Строки должны быть заключены в кавычки.
Выпрыгивать через GOTO из подпрограмм и циклов нельзя. Это приводит к ошибкам.

Code: (clickermann) [Select]
#define $Arena:3216221726,484,311,486,312,365,304,2,"end","Центральная площадка игры"
#define $EnterArena:3216221726,484,311,486,312,365,304,2,"Arena","Вход в арену"