Author Topic: Лабуда 3.0 Ориентация по мини карте 2d (массивы?)  (Read 3175 times)

0 Members and 1 Guest are viewing this topic.

BiG

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Привет мастера, может кто подскажет, и прокоментирует по возможности строки, чтоб я всякой лабудой в дальнейшем не напрягал=)
Есть область (1420,730,1591,901) (мини карта) , разделенная на секторы $a,$b..., в которых появляются пиксели, допустим черный и красный (0 и 255). Нужно чтобы при обнаружении "255" либо "0" пикселя в секторе $a производилось одно действие, в секторе $b другое, и т.д. Я так понимаю, нужно в массив запихать координаты секторов x,y,x1,y1.  в которых будет производится поиск пикселей. Что-то находил на форуме похожее, но пока темный лес для меня. Можете привести попроще пример, например: квадрат разделенный на 2 сектора. Заранее спасибо.
https://cloud.mail.ru/public/AEaa/5JR1EJtz4

Vint

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

Если нужно проверять сектора по очереди обязательно... то тоже нет проблем.

Есть ещё вариант, что прямоугольный сектор и вовсе не нужен, а важно расстояние до центра. В этом случае ещё проще, поиск и одна функция DIST()


BiG

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Я новичев в Кликере, и вправду все гораздо проще. Нужно чтоб поиск шел по всей области, и в зависимости в каком секторе пиксель, производить действие. Эта мини карта своего рода джойстик, вверх;вниз;влево;вправо; и центр рандом. Буду разбираться.

BiG

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Ужас что выходит, меньше половины задуманного на 150+ строк
Code: (clickermann) [Select]
WHILE($wn < 1)
   WNDSIZE ( wndfind("incognito"), 1616, 938)  // Размер окна 1600x900
   wait(3)
   WNDPOS ( wndfind("incognito"), 0, 0) // Центрировать окно по левому краю
   waitms(1000)
   $wn=1
