Author Topic: Зомби ферма: скрипт для поиска "зеленых" зомбиков  (Read 10032 times)

0 Members and 2 Guests are viewing this topic.

Крис Тинка

  • Активный участник
  • ***
  • Posts: 171
    • View Profile
Сделала примитивный скрипт для поиска "зеленых" зомбиков. Скрипт перелистывает ленту зомбиков, когда находит зомбика у которого можно копать, посещает его.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
А зачем вот этот кусок повторяется 7 раз?

Code: (clickermann) [Select]
/////////
   getscreen
   IF_PICTURE_IN (10,10, $_xmax, $_ymax, "textures\kp3.bmp")
      MOVE($_return1-106, $_return2+114)
      WAITMS(300)
      lclick($_return1-106, $_return2+114)
      wait(1)
      getscreen
      IF_PICTURE_IN (10,10, $_xmax, $_ymax, "textures\kp4.bmp")
         MOVE($_return1-106, $_return2+114)
         WAITMS(300)
         lclick($_return1-106, $_return2+114)
         wait(1)
      else
         waitms(500)
      end_if
      halt
   else
      waitms(500)
   end_if

/////////

Крис Тинка

  • Активный участник
  • ***
  • Posts: 171
    • View Profile
А зачем вот этот кусок повторяется 7 раз?


Потому что я не знаю как по другому дождаться таблички "На моей территории зарыты сокровища" ))))

aden

  • Оплот сообщества
  • ****
  • Posts: 363
    • View Profile
goto(label) моя любимая функция ))
Code: [Select]
nachalo: // ярлык для вовзрата в начало
getscreen
   IF_PICTURE_IN (10,10, $_xmax, $_ymax, "textures\kp3.bmp")
      MOVE($_return1-106, $_return2+114)
      WAITMS(300)
      lclick($_return1-106, $_return2+114)
      wait(1)
goto(prodolzhenie) //картинка обнаружена идем к следующему действию
else
wait(1) // ждем секунду
goto(nachalo) // и проверяем снова
end_if

//следующее действие проверяется если выполненно предыдущее
prodolzhenie:
  IF_PICTURE_IN (10,10, $_xmax, $_ymax, "textures\kp4.bmp")
         MOVE($_return1-106, $_return2+114)
         WAITMS(300)
         lclick($_return1-106, $_return2+114)
         wait(1)
      else
         waitms(500) // можно вставить возврат goto(nachalo) или goto(prodolzhenie)
end_if
/////////////////////

Крис Тинка

  • Активный участник
  • ***
  • Posts: 171
    • View Profile
goto(label) моя любимая функция ))

Спасибо!  Функция конечно знакомая, только я не додумалась так ее применить))) Я вообще не программист, пишу "по бумажке". Тогда новая версия скрипта будет такая:

Code: [Select]
getscreen
IF_PICTURE_IN (10,10, $_xmax, $_ymax, "textures\kp2.bmp")
   $x1=$_return1+7
   $y1=$_return2-50
else
   halt
end_if
ss:
getscreen
IF_PIXEL_IN ($x1,$y1, $x1+503,$y1+133,1755195 )
   MOVE($x1-5,$y1+88)
   WAITMS(300)
   LCLICK($x1-5,$y1+88)
   MOVE($_return1, $_return2)
   WAITMS(1000)
   lclick($_return1, $_return2)
   WAITMS(500)
   MOVE($_return1+50, $_return2-50)
   WAITMS(1000)
   lclick($_return1+50, $_return2-50)
   wait(1)
   nachalo:
   getscreen
   IF_PICTURE_IN (10,10, $_xmax, $_ymax, "textures\kp3.bmp")
      MOVE($_return1-106, $_return2+114)
      WAITMS(300)
      lclick($_return1-106, $_return2+114)
      wait(1)
      goto(prodolzhenie)
   else
      wait(1)
      goto(nachalo)
   end_if
   prodolzhenie:
   getsreen
   IF_PICTURE_IN (10,10, $_xmax, $_ymax, "textures\kp4.bmp")
      MOVE($_return1-106, $_return2+114)
      WAITMS(300)
      lclick($_return1-106, $_return2+114)
      halt
   else
      halt
   end_if
