Author Topic: Помогите упорядочить действия выполнения подпрограм  (Read 5185 times)

0 Members and 5 Guests are viewing this topic.

Eney

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Нужно чтобы в подпрограмме SUB(bast) все действия выполнялись последовательно и другое не начиналось пока не закончится выполнение предыдущего. По факту доходит до выполнения подпрограммы atk() и там после выполнения 1 условия все останавливается.
Сама по себе подпрограмма atk() работает корректно.


Code: [Select]
SUB(bast)
GETSCREEN
IF_PIXEL_IN(1294,467, 1302,473, 1711650)  // áàøíÿ 1
   LCLICK(1307,457)
   WAITMS(500)
atk()
END_IF   
IF_PIXEL_IN(1290,504, 1302,511, 855307) //áàøíÿ 2
   LCLICK(1280,494)
   WAITMS(500)
atk()
END_IF   
IF_PIXEL_IN(1227,528, 1238,533, 1579808) //áàøíÿ 3
   LCLICK(1249,517)
   WAITMS(500)
atk()
END_IF   
IF_PIXEL_IN(1255,559, 1268,566, 1448222) //áàøíÿ 4
   LCLICK(1280,550)
   WAITMS(500)
atk()
END_IF
IF_PIXEL_IN(1288,593, 1299,602, 1843493) //áàøíÿ 5
   LCLICK(1309,584)
   WAITMS(500)
atk()
END_IF
IF_PIXEL_IN(1350,593, 1362,601, 1711908) //áàøíÿ 6
   LCLICK(1370,587)
   WAITMS(500)
atk()
END_IF
IF_PIXEL_IN(1445,594, 1460,603, 2566701) //áàøíÿ 7
   LCLICK(1437,584)
   WAITMS(500)
atk()
END_IF
IF_PIXEL_IN(1476,559, 1489,569, 2171943) //áàøíÿ 8
   LCLICK(1464,551)
   WAITMS(500)
atk()
END_IF
IF_PIXEL_IN(1507,528, 1519,535, 2040358) //áàøíÿ 9
   LCLICK(1497,519)
   WAITMS(500)
atk()
END_IF
IF_PIXEL_IN(1444,504, 1455,512, 1975080) //áàøíÿ 10
   LCLICK(1464,498)
   WAITMS(500)
atk()
END_IF
IF_PIXEL_IN(1414,467, 1424,475, 2235671) //áàøíÿ 11
   LCLICK(1433,458)
   WAITMS(500)
atk()
END_IF
END_SUB

SUB(atk)
GETSCREEN
IF_PIXEL_IN(1296,571, 1330,590, 14385747) //îêíî àòàêà "íàïàñòü"
   LCLICK($_return1, $_return2)
   WAITMS(500)
END_IF   
IF_PIXEL_IN(1400,796, 1437,812, 2071390)  // îêíî âûáîðà àðìèè "íà÷àòü áîé"
   LCLICK($_return1, $_return2)
   WAITMS(500)
END_IF   
IF_PIXEL_IN(1294,832,1322,846, 13729617) //íà÷àëî áîÿ "íà÷àòü áîé"
   LCLICK($_return1, $_return2)
   WAITMS(500)
LCLICK(1352,774)  // êëèê íà óñêîðåíèå àíèìàöèè
END_IF   
   IF_PIXEL_IN(1354,639,1374,654, 13794897) //çàâåðøåíèå "ïðîäîëæèòü"
   LCLICK($_return1, $_return2)
   WAITMS(1000)
END_IF   
   IF_PIXEL_IN(1221,608, 1233,618, 10313019) //ïîðàæåíèå "ïðîäîëæèòü"
   LCLICK($_return1, $_return2)
   WAITMS(1000)
END_IF
END_SUB

WHILE($var < 5)
bast()
WAITMS(500)
END_CYC
« Last Edit: January 11, 2018, 12:40:20 AM by Eney »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Чудеса прям. Все подпрограммы вызываются до тела и что не вылазит ошибка pop() ?
Не верю!