END_CYC
waitms(50)
//=============================================
THREAD(enemyB,0)                // Враг близко (сектор b1)
   SETTHREAD (a, 2)
   SETTHREAD (b, 2)
   SETTHREAD (c, 2)
   KEYUP(#A)
   waitms(rnd(10,50))
   KEYUP(#D)
   waitms(rnd(10,50))
   KEYUP(#S)
   waitms(rnd(10,50))
   KEYDOWN(#W)
   waitms(rnd(50,100))
   KEYDOWN(#A)
   wait(rnd(2,4))
   KEYUP(#A)
   waitms(rnd(50,100))
   KEYUP(#W)
   waitms(rnd(50,100))
   KEYDOWN(#S)
   waitms(rnd(10,50))
   RNDFROM(KEYDOWN(#A),KEYDOWN(#D))
   wait(rnd(3,5))
   KEYUP(#A)
   waitms(rnd(10,50))
   KEYUP(#D)
   waitms(rnd(10,50))
   KEYUP(#S)
   SETTHREAD (enemyB, 2)
END_THREAD
//=============================================
THREAD(enemy,0)                        // Вызов ботов
   RDOWN(-1,-1)
   waitms(rnd(100,250))
   RUP(-1,-1)
   waitms(rnd(100,300))
   LDOWN(-1,-1)
   waitms(rnd(100,250))
   LUP(-1,-1)
   waitms(50)
   SETTHREAD (enemy, 2)
END_THREAD
//=============================================
THREAD(a,0)                           // Прямо - налево
   SETTHREAD (с, 2)
   SETTHREAD (b, 2)
   KEYUP(#A)
   waitms(rnd(10,50))
   KEYUP(#D)
   waitms(rnd(10,50))
   KEYUP(#S)
   waitms(50)
   KEYDOWN(#W)
   waitms(rnd(50,150))
   KEYDOWN(#A)
   waitms(rnd(250,450))
   KEYUP(#A)
   waitms(rnd(150,350))
   KEYUP(#W)
   print("Прямо - налево")
   waitms(rnd(500,1000))
   SETTHREAD (a, 2)
END_THREAD
//=============================================
THREAD(b,0)                                   // Прямо
   SETTHREAD (a, 2)                           
   SETTHREAD (c, 2)
   KEYUP(#D)
   waitms(rnd(10,50))
   KEYUP(#A)
   waitms(rnd(10,50))
   KEYUP(#S)
   waitms(rnd(50,100))
   KEYDOWN(#W)
   wait(rnd(2,4))
   KEYUP(#W)
   print("Вперед")
   waitms(100)
   SETTHREAD (b, 2)
END_THREAD
//=============================================
THREAD(с,0)                           // Прямо - направо
   SETTHREAD (a, 2)
   SETTHREAD (b, 2)
KEYUP(#S)
   waitms(rnd(10,50))
   KEYUP(#A)
   waitms(rnd(10,50))
   KEYUP(#D)
   waitms(rnd(50,100))
   KEYDOWN(#W)
   waitms(rnd(50,150))
   KEYDOWN(#D)
   waitms(rnd(250,450))
   KEYUP(#D)
   waitms(rnd(150,350))
   KEYUP(#W)
   print("Прямо - направо")
   waitms(rnd(500,1000))
   SETTHREAD (с, 2)
END_THREAD
//=============================================
GETSCREEN (1420,730,1590,900) // Мини карта
IF($timeA < $_time_t)
   IF_PIXEL_IN(1420,730,1485,795, 16755543)     // Свои a
      SETTHREAD (a, 1)
      print("a:",$_return1,":", $_return2)
      WAITMS(50)
      $timeA = $_time_t +(rnd(1,3))
   END_IF
END_IF
IF($timeB < $_time_t)
   IF_PIXEL_IN(1486,730,1534,795, 16755543)    //  Свои b
      SETTHREAD (b, 1)
      print("b:",$_return1,":", $_return2)
      WAITMS(50)
      $timeB = $_time_t +(rnd(1,2))
   END_IF
END_IF
IF($timeC < $_time_t)
   IF_PIXEL_IN(1535,730,1590,795, 16755543)    //  Свои с
      SETTHREAD (с, 1)
      print("c:",$_return1,":", $_return2)
      WAITMS(50)
      $timeC = $_time_t +(rnd(1,3))
   END_IF
END_IF
waitms(50)
GETSCREEN (1420,730,1590,900) // Мини карта
IF($timeALL < $_time_t)
   IF_PIXEL_IN(1420,730,1590,900, 255)    // Враги  вся карта
      SETTHREAD (enemy, 1)
      print("Вижу врага:",$_return1,":", $_return2)
      WAITMS(50)
      $timeALL = $_time_t +(rnd(10,20))
   END_IF
END_IF
IF($timeB1 < $_time_t)
   IF_PIXEL_IN(1486,796,1534,834, 255)   // Враги  сектор b1
      SETTHREAD (enemyB, 1)
      print("Враг близко:",$_return1,":", $_return2)
      WAITMS(50)
      $timeB1 = $_time_t +(rnd(1,2))
   END_IF
END_IF
« Last Edit: August 22, 2018, 04:17:04 PM by BiG »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Координаты по умолчанию, лучше не писать как (-1,-1), используй системные переменные с координатами мыши ($_xmouse, $_ymouse)

Область a и с, на последнем скрине, разной ширины. Где-то просчитался.

Чёт всё перемудрёно слишком.
Потоки a, b, с  - явные подпрограммы, а не потоки. Здесь нет параллельности выполнения. Они все завершаются в конце. И не нужно будет останавливать два других +отжимать ADS.

enemyB и enemy то же самое.

Если критически стоит вопрос прервать "a, b, с" при возникновении enemyB или enemy, можно оставить, но в другом виде. Хотя я не вижу причины в такой резкой остановке, не такие там в "a, b, с" длительности, чтобы заморачиваться.


При использовании малых значений (времени), нужно использовать переменные с более точным значением.
Code: (clickermann) [Select]
$timeB = $_time_t +(rnd(1,2))Условие которым управляет этот таймер, выполнится не через 1-2 секунды. На самом деле через 1-2999 ms, что практически 0-3 сек.

Code: (clickermann) [Select]
$timeB = $_ms+(rnd(1000, 2000))и $_ms вместо $_time_t в других местах.


Что-то мне подсказывает что вот так нельзя:
Code: (clickermann) [Select]
RNDFROM(KEYDOWN(#A),KEYDOWN(#D))RNDFROM выбирает (и возвращает) одно из значений. В кликере это только числа/строки/результаты функций, но не сами функции.



BiG

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Спасибо за подсказки, пересмотрел и переделал скрипт. Пока полностью не проверял этот кусок, проверял только циклы без потока, но вроде ошибок нет. Если не лень вникать, может что подскажите как укоротить или что заменить. и за одно несколько вопросов.
1. Почему не желательно использовать координаты клика (-1,-1)? В данной игре мышью можно вообще не шевелить.
2. 1 пиксель моментально же ищится на экране, может можно 1 GETSCREEN в потоке на мах разрешение выставить, а в циклах вообще убрать GETSCREEN?
3. Как сделать рандомные зажатия на кнопки (#A) и (#D)?
4. Про функцию DIST поподробней, простейший пример хотя бы.
5. Можно ли где то убрать задержки (wait), потому что еще дофига чего запихать сюда надо?
Code: (clickermann) [Select]
WHILE($wn < 1)
   WNDSIZE ( wndfind("?"), 1616, 938)  // Размер окна 1600x900
   wait(2)
   WNDPOS ( wndfind("?"), 0, 0) // Центрировать окно по левому краю
   waitms(1000)
   $wn=1
END_CYC
waitms(50)
//=============================================
SUB(key)                  // Проверить нажатые кнопки и отжать
   if ( iskeydown(#W)=1 )
      KEYUP(#W)
      waitms(50)
   end_if
   if ( iskeydown(#A)=1 )
      KEYUP(#A)
      waitms(50)
   end_if
   if ( iskeydown(#S)=1 )
      KEYUP(#S)
      waitms(50)
   end_if
   if ( iskeydown(#D)=1 )
      KEYUP(#D)
      waitms(50)
   end_if
   waitms(rnd(50,70))
END_SUB
//=============================================
SUB(LEFT)                           // Прямо - налево
   key()
   KEYDOWN(#W)
   waitms(rnd(50,150))
   KEYDOWN(#A)
   waitms(rnd(150,350))
   KEYUP(#A)
   waitms(rnd(400,950))
   KEYUP(#W)
   waitms(50)
END_SUB
//=============================================
SUB(UP)                                   // Прямо
   key()
   KEYDOWN(#W)
   waitms(1500)
   KEYUP(#W)
   waitms(50)
END_SUB
//=============================================
SUB(RIGHT)                                 // Прямо - направо
   key()
   KEYDOWN(#W)
   waitms(rnd(50,150))
   KEYDOWN(#D)
   waitms(rnd(250,450))
   KEYUP(#D)
   waitms(rnd(450,850))
   KEYUP(#W)
   waitms(50)
END_SUB
//=============================================
SUB(DOWN)                      // Назад
   key()
   KEYDOWN(#S)
   waitms(rnd(300,1000))
   KEYDOWN(#D)
   waitms(rnd(300,900))
   KEYUP(#D)
   waitms(rnd(50,70))
   KEYUP(#S)
   waitms(rnd(50,70))
   KEYDOWN(#A)
   waitms(rnd(50,70))
   KEYDOWN(#W)
   waitms(rnd(800,1200))
   KEYUP(#A)
   waitms(rnd(800,2000))
   KEYUP(#W)
END_SUB
//=============================================
THREAD(enemy,1)
   $enemyB = 0
   $up=1
   IF($timeB1 < $_time_t)                      // Вызов ботов
      IF_PIXEL_IN(1448,736,1560,830, 255)     // враги вся карта
         RDOWN(-1,-1)
         waitms(rnd(100,250))
         RUP(-1,-1)
         waitms(rnd(100,300))
         LDOWN(-1,-1)
         waitms(rnd(100,250))
         LUP(-1,-1)
         waitms(50)
         $enemyB = 1
         $timeB1 = $_time_t +(rnd(10,20))
      else
         waitms(1000)
      END_IF
   END_IF
   WHILE($enemyB = 1)
      GETSCREEN (1420,730,1590,900)
      IF_PIXEL_IN(1486,796,1534,834, 255)   // Враг близко
         $up=0
         $lft=0
         $rht=0
         $dwn=0
         $ch=0
         waitms(200)
         key()
         KEYDOWN(#W)
         waitms(rnd(50,100))
         KEYDOWN(#A)
         wait(rnd(3,7))
         KEYUP(#A)
         waitms(rnd(50,100))
         KEYUP(#W)
         waitms(rnd(50,100))
         KEYDOWN(#S)
         wait(rnd(2,5))
         KEYDOWN(#D)
         waitms(rnd(300,1050))
         KEYUP(#D)
         waitms(rnd(50,70))
         KEYUP(#S)
      else
         $enemyB=0
         waitms(50)
      END_IF
   END_CYC
END_THREAD
//=============================================
$lft=0
$rht=0
$dwn=0
$ch=0
//=============================================
WHILE($up = 1)                                     //  Свои
   GETSCREEN (1420,730,1590,900)                  // Мини карта
   IF_PIXEL_IN(1486,736,1522,798, 16755543)       //  Вперед
      $ch=0
      print("Прямо")
      UP()
      WAITMS(50)
   else
      $ch=1
      $up=0
      $lft=1
   END_IF
END_CYC
//=============================================
WHILE($lft = 1)                                    // Свои
   GETSCREEN (1420,730,1590,900)
   IF_PIXEL_IN(1444,759,1485,804, 16755543)      // Прямо и чуть левее
      $ch=0
      print("Прямо-налево")
      Left()
      WAITMS(50)
   else
      $ch=1
      $lft=0
      $rht=1
   END_IF
END_CYC
//=============================================
WHILE($rht = 1)                                     //  Свои
   GETSCREEN (1420,730,1590,900)
   IF_PIXEL_IN(1523,759,1564,804, 16755543)       // Прямо и чуть правее
      $ch=0
      print("Прямо-направо")
      RIGHT()
      WAITMS(50)
   else
      $ch=1
      $rht=0
      $up=1
      $lft=1
      $dwn=1
   END_IF
END_CYC
//=============================================
WHILE($dwn = 1)&($ch=1)                                        //
   GETSCREEN (1420,730,1590,900)
   print("Назад")
   DOWN()                                                     // Назад
   $dwn=0
   $ch=0
   WAITMS(50)
END_CYC
« Last Edit: August 23, 2018, 08:55:50 AM by BiG »

BiG

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Всем привет, постарался учесть все ваши рекомендации, и вроде все получилось что хотел. Но остался один момент: как определять что персонаж уткнулся в стену? вот что у меня получилось:
Code: (clickermann) [Select]
GETSCREEN(0,0,$win_x,$win_y)               // Застрял
$stuck1 = $stuck
$stuck =  PXLCRC($m_x2,$m_y4,$m_x5,$m_y4)
IF (($stuck = $stuck1)&($stuck2 < $_ms))
   print("ЗАСТРЯЛ")
   S(500)
   KEYDOWN(RNDFROM(81,69))
   waitms(rnd(2500,4500))
   key()
END_IF
waitms(20)

но код работает когда карта совершенно неподвижна пару секунд, что бывает редко.

Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
а где можно посмотреть на игру?
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

BiG

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Пол года трудился над скриптом,боюсь бан получить. На подобии WoT. Отправил название личкой
Code: (clickermann) [Select]
#logfile "??????? LOG.txt"

SUB(mouse_move,$MOVE_END_X,$MOVE_END_Y)
   $MOVE_SPEED = 1  // множитель скорости (отвечает за количество точек)
   $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)+RND(-2,2), ROUND($MOVE_Y,0)+RND(-2,2)) // добавляем рандом
      WAITMS($rnwait) // задержка при движении по точкам
   END_CYC
END_SUB
SUB(m_move,$Mm_X,$Mm_Y)
   $rnwait = RND(6,15) // случайная скорость
   $MOVE_MID_X = ($_xmouse+$Mm_X)/2
   $MOVE_MID_Y = ($_ymouse+$Mm_Y)/2
   mouse_move($MOVE_MID_X+RND(-30,30),$MOVE_MID_Y+RND(-30,30))
   mouse_move($Mm_X,$Mm_Y)
   MOVE($Mm_X,$Mm_Y) //Передвинуть окончательно в заданную точку
END_SUB
//===================================================================
LOGSHOW(1,1618,0)   // Лог и его позиция
waitms(50)
WNDSIZE ( wndfind("Лог"), 300, 1030) // Размер лога
waitms(50)
$win_x = 1616  // Ширина окна 1600
$win_y = 938   // Высота окна 900
FOR($wn, $wn < 1)
   WNDSIZE ( wndfind("???????"), $win_x, $win_y)
   waitms(250)
   WNDPOS ( wndfind("???????"), 0, 0) // Центрировать окно по левому краю
   waitms(150)
END_CYC
//==========================
$m_x = 1278       // Вся мини карта
$m_y = 600       // Вся мини карта
$m_max_x = 1574      // Вся мини карта
$m_max_y = 896       // Вся мини карта
$by_x = $m_c_x-10          // Враг близко
$by_y = $m_c_y-10          // Враг близко
$by_x1 = $m_c_x+10         // Враг близко
$by_y1 = $m_c_y+10         // Враг близко
$m_c_x = INT(($m_x+$m_max_x)/2)  // Центр мини карты
$m_c_y = INT(($m_y+$m_max_y)/2)  // Центр мини карты
$m_x2 = INT(($m_c_x+$m_x)/2)        // X
$m_x1 = INT(($m_x2+$m_x)/2)         // X
$m_x3 = INT(($m_c_x+$m_x2)/2)       // X
$m_y2 = INT(($m_c_y+$m_y)/2)            // Y
$m_y1 = INT(($m_y2+$m_y)/2)             // Y
$m_y3 = INT(($m_c_y+$m_y2)/2)           // Y
$m_x5 = INT(($m_c_x+$m_max_x)/2)    // X
$m_x4 = INT(($m_c_x+$m_x5)/2)       // X
$m_x6 = INT(($m_x5+$m_max_x)/2)     // X
$m_y5 = INT(($m_c_y+$m_max_y)/2)        // Y
$m_y4 = INT(($m_c_y+$m_y5)/2)           // Y
$m_y6 = INT(($m_y5+$m_max_y)/2)         // Y
FOR($print,$print < 1)
   print ("=========== ВСЯ КАРТА ===========")
   print ("$m_x:",$m_x," ","$m_c_x:",$m_c_x," ","$m_max_x:",$m_max_x)
   print ("$m_y:",$m_y," ","$m_c_y:",$m_c_y," ","$m_max_y:",$m_max_y)
   print ("=================================")
   print ("$m_x1:",$m_x1, " ","$m_x2:",$m_x2," ","$m_x3:",$m_x3)
   print ("$m_x4:",$m_x4, " ","$m_x5:",$m_x5," ","$m_x6:",$m_x6)
   print ("=================================")
   print ("$m_y1:",$m_y1, " ","$m_y2:",$m_y2," ","$m_y3:",$m_y3)
   print ("$m_y4:",$m_y4, " ","$m_y5:",$m_y5," ","$m_y6:",$m_y6)
END_CYC
//===============================
SUB(key)                // Проверить нажатые кнопки и отжать
   if ( iskeydown(#W)=1 )
      KEYUP(#W)
      waitms(10)
   end_if
   if ( iskeydown(#A)=1 )
      KEYUP(#A)
      waitms(10)
   end_if
   if ( iskeydown(#S)=1 )
      KEYUP(#S)
      waitms(10)
   end_if
   if ( iskeydown(#D)=1 )
      KEYUP(#D)
      waitms(10)
   end_if
   if ( iskeydown(#Q)=1 )
      KEYUP(#Q)
      waitms(10)
   end_if
   if ( iskeydown(#E)=1 )
      KEYUP(#E)
      waitms(10)
   end_if
END_SUB
//===============================
SUB(S,$t)
   SETTHREAD (W, 2)
   key()
   KEYDOWN(#S)
   waitms(rnd(500,1000)+$t)
   KEYUP(#S)
   waitms(rnd(50,100))
END_SUB
//===============================
SUB(A,$t)
   IF($ta < $_ms)
      waitms(rnd(50,150))
      KEYDOWN(#A)
      waitms(rnd(200,300)+$t)
      KEYUP(#A)
      $ta = $_ms+1800
   END_IF
END_SUB
//===============================
SUB(D,$t)
   IF($td < $_ms)
      waitms(rnd(50,150))
      KEYDOWN(#D)
      waitms(rnd(200,300)+$t)
      KEYUP(#D)
      $td = $_ms+1800
   END_IF
END_SUB
//===============================
THREAD(W, 0)
   print("W")
   KEYDOWN(#W)
   waitms(rnd(4000,8000))
   KEYUP(#W)
   waitms(rnd(1000,1500))
END_THREAD
//===============================
THREAD(Ckey, 1) // Если АФК
   DEFINE($tkey,$_ms+6000)
   if ((iskeydown(#W)=1)|(iskeydown(#S)=1)|(iskeydown(#Q)=1)|(iskeydown(#E)=1)|(iskeydown(#A)=1)|(iskeydown(#D)=1)|(iskeydown(1)=1))
      $tkey = $_ms+6000
   End_IF
   IF($tkey<$_ms)
      $base=1
   End_IF
   waitms(50)
END_THREAD
//===============================
IF($scan=0)
   $x=0
   $y=0
   GETSCREEN (0,0,$win_x,$win_y)
   SCANPXL($arr,$m_x,$m_y,$m_max_x,$m_c_y,16230484) // Свой 16230484, бот 13997650
   FOR($a=0,$a<ARRSIZE($arr),2)
      IF(DIST($arr[$a],$arr[$a+1],$m_c_x,$m_c_y)<DIST($x,$y,$m_c_x,$m_c_y))
         $x=$arr[$a]
         $y=$arr[$a+1]
      END_IF
   END_CYC
   IF(($x=0)&($y=0))
      SCANPXL($orr,$m_x,$m_c_y,$m_max_x,$m_max_y,16230484)
      FOR($b=0,$b<ARRSIZE($orr),2)
         IF(DIST($orr[$b],$orr[$b+1],$m_c_x,$m_c_y)<DIST($x,$y,$m_c_x,$m_c_y))
            $x=$orr[$b]
            $y=$orr[$b+1]
         END_IF
      END_CYC
   END_IF
   IF((ARRSIZE($arr)>1)|(ARRSIZE($orr)>1))
      $base=0
   else
      $base=1
   END_IF
   UNDEFINE($arr)
   UNDEFINE($orr)
END_IF
//================================
GETSCREEN(0,0,$win_x,$win_y)               // Застрял
$stuck1 = $stuck
$stuck =  PXLCRC($m_x2,$m_y4,$m_x5,$m_y4)
IF (($stuck = $stuck1)&($stuck2 < $_ms))
   print("ЗАСТРЯЛ")
   S(500)
   KEYDOWN(RNDFROM(81,69))
   waitms(rnd(2500,4500))
   key()
END_IF
waitms(20)
//================================
IF($base=1)     // Ищем базы
   GETSCREEN(0,0,$win_x,$win_y)
   COLORMODE(7, $m_x,$m_y,$m_max_x,$m_max_y)
   IF_PICTURE_IN ($m_x,$m_y, $m_max_x,$m_max_y, "В_ру.bmp", 255, 100)
      print("Вижу базу В")
      $x = $_return1+6
      $y = $_return2+6
   else
      WAITMS(20)
      print("Не вижу базу B")
      GETSCREEN(0,0,$win_x,$win_y)
      COLORMODE(7, $m_x,$m_y,$m_max_x,$m_max_y)
      IF_PICTURE_IN ($m_x,$m_y, $m_max_x,$m_max_y, "А_ру.bmp", 255, 100)
         print("Вижу базу А")
         $x = $_return1+6
         $y = $_return2+6
      else
         Waitms(20)
         print("Не вижу базу А")
         A(0)
      END_IF
   END_IF
   waitms(20)
END_IF
//=================================
$go=1
IF (($m_x3<$x)&($m_x4>$x)&($m_y<$y)&($by_y>$y)&($go=1))      // W (a3-d4-18)
   SETTHREAD (W, 1)
   waitms(1000)
   $go=0
else
   $go=1
END_IF
//=====================
IF (($m_x<$x)&($by_x>$x)&($m_y3<$y)&($m_c_y>$y)&($go=1))    // A (d-d3-18)
   print("A")
   A(100)
   $go=0
else
   $go=1
END_IF
//=====================
IF (($m_x<$x)&($m_x3>$x)&($m_y<$y)&($m_y3>$y)&($go=1))  // Aa
   print("Aa")
   A(0)
   $go=0
else
   $go=1
END_IF
//=====================
IF (($by_x1<$x)&($m_max_x>$x)&($m_y3<$y)&($m_c_y>$y)&($go=1)) // D (d4+18-d7)
   print("D")
   D(100)
   $go=0
else
   $go=1
END_IF
//==========================
IF (($m_x4<$x)&($m_max_x>$x)&($m_y<$y)&($m_y3>$y)&($go=1))
   print("Dd")
   D(0)
   $go=0
else
   $go=1
END_IF
//===========================
IF (($m_x<$x)&($m_max_x>$x)&($m_c_y<$y)&($m_max_y>$y)&($go=1)) // Назад
   print("Назад")
   SETTHREAD (W, 2)
   S(500)
   D(500)
   $go=0
else
   $go=1
END_IF
//==========================
GETSCREEN (0,0,$win_x,$win_y)
COLORMODE(5,$win_x-933,$win_y-31,$win_x-875,$win_y-10) // 683,907,741,928
WHILE(PXLCOUNT($win_x-933,$win_y-31,$win_x-875,$win_y-10, 2072575)>50) // Ищем надпись "Space"
   print("Вижу Space")
   SETTHREAD (W, 2)
   key()
   waitms(10000)
   $stuck2 = $_ms + 15000  // Задержка выполнения "ЗАСТРЯЛ"
   GETSCREEN (0,0,$win_x,$win_y)
   COLORMODE(5,$win_x-933,$win_y-31,$win_x-875,$win_y-10)
END_CYC
waitms(20)
GETSCREEN (0,0,$win_x,$win_y)
IF(PXLCOUNT($win_x-391,$win_y-133,$win_x-191,$win_y-58,17878)>30) // В_бой  1225,805,1425,880
   $stuck2 = $_ms + 15000  // Задержка выполнения "ЗАСТРЯЛ"
   $scan=1
   SETTHREAD (W, 2)
   key()
   waitms(rnd(300,5000))
   m_move ((rnd($win_x-373,$win_x-166)),(rnd($win_y-118,$win_y-74))) // 1243,1450:820,864
   waitms(rnd(100,300))
   LCLICK($_xmouse,$_ymouse)
   print("В_бой нажато")
   waitms(3000)
else
   waitms(20)
   GETSCREEN(0,0,$win_x,$win_y)
   COLORMODE(7,660,130,950,190)
   IF_PICTURE_IN (660,130,950,190, "В_БОЙ_7.bmp", 255, 100)
      m_move($_return1+(rnd(-50,60)), $_return2+(rnd(-10,20)))
      waitms(rnd(100,300))
      LCLICK($_xmouse,$_ymouse)
      print("В_БОЙ нажато")
   else
      $scan=0
   END_IF
END_IF
waitms(20)
//==============================
GETSCREEN (0,0,$win_x,$win_y)
COLORMODE(5, $m_x3,$m_y3,$m_x4,$m_y4)
IF_PIXEL_IN($m_x3,$m_y3,$m_x4,$m_y4, 2039807)    // Враги
   print("Вижу_врага")
   m_move(rnd($win_x/2-400,$win_x/2+400),(rnd($win_y/2-100,$win_y/2+100)))
   $en=0
   WHILE($en=0)
      waitms(50)
      IF_PIXEL_IN($by_x-8,$by_y-8,$by_x1+8,$by_y1+8, 2039807)
         print("Враг_близко")
         IF($time < $_time_t)
            LDOWN($_xmouse,$_ymouse)
            waitms(rnd(100,200))
            LUP($_xmouse,$_ymouse)
            $time = $time_t + (rnd(5,10))
         END_IF
         SETTHREAD (W, 1)
         A(0)
         waitms(rnd(600,1500))
         SETTHREAD (W, 2)
         key()
         GETSCREEN (0,0,$win_x,$win_y)
         COLORMODE(5,$by_x-8,$by_y-8,$by_x1+8,$by_y1+8)
      else
         print("Враг далеко")
         $en=1
      END_IF
   END_CYC
   WAITMS(20)
END_IF
//====================================
DEFINE($off,$_ms+rnd(1200000,1800000)) //вкл "СОН" через 20-30 минут
IF($off < $_ms)
   print("Спим")
   SETTHREAD (W, 2)
   key()
   m_move(rnd(0,$win_x),(rnd(0,$win_y)))
   wait(rnd(180,420))                       // ждать 3-7 минут
   m_move(rnd(0,$win_x),(rnd(0,$win_y)))
   waitms(rnd(3000,5000))
   FOR($off1,$off1 < 2)
      GETSCREEN(0,0,$win_x,$win_y)
      COLORMODE(6,0,int($win_y/2), $win_x,$win_y)
      IF_PICTURE_IN (0,int($win_y/2), $win_x,$win_y, "ОК_6_ру.bmp", 255, 100)
         m_move($_return1+(rnd(-50,60)), $_return2+(rnd(-10,20)))
         waitms(rnd(100,300))
         LCLICK($_xmouse,$_ymouse)
         waitms(rnd(1000,3000))
      else
         wait(2)
      END_IF
      GETSCREEN(0,0,$win_x,$win_y)
      COLORMODE(6,0,int($win_y/2), $win_x,$win_y)
      IF_PICTURE_IN (0,int($win_y/2), $win_x,$win_y, "Steam_6.bmp", 255, 100)
         m_move($_return1+(rnd(-50,60)), $_return2+(rnd(-10,20)))
         waitms(rnd(100,300))
         LCLICK($_xmouse,$_ymouse)
         waitms(rnd(10000,15000))
      else
         wait(2)
      END_IF
      GETSCREEN(0,0,$win_x,$win_y)
      COLORMODE(6,0,int($win_y/2), $win_x,$win_y)
      IF_PICTURE_IN (0,int($win_y/2), $win_x,$win_y, "Закрыть_6.bmp", 255, 100)
         m_move($_return1+(rnd(-50,60)), $_return2+(rnd(-10,20)))
         waitms(rnd(100,300))
         LCLICK($_xmouse,$_ymouse)
         waitms(rnd(1000,3000))
      else
         wait(2)
      END_IF
   END_CYC
   UNDEFINE($off)
   UNDEFINE($off1)
END_IF
//============================
DEFINE($OFF3, $_time_t + 7200) // 1800(30м) 3600(1ч) 7200(2ч)
If($OFF3 < $_time_t)
   print("Выключаю Комп")
   waitms(rnd(1000,3000))
   m_move((rnd($win_x-44,$win_x-16)),(rnd($win_y-937,$win_y-924)))
   waitms(rnd(100,300))
   LCLICK($_xmouse,$_ymouse)
   EXECUTE ("shutdown.exe", "/s /t 09")
   HALT(1)
END_IF
« Last Edit: February 25, 2019, 10:59:11 AM by BiG »

Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
вчера голова не варила, да и сейчас не особо, но решил все же попробовать помочь :D

Code: (clickermann) [Select]
// Хранение данных в массиве
$minimap_top    = 0
$minimap_left   = 0

$minimap_width  = 296
$minimap_height = 296

$size_x = INT( ($minimap_width  - $minimap_top)  / 8)
$size_y = INT( ($minimap_height - $minimap_left) / 8)

WHILE($cyc_count < 8+1)
   $array_area[$cyc_count*2]   = $minimap_top  + ($size_x*$cyc_count)
   $array_area[$cyc_count*2+1] = $minimap_left + ($size_y*$cyc_count)
   INC($cyc_count, 1)
END_CYC

// Вывод миникарты в лог

$horizontal_line = ""
$two = $horizontal_line
$cap = "      "
FOR($i = 0, $i < 9)
   $cap = STRCONCAT($cap, "   ")
   $horizontal_line = STRCONCAT($horizontal_line, "   ", $i, "    ", GETVAR("$two"))
   IF($i = 1)
      $two = " "
   END_IF
END_CYC
PRINT($cap,"[MINIMAP]")
PRINT($horizontal_line)

FOR($i = 0, $i < 9)
   $horizontal_line  = CHAR(0x41+$i)
   FOR($k = 0, $k < 9)
      $horizontal_line  = STRCONCAT($horizontal_line, "[",$array_area[$k * 2 + 0], ":", $array_area[$i * 2 + 1], "]")
      IF($i = 0)
         $horizontal_line = STRCONCAT($horizontal_line, "##")
      END_IF
      IF($i > 0 & $i < 3)
         $horizontal_line = STRCONCAT($horizontal_line,  "#")
      END_IF
   END_CYC
   PRINT($horizontal_line)
END_CYC

HALT

Code: (clickermann) [Select]
// Область поиска поделённая на 2 части в 1 конструкции через массив и доп цикл
IF($scan = 0)
   $x = 0
   $y = 0
   FOR($i = 0, ($i < 8 & $size = 0), 4)
      GETSCREEN (0, 0, $win_x, $win_y)
      SCANPXL($arr, $array_area[0*2+0], $array_area[$i*2+1], $array_area[8*2+0], $array_area[(4+$i)*2+1], 16230484)
      $size = ARRSIZE($arr)
      IF($size > 0)
         FOR($a = 0, $a < $size, 2)
            IF(DIST($arr[$a], $arr[$a+1], $array_area[4*2+0], $array_area[4*2+1]) < DIST($x, $y, $array_area[4*2+0], $array_area[4*2+1]))
               $x = $arr[$a]
               $y = $arr[$a+1]
            END_IF
         END_CYC
      END_IF
   END_CYC
   IF($size != 0)
      $base = 0
      $size = 0
      UNDEFINE($arr)
   ELSE
      $base = 1
   END_IF
END_IF

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

Code: (clickermann) [Select]
// Заполняем область 5x5 нолями
FOR($i = 0, $i < 5*5)
   $arr[$i] = #FALSE
END_CYC

// Якобы результаты работы сканпикселя поиска препятствий на миникарте
$ARR_SCAN[0] = 3
$ARR_SCAN[1] = 1

// Перезаписываем 0  на 1 по координатам из массива $ARR_SCAN
FOR($i = 0, $i < ARRSIZE($ARR_SCAN), 2)
   $arr[$ARR_SCAN[$i+1]*5+$ARR_SCAN[$i]] = #TRUE
END_CYC

// Вывод результата в лог
PRINT(" 01234")
FOR($i = 0, $i < 5)
   $str = $i
   FOR($k = 0, $k < 5)
      $str = STRCONCAT($str, $arr[$i*5+$k])
   END_CYC
   PRINT($str)
END_CYC

// Результат

//10:54:19  01234
//10:54:19 000000
//10:54:19 100010
//10:54:19 200000
//10:54:19 300000
//10:54:19 400000

HALT
« Last Edit: February 26, 2019, 11:25:58 AM by Космич »
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

BiG

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Спасибо,буду изучать недели две) Мини карта постоянно двигается и крутится когда я перемещаюсь нажимая WSADQE, я на миникарте всегда в центре.

Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
лучше вручную отступы выставить)

Code: (clickermann) [Select]
FOR($i = 0, $i < ARRSIZE($array_area), 2)
   PRINT($array_area[$i], ":", $array_area[$i+1])
END_CYC

PRINT("LEFT:  ", INT(($array_area[3*2+0]+$array_area[4*2+0])/2),     ":",  INT(($array_area[3*2+1]+$array_area[4*2+1])/2))

PRINT("CENTER:", $array_area[4*2+0], ":", $array_area[4*2+1])

PRINT("RIGHT: ", ROUND(($array_area[4*2+0]+$array_area[5*2+0])/2, 0), ":", ROUND(($array_area[4*2+1]+$array_area[5*2+1])/2, 0))
   
//13:39:05 LEFT:  129:129
//13:39:05 CENTER:148:148
//13:39:05 RIGHT: 167:167
             
HALT
« Last Edit: February 26, 2019, 01:43:36 PM by Космич »
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»