else
   MOVE($x1+491,$y1+88)
   WAITMS(50)
   LCLICK($x1+491,$y1+88)
end_if
GOTO(ss)

P.S. А разве можно использовать goto ведущее за пределы цикла IF? Но в данном случае ошибок не возникло.
« Last Edit: December 05, 2013, 10:14:49 AM by Крис Тинка »

aden

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

зы. я даже заморачиваюсь зарисовкой алгоритма на бумажке, а потом отдельные участки отлаживаю и вписываю.

старенький скрипт в черновом варианте, но наглядно отображает мой стиль
Code: [Select]
//========================================START
#adaptive_scirpt
#logfile
//set work window
hset(hget(500,500),1)
logwrite(hget(500,500),-window id)
//variables for checks status
//define($mob,0)
//define($battle,0)
//define($hp,0)
//define($deadmob,0)
//define($button,0)
//kors for searching mobs
define($xkor,560)
define($ykor,310)
define($ykor_second,320)
define($xkor_min,560)   //==xkor
define($xkor_max,650)
//vars for check battle
//define($battle_x,179)
//define($battle_y,395)
//define($battle_color,9229311)
//vars for button
///define($button_x,752)
//define($button_y,462)
//define($button_color,2176074)
//define($atk_x,681)
//define($atk_y,460)
//vars for deadmob
//define($deadmob_x,1051)
//define($deadmob_y,76)
//define($deadmob_color,5946095)
//vars for HP
//define($hp_x,279)
//define($hp_y,88)
//define($hp_color,255)
//vars for search exit_battle
//define($pic_x1,680)
//define($pic_x2,796)
//define($pic_y1,322)
//define($pic_y2,592)
//counter dead mobs
define($counter,0)
//
//============================INFO_ABOUT_LABELS
//
// battle      -check starting battle
// button      -check attack button
// deadmob     -check dead mob
// mobsearch   -start/resume mob searching
// mobsearch1  -resume searching mobs after
// restore xkor
// start_fight -start battle after
// all checking
// exit_battle -search exit button
//
//===================================ALL_CHECKS
//
//check hp
hp:
getscreen
IF(pxl(286,92)=255)
   logwrite("loop#",$counter," ","full_hp")
   goto(loop)
else
   wait(1)
   goto(battle)
end_if
//looping
loop:
if($new_loop=1)
   goto(mobsearch)
else
   goto(mobsearch_loop)
end_if

//check battle
battle:
getscreen
if(pxl(66,294)=1067288)
   goto(check_heal)
end_if
//screenshot("check_battle")    for debug
goto(hp)

//check_heal
check_heal:
WAIT(2)
if($eliks=2 | $eliks>2)
   goto(button)
end_if
if(pxl(122,303)>600000)
   logwrite("loop#",$counter," ","need heal")
   LCLICK(300, 510)
   inc($eliks)
   goto(button)
end_if

//elik
//heal:
//getscreen
//if_picture_in (211, 378, 425, 736, "elik.bmp", -1, 70)
//   lcklick(291, 490)
//   logwrite("heeeeal")
//   goto(button)
//else
//   logwrite("elik not found")
//   colormode(7,211,378,425,736)
//   screenshot
//end_if

//check attack_button
button:
WAIT(1)
getscreen
colormode(7,458,442,822,479)
if_picture_in (458,442,822,479,"fight_button.bmp")
   lclick($_return1-160, $_return2+5)
   goto(start_fight)
end_if
//screenshot("check_attack")    for debug
goto(deadmob)

//check mob die or not
deadmob:
wait(1)
getscreen
if(pxl($deadmob_x,$deadmob_y)=$deadmob_color)
   goto(exit_battle)
else
   goto(battle)