Eney

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Чудеса прям. Все подпрограммы вызываются до тела и что не вылазит ошибка pop() ?
Не верю!
Ошибки нет. Извиняюсь тело у меня в конце подпрограм, это я в примере почему то вверх прилепил.
Я немного разобрался почему подпрограмма atk() прерывалась , так как содержимое экрана менялось то надо опять прописывать функцию GETSCREEN.
Но тогда возникает другая проблема в определенном месте действие происходит дольше чем появляется новое окно для сканирования через GETSCREEN и в итоге на этом месте зависает.
Видимо надо добавить условие что если не находит нужный пиксель то возвращает опять на GETSCREEN. Только как это сделать еще не разобрался.
И вообще все у меня очень громоздко и наляписто я уверен что это можно сделать все намного проще.
« Last Edit: January 11, 2018, 12:45:39 AM by Eney »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Слева в редакторе есть раздел "шаблоны". Самые важные паттерны уже прописаны там. Всякие ожидания и пр.


Eney

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Подскажите где тут ошибка, при выполнении цикла нажимает 2 раза "поражение" либо "победа" в зависимости от условия но должно же кликнуть только 1 раз.


Code: [Select]
SUB(atk)
   $check = 0
   WHILE($check = 0)
      GETSCREEN
      IF_PIXEL_IN(179,571, 200,592, 12415305) //окно атака "напасть"
         $check = 1
         LOGWRITE ("окно атака")
         WAIT(1)
         LCLICK($_return1, $_return2)
         WAIT(1)
         LCLICK(316,810)  // выбор армии
         WAIT(1)
         LCLICK(250,846)  // начать бой
         WAIT(1)
         LCLICK(263,783)  // ускорение
      ELSE
         WAITMS(50)
      END_IF
   END_CYC
   
   $check1 = 0
   WHILE($check1 = 0)
      GETSCREEN
      IF_PIXEL_IN(251,645, 267,660, 12809804)  //победа "продолжить"
         $check1 = 1
         LCLICK($_return1, $_return2)
         LOGWRITE ("победа")
      ELSE
         IF_PIXEL_IN(220,612, 238,623, 10181433)
            $check1 = 1
            LCLICK($_return1, $_return2)
            LOGWRITE ("поражение")
         END_IF
      END_CYC
   END_SUB
« Last Edit: January 13, 2018, 01:18:33 AM by Eney »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Во втором цикле не хватает окончания END_IF

Eney

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Спасибо, не заметил.

Возникла такая проблема. При выполнении программы bast() почему то не всегда срабатывает клик мышкой, тоесть в скрипте по логам все нормально а в игре нет и поэтому на этом моменте скрипт останавливается.
Логика скрипта такая что он проверяет захвачены ли башни (определяет по черным полоскам под ними) если да то делается клик по нему мышкой после чего открывается окно для атаки и запускается программа atk(), по ее завершении скрипт продолжает дальше проверять.
Как тут можно реализовать чтобы делал попытки сделать клик мышкой по башне если с 1 раза не получилось?
Для наглядности вот скриншот башни


Code: [Select]
SUB(atk)
   $check = 0
   WHILE($check = 0)
      GETSCREEN
      IF_PIXEL_IN(179,571, 200,592, 12415305) //окно атака "напасть"
         $check = 1
         LOGWRITE ("окно атака")
         WAIT(1)
         LCLICK($_return1, $_return2)
         WAIT(1)
         LCLICK(316,810)  // выбор армии
         WAIT(1)
         LCLICK(250,846)  // начать бой
         WAIT(1)
         LCLICK(263,783)  // ускорение
      ELSE
         WAITMS(50)
      END_IF
   END_CYC
   
   $check1 = 0
   WHILE($check1 = 0)
      GETSCREEN
      IF_PIXEL_IN(251,645, 267,660, 12809804)  //победа "продолжить"
         $check1 = 1
         WAIT(1)
         LCLICK($_return1, $_return2)
         LOGWRITE ("победа")
      ELSE
         IF_PIXEL_IN(220,612, 238,623, 10181433)
            $check1 = 1
            WAIT(1)
            LCLICK($_return1, $_return2)
            LOGWRITE ("поражение")
         END_IF
      END_IF
   END_CYC
   WAIT(1)
END_SUB





SUB(svoboda)
   GETSCREEN
   IF_PIXEL_IN(237,363, 253,377, 5262149) //если баст захвачен на карте
      LOGWRITE ("баст под щитом")
      WAIT(1)
      LCLICK(346,956)  // альянс
      WAIT(1)
      LCLICK(446,624)  // бастион
      WAIT(1)
   ELSE
      LOGWRITE ("баст без щита")
      WAIT(1)
      LCLICK(257,500)  // клик на баст
      WAIT(1)
      LCLICK(246,571)  // обьявить войну
      WAIT(1)
      LCLICK(264,64)  // пустое
   END_IF
   
   GETSCREEN
   IF_PIXEL_IN(306,339, 321,362, 11495748) //если баст захвачен
      LCLICK($_return1, $_return2)  //клик на освободить
      WAIT(1)
   END_IF
   
   GETSCREEN
   IF_PIXEL_IN(102,547, 117,566, 10116150) //Да
      LCLICK($_return1, $_return2)  //клик на освободить
      WAIT(1)
      LCLICK(49,945)  // на карту
      WAIT(1)
      LCLICK(257,500)  // клик на баст
      WAIT(1)
      LCLICK(246,571)  // обьявить войну
      WAIT(1)
      DBLCLICK(264,64)  // пустое
   END_IF
END_SUB

SUB(bast)
   svoboda()
   WAIT(1)
   GETSCREEN
   IF_PIXEL_IN(191,467, 198,475, 1053206)  // башня 1
      WAIT(1)
      LCLICK(206,453)
      LOGWRITE ("башня 1")
      WAIT(1)
      atk()
      LOGWRITE ("атака завершена")
   END_IF
   GETSCREEN
   IF_PIXEL_IN(161,506, 167,510, 328984) //башня 2
      WAIT(1)
      LCLICK(177,495)
      LOGWRITE ("башня 2")
      WAIT(1)
      atk()
      LOGWRITE ("атака завершена")
   END_IF
   GETSCREEN
   IF_PIXEL_IN(126,528, 136,535, 1250585) //башня 3
      WAIT(1)
      LCLICK(146,520)
      LOGWRITE ("башня 3")
      atk()
      LOGWRITE ("атака завершена")
   END_IF
   GETSCREEN
   IF_PIXEL_IN(155,559, 165,567, 1710876) //башня 4
      WAIT(1)
      LCLICK(176,549)
      LOGWRITE ("башня 4")
      atk()
      LOGWRITE ("атака завершена")
   END_IF
   GETSCREEN
   IF_PIXEL_IN(182,594, 196,604, 1119256) //башня 5
      WAIT(1)
      LCLICK(205,585)
      LOGWRITE ("башня 5")
      atk()
      LOGWRITE ("атака завершена")
   END_IF
   GETSCREEN
   IF_PIXEL_IN(249,595, 258,600, 1119514) //башня 6
      WAIT(1)
      LCLICK(268,586)
      LOGWRITE ("башня 6")
      atk()
      LOGWRITE ("атака завершена")
   END_IF
   GETSCREEN
   IF_PIXEL_IN(344,594, 355,602, 1447962) //башня 7
      WAIT(1)
      LCLICK(334,584)
      LOGWRITE ("башня 7")
      atk()
      LOGWRITE ("атака завершена")
   END_IF
   GETSCREEN
   IF_PIXEL_IN(374,561, 386,569, 1316376) //башня 8
      WAIT(1)
      LCLICK(363,552)
      LOGWRITE ("башня 8")
      atk()
      LOGWRITE ("атака завершена")
   END_IF
   GETSCREEN
   IF_PIXEL_IN(374,527, 384,536, 987671) //башня 9
      WAIT(1)
      LCLICK(391,519)
      LOGWRITE ("башня 9")
      atk()
      LOGWRITE ("атака завершена")
   END_IF
   GETSCREEN
   IF_PIXEL_IN(341,503, 353,515, 856084) //башня 10
      WAIT(1)
      LCLICK(360,498)
      LOGWRITE ("башня 10")
      atk()
      LOGWRITE ("атака завершена")
   END_IF
   GETSCREEN
   IF_PIXEL_IN(309,466, 320,475, 1775636) //башня 11
      WAIT(1)
      LCLICK(331,457)
      LOGWRITE ("башня 11")
      atk()
      LOGWRITE ("атака завершена")
   END_IF