end_if
//======================================ACTIONS
//start search mobs
mobsearch:
logwrite("loop#",$counter," ","searching mobs...")
Inc($counter,1)
logwrite(""loop#"",$counter)
//for looping return
mobsearch_loop:
$new_loop=0
waitms(100)
$xkor=450
for ($xkor, $xkor<670)
   inc($xkor,5)
   waitms(50)
   dblclick($xkor, 350)
   dblclick($xkor, 360)
end_cyc
goto(battle)

//starting battle
start_fight:
waitms(500)
logwrite("loop#",$counter," ","attack")
goto(battle)

//search exit_button
exit_battle:
getscreen
colormode(7,400,300,800,900)
if_picture_in (500,200,800,900,"exit_button.bmp")
   lclick($_return1+5, $_return2+5)
   logwrite("loop#",$counter," ","exit battle")
   wait(2)
   $eliks=0
   $new_loop=1
end_if
goto(battle)
halt
« Last Edit: December 05, 2013, 10:06:57 AM by aden »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
goto(prodolzhenie) и prodolzhenie: тут лишнее.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
старенький скрипт в черновом варианте, но наглядно отображает мой стиль

Даа в таком стиле только автор и разберется, GOTO в таком количестве явное зло  :D

Крис Тинка

  • Активный участник
  • ***
  • Posts: 171
    • View Profile
goto(prodolzhenie) и prodolzhenie: тут лишнее.
Почему лишние? Ведь в prodolzhenie идет поиск другой текстуры.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
P.S. А разве можно использовать goto ведущее за пределы цикла IF? Но в данном случае ошибок не возникло.

Можно конечно. Как указано в справке, нельзя выпрыгивать по GOTO из циклов и субпрограмм. Хотя возможно ошибки и не возникнет но Джонни то виднее наверно...

aden

  • Оплот сообщества
  • ****
  • Posts: 363
    • View Profile
может быть для меня гораздо хуже огромную вложеность читать, мой код можно разбавить вставками include и тогда он станет очень легко читаем, и не таким громоздким.

по поводу лишних goto(prodolzhenie)  prodolzhenie: это что бы скрипт не поломать если вдруг чегото допишешь, так сказать подстраховка.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
goto(prodolzhenie) и prodolzhenie: тут лишнее.
Почему лишние? Ведь в prodolzhenie идет поиск другой текстуры.

Выполнение и так туда пойдет. Прежде всего нужно видеть логику а с гото это становится сложнее.


Oraven

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

по поводу лишних goto(prodolzhenie)  prodolzhenie: это что бы скрипт не поломать если вдруг чегото допишешь, так сказать подстраховка.

Ты не представляешь как твои GOTO а тем более include запутывают скрипт. Мало того что выполнение скачет во всех немыслимых направлениях, так еще и скрипт раздроблен на куски.

Крис Тинка

  • Активный участник
  • ***
  • Posts: 171
    • View Profile



Выполнение и так туда пойдет. Прежде всего нужно видеть логику а с гото это становится сложнее.
ДА, все верно. Лишнее)))

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Цикл конечно правильнее организовывать через WHILE.

Code: (clickermann) [Select]
$check = 0
WHILE($check = 0)
   getscreen
   IF_PICTURE_IN (10,10, $_xmax, $_ymax, "textures\kp3.bmp")
      $check = 1
      MOVE($_return1-106, $_return2+114)
      WAITMS(300)
      lclick($_return1-106, $_return2+114)
      wait(1)
   else
      wait(1)
   end_if
END_CYC

Но что если искомый фрагмент мы так и не дождемся? Нужно прикрутить таймер который завершит цикл.

Code: (clickermann) [Select]
ss:

///
///

$check = 0
$time = $_time_t + 30 // таймер на 30 сек
WHILE(($check = 0) & ($time > $_time_t))
   getscreen
   IF_PICTURE_IN (10,10, $_xmax, $_ymax, "textures\kp3.bmp")
      $check = 1
      MOVE($_return1-106, $_return2+114)
      WAITMS(300)
      lclick($_return1-106, $_return2+114)
      wait(1)
   else
      wait(1)
   end_if
END_CYC

IF($check = 0) // возврат в начало при неудачном поиске
   GOTO(ss)
END_IF

///
///