END_SUB

WHILE($var < 5)
   bast()
   WAIT(1)
END_CYC
« Last Edit: January 20, 2018, 11:19:21 PM by Eney »

Spw

  • Зашел в гости
  • *
  • Posts: 12
  • Addicted
    • View Profile
После 17 строки добавить повторную проверку bast() ?

Eney

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
После 17 строки добавить повторную проверку bast() ?
Не выйдет так ошибку pop() выдает

Eney

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Огромное спасибо. Я еще изучаю скипты)
Только я не понимаю как тут реализован цикл. Действия все проходят отлично до атаки 1 башни потом останавливается весь скипт.
Еще не понятно для чего нужен $par6
« Last Edit: January 13, 2018, 11:31:05 PM by Eney »

Eney

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
тогда у меня что то с кликером так как скрипты не повторяются. В настройках стоит выполнять неограниченное количество раз. Если записывать действия мыши то повторяется а так скрипт доходит до 1 башни и все

Eney

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Большое спасибо скрипт теперь проверяет все башни. Но проблема с неудачным кликом по башне осталась. Когда он делает клик по башне и он не срабатывает то он начинает ждать появления окна атаки и ничего дальше не предпринимает пока ее не увидит.

Eney

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Сразу говорю что очень благодарен Вам за помощь и за уделенное мне время.
Так как стояло жесткое условие ничего не делать пока не увидит окно Атаки я поставил таймер и туда.
Работает как и положено но очень часто не срабатывают клики и он заново пробует спустя 15+ сек (так как максимальное время по моим подсчетам до 15 сек) Но тут есть дна проблемка. С момента первой атаки на башню (тоесть с момента обьявления войны на бастион) появляется отсчет времени, дается 5 минут на атаку всех 11 башен и нужно успеть вложиться в это время. Но из за этих не понятных не страбативаний кликов это часто не получается((

Вот так поставил таймер
Code: (clickermann) [Select]
SUB(bashnya, $par1,$par2,$par3,$par4,$par5,$par6,$par7,$par8)
   GETSCREEN
   IF_PIXEL_IN($par1,$par2,$par3,$par4,$par5)  // башня
      Yes( $par6,$par7,$par8)
     
      $time = $_time_t + 2
      $check = 0   // (atk)
      WHILE(($check = 0)&($time > $_time_t))
         GETSCREEN
         IF_PIXEL_IN(179,571, 200,592, 12415305) //окно атака "напасть"
            Yes("окно атака",$_return1, $_return2)
            WAIT(1)
            LCLICK(283,517)  // 8210987
            WAIT(1)
            LCLICK(200,581)  // 9656633
            WAIT(1)
            LCLICK(316,810)  // выбор армии
            WAIT(1)
            LCLICK(250,846)  // начать бой
            WAITMS(300)
            LCLICK(263,783)  // ускорение
         ELSE
            WAITMS(50)
         END_IF
      END_CYC
     
      $time = $_time_t + 15 // таймер на 10 секунд
      $check = 0
      WHILE(($check = 0)&($time > $_time_t))
         GETSCREEN
         IF_PIXEL_IN(251,645, 267,660, 12809804)  //победа "продолжить"
            Yes("победа",$_return1, $_return2)
         ELSE
            IF_PIXEL_IN(220,612, 238,623, 10181433)
               Yes("поражение",$_return1, $_return2)
            END_IF
         END_IF
      END_CYC
      WAITMS(100)
      LOGWRITE ("атака завершена")
   END_IF
END_SUB

Eney

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Игра мобильная, запускаю с эмулятора NOX

Eney

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Нее)) Это я к тому что возможно эта информация как-то поможет в этом деле))