Yoko

All sides of Injection
It is currently 2025-10-21 15:37:38

All times are UTC+02:00




Post new topic  Reply to topic  [ 42 posts ]  Go to page 1 2 3 Next
Author Message
PostPosted: 2005-09-02 18:54:10 
Offline
User avatar

Joined: 2005-06-04 16:01:26
Posts: 25
Я в поисках наиболее удачной версии ходилки.
Ниже приведен код по реализации Ходилки с обходом препятствий по алгоритму "Надежная трассировка" с соединенем алгорима "Трассировка вокруг препятствия".
Суть алгоритмов можно почерпнуть http://dev.dtf.ru/articles/read.php?id=46 внизу страницы.
Для алгорима необходим Стек. Вот он
Code:
#(c)SerrouS
Sub InitStack()
  UO.SetGlobal('STACK', '0')
endsub
Sub Push( param )
  var chk = val(UO.GetGlobal('STACK')) ; количество элементов в стеке
  UO.SetGlobal('STACK',str(chk + 1))
  UO.SetGlobal('STACK_'+str(chk), param)
endsub
Sub Pop ()
  var chk = val(UO.GetGlobal('STACK')) ; количество элементов в стеке
  if chk then
    UO.SetGlobal('STACK',str(chk - 1))
    return UO.GetGlobal('STACK_'+str(chk - 1))
  else
    return ''
  endif
endsub

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

Далее
Code:
SUB GoToXY(x,y,prec) 
#original (c) ...
#modification 2.00 (c) SerrouS
  dim turn[8] ; индекс - ГетДир, значение поворот направо под 45 градусов
  turn[0] = 39
  turn[1] = 34
  turn[2] = 40
  turn[3] = 35
  turn[4] = 37
  turn[5] = 36
  turn[6] = 38
  turn[7] = 33
  dim deltax[8]; индекс - аналогично, значение - изменение координаты при проходе стенки
  dim deltay[8]
  deltax[0] =  1
  deltax[1] =  1
  deltax[2] =  1
  deltax[3] =  0
  deltax[4] = -1
  deltax[5] = -1
  deltax[6] = -1
  deltax[7] =  0

  deltay[0] = -1
  deltay[1] =  0
  deltay[2] =  1
  deltay[3] =  1
  deltay[4] =  1
  deltay[5] =  0
  deltay[6] = -1
  deltay[7] = -1
var dx,dy

  var mx,my ; current coords
  var lx = 0, ly = 0, ld = -1 ; last move coords
 
var pathFind = 0 ; as logical 0 - norm, 1 - block
var ind
var recursInd = 0
var fout = 0

var stepdelay = 1000

InitStack()
repeat
  mx=UO.GetX()
  my=UO.GetY()

  ; calculating for precision coming
  dx = mx - x 
  If dx < 0 Then 
    dx = 0 - dx
  EndIf ;get ABS diff

  dy = my - y 
  If dy < 0 Then 
    dy = 0 - dy
  EndIf
  If dy > dx Then
    dx = dy
  EndIf
  If dx <= prec Then
    Return
  EndIf
   
  if mx == x and my == y then   
    return
  endif
 
  lx = mx
  ly = my
  ld = UO.GetDir() ; cause once pressing can only change the direcction

  if mx == x and my >  y then
    UO.Press(33)
  endif
  if mx == x and my  < y then
    UO.Press(35)
  endif
  if mx  < x and my == y then
    UO.Press(34)
  endif
  if mx  < x and my >  y then
    UO.Press(39)
  endif
  if mx  < x and my  < y then
    UO.Press(40)
  endif
  if mx >  x and my == y then
    UO.Press(36)
  endif
  if mx >  x and my >  y then
    UO.Press(38)
  endif
  if mx >  x and my  < y then
    UO.Press(37)
  endif
UO.Print('KeyPressed')
  wait( stepdelay )

  if lx == UO.GetX() and ly == UO.GetY() and ld == UO.GetDir() then
    ; now there is a stop situation
UO.Print('PathFind')
    recursInd = 0
    repeat
#################################################
      ind = ld
      UO.Print(str(ind))
      fout = 0
      repeat ; идем в обход пока не упремся снова или не кончится стена
UO.Print('Iteration')
        mx = UO.GetX()
        my = UO.GetY()
        ld = UO.GetDir()
        UO.Press( turn[ ind ] )
        wait( stepdelay ) 
        if (UO.GetX() == mx and UO.GetY() == my and ld == UO.GetDir()) then
          fout = 1 ; уперлись
        else
          dx = UO.GetX() - mx
          dy = UO.GetY() - my
UO.Print('deltas  '+str(dx)+'  '+str(dy))
          if deltax[ ind ] == dx and deltay[ ind ] == dy then
            fout = 2 ; препятствие пройдено
          endif
        endif
      until fout
UO.Print('fout   '+ str(fout))
      if fout == 1 then ; уходим на следующий поворот
        recursInd = recursInd + 1
        Push( str( ind ) )
        ;ld = ind
      else ; fout == 2
        ; надо попытаться восстановить контекст из стека, или выйти из обхода
        UO.Print('Iter  '+ str(recursInd))
        pathFind = 0
        if recursInd then ; восстановление
          pathFind = 1
          recursInd = recursInd - 1
          ld = val(Pop()) - 1
          if ld == -1 then
            ld = 7
          endif
          UO.Press( turn[ld] )
          wait ( stepdelay )         ; в сиду того, что ондо нажатие меняет напрваление
        endif
      endif
#################################################
    until not recursInd and not pathFind
    UO.Print('PathFind END')
  endif


until 0
endsub


Просьба протестировать, кому интересно. Если глюки будут - скидываем суда лог + пишем о поведении.

Пробный пуск показал, что принципиальная схема работает. Точность - один тайл ( для непонявших поясняю - в проход шириной в один тайл при обходе чар не пройдет - делаем по старинке - прописываем ару лишних координат, чтоб чар пользовался дверью по порямому назначению а не как обходом)

Выслушаю любые предложения по усовершенствованию и облагораживанию.

Чей исходный был копирайт - незнаю, но уважаю (напишите чей, тока имейте в виду название не суть скрипта, просто может кто код узнает).


Last edited by SerrouS on 2005-09-08 19:04:10, edited 1 time in total.

Top
   
 Post subject:
PostPosted: 2005-09-02 19:07:59 
Offline

Joined: 2005-08-12 03:04:00
Posts: 125
Афигительно в тему. Тока сегодня разочаровался в своей текущей ходилке и стал искать новую . Убёг тестить.

_________________
I NEED HELP at viewtopic.php?t=4903


Top
   
 Post subject:
PostPosted: 2005-09-03 15:25:41 
Offline

Joined: 2005-08-12 03:04:00
Posts: 125
Тест-отчёт :D
Ходилка тестилась на макросе майнинга и около дома.
Что понравилось:
+Обходит сложные препятствия
+Находит выход из любых закоулков, откуда 3 мои предыдущие ходилки выбраться не могли.
+Жмёт на кнопку, тока когда это необходимо, избегая такиим образом постоянных сообщений "step bufer overflow" и лагов.
+Действует по более-менее :D понятному мне :D алгоритму.
Что можно улучшить
1) Сделать более быстрое хождение на прямых участках (когда нет препятствий).
2) Сделать её быстрее, с сохранением надежности.

Интересно что думает автор по поводу этих улучшений.

А так это именно та ходилка которую я искал. Спасибо. Если возникнут какие-нибудь сложности - напишу.

_________________
I NEED HELP at viewtopic.php?t=4903


Top
   
 Post subject:
PostPosted: 2005-09-03 15:58:49 
Offline
User avatar

Joined: 2005-06-04 16:01:26
Posts: 25
Quote:
Жмёт на кнопку, тока когда это необходимо, избегая такиим образом постоянных сообщений "step bufer overflow" и лагов.

просто стоит заранее бОльшая задержка.
Это сделано по двум причинам:
- проще тестить
- если координата не успееет поменяться до проверки в скрипте, то будет начат обход несуществующего препятствия. :D
Quote:
Сделать более быстрое хождение на прямых участках (когда нет препятствий)

принципиально - не сложно, к вечеру сделаю наверное.(Када скрипт на лумбер поправлю) :D


А остальные ~25 прочитавших что-же ?[/quote]


Top
   
 Post subject:
PostPosted: 2005-09-04 12:42:51 
Offline

Joined: 2005-02-22 20:03:13
Posts: 77
все хорошо! но !
если координаты цели постоянно меняются? и почему то у меня не работает*(((((((( Образование не позволяет)
если не сложно то с параметрами задания координат цели! прлллз

_________________
говорила мне мама "учись неуч"


Top
   
 Post subject:
PostPosted: 2005-09-04 15:33:12 
Offline
User avatar

Joined: 2005-06-04 16:01:26
Posts: 25
MazaFaka wrote:
если координаты цели постоянно меняются? и почему то у меня не работает*(((((((( Образование не позволяет)
если не сложно то с параметрами задания координат цели! прлллз

чеегоо :?:

да кстати
Code:
var stepdelay = 1000

лучше поставить около 350. Ходит быстрее. А вообще подбираем под себя. (Потому как принципиальная схема убыстрения ходилки на прямых участках принципиально не сработает, из принципиальных соображений :) )


Top
   
 Post subject:
PostPosted: 2005-09-04 16:05:16 
Offline
Expert!
User avatar

Joined: 2004-07-04 00:14:58
Posts: 1284
SerrouS wrote:
Code:
var stepdelay = 1000
или wait(stepdelay) заменить на CheckLag()


Top
   
 Post subject:
PostPosted: 2005-09-08 11:53:14 
Offline
User avatar

Joined: 2005-07-06 04:57:14
Posts: 13
тестировал я тоже ходилку
да довольно не плоха написона
но вот цикл бывает сбиваетса
тестировал я ее на своем скрипте на ламбер вокруг минок банка из 3 кругов 1 заглючил


Top
   
PostPosted: 2005-09-08 14:37:01 
Offline

Joined: 2005-05-22 08:35:28
Posts: 25
Возможно, ошибка связана с этим:
SerrouS wrote:
Code:
  dim deltax[7]; индекс - аналогично, значение - изменение координаты при проходе стенки
  dim deltay[7]


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

_________________
Никогда не бойся делать то, что ты не умеешь!
Помни, ковчег был построен любителем. Профессионалы построили "Титаник".


Top
   
 Post subject:
PostPosted: 2005-09-08 19:06:10 
Offline
User avatar

Joined: 2005-06-04 16:01:26
Posts: 25
Согласен, опечатался. Видимо сазавается привычка писать на Делфи :D
В первом посте подправил.
Спасибо :!:


Top
   
 Post subject:
PostPosted: 2005-09-09 09:11:51 
Offline
User avatar

Joined: 2005-06-04 16:01:26
Posts: 25
Для тех кто не вкурсе с чем ходилки едят.
Имеется три входных папаметра
x - целевая координата по оси Х (в заголовке Инжекта первая)
y - целевая координата по оси Y (в заголовке Инжекта вторая)
prec - точность подхода к координатам - если например в качестве координат указан тайл с сундуком, то туда вы просто не сможете придти следовательно ставя точность 1 вы подойдете к нему вплотную.
Промер использования:
Code:
  sub <subname>()
     <some operators>
     ; now you need to move, for example to 1234 876 exactly
     ; do it
     GoToXY(1234, 876, 0)
     ; after this call your char stands directly at 1234 876
     <some operators>
  endsub

другой пример
Code:
  sub <subname>()
     <some operators>
     ; now you need to move, for example to 1234 876 (there is some box at this tile)
     ; do it
     GoToXY(1234, 876, 1)
     ;or
     GoToXY(1234, 876, 2)
     ; after this call your char stands directly at 1234 876
     <some operators>
  endsub


Настойка
Code:
var stepdelay = 1000

это единственое что можо и нужно настраивать. Если чар ходит слишком медленно, с остановками - уменьшите число.
Если быстро, в ошибками переполнения буфера и проскоком места назначения и поворотов, кароче если не работает - увеличить.
При 1000 - должно работать везде.(ну наверно)
Для меня наиболее удачной оказалась цифра 350.

PS Написано по просьбам трудящихся. Если у трудящихся все еще остались вопросы как использовать данную функцию пусть пишут сюда же.


Top
   
 Post subject:
PostPosted: 2005-09-09 10:56:10 
Offline

Joined: 2004-11-10 15:50:26
Posts: 28
Огрромное спасибо, действительно суперходилка, прям шедевр :)

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


Top
   
 Post subject:
PostPosted: 2005-09-12 11:08:58 
Offline
Sphere expert
User avatar

Joined: 2004-10-01 08:27:38
Posts: 1143
Location: Уфа
[quote="Sfagnum"][/quote]
Тестал сам образец ?

_________________
Сделал дело - флуди смело !!!


Top
   
 Post subject:
PostPosted: 2005-09-12 11:37:04 
Offline
Expert!
User avatar

Joined: 2004-07-04 00:14:58
Posts: 1284
Askaneli wrote:
Sfagnum wrote:

Тестал сам образец ?
нет :)
от добра-добра не ищут ;)


Top
   
 Post subject:
PostPosted: 2005-09-16 14:00:27 
Offline

Joined: 2005-08-12 03:04:00
Posts: 125
Выявлен баг: иногда начинает обходить несуществующие предметы и уходит в бесконечный цикл. Задержка 1000. Пинг до сервера меньше 10мс. Как пофиксить?

_________________
I NEED HELP at viewtopic.php?t=4903


Top
   
 Post subject:
PostPosted: 2005-09-16 14:44:39 
Offline

Joined: 2005-08-12 03:04:00
Posts: 125
MazaFaka wrote:
все хорошо! но !
если координаты цели постоянно меняются? и почему то у меня не работает*(((((((( Образование не позволяет)
если не сложно то с параметрами задания координат цели! прлллз


Передавай в скрипт ID цели, а X и Y получай внутри функции в первом repeat-until м помощью UO.GetX(target_id) и UO.GetY(target_id).

_________________
I NEED HELP at viewtopic.php?t=4903


Top
   
PostPosted: 2005-09-16 19:00:40 
Offline
User avatar

Joined: 2005-06-04 16:01:26
Posts: 25
Quote:
Выявлен баг: иногда начинает обходить несуществующие предметы и уходит в бесконечный цикл. Задержка 1000. Пинг до сервера меньше 10мс. Как пофиксить?

SerrouS wrote:
Если глюки будут - скидываем суда лог + пишем о поведении.


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

Фиксить все буду когда Цитадель откроют для иногородних.
Счас у меня отдых и Горький Зеро 8) )

Кстати там Корвин ошибочку выявил ты вкурсе (может привести к подобному, потому как любой баг может привести к чему угодно)??


Top
   
PostPosted: 2005-09-28 23:49:13 
Offline
User avatar

Joined: 2004-06-26 18:01:48
Posts: 13
SerrouS wrote:
Quote:
Выявлен баг: иногда начинает обходить несуществующие предметы и уходит в бесконечный цикл. Задержка 1000. Пинг до сервера меньше 10мс. Как пофиксить?

SerrouS wrote:
Если глюки будут - скидываем суда лог + пишем о поведении.


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

Фиксить все буду когда Цитадель откроют для иногородних.
Счас у меня отдых и Горький Зеро 8) )

Кстати там Корвин ошибочку выявил ты вкурсе (может привести к подобному, потому как любой баг может привести к чему угодно)??



такая ситуация: иногда доходит до нужных координат и начинает обход, причем непонятно чего и на этом зацикливается :cry:


Top
   
 Post subject:
PostPosted: 2005-10-01 06:35:27 
Offline

Joined: 2005-10-01 06:27:55
Posts: 9
помогите михе
сделайте чтобы не сбивалось +)

_________________
:)


Top
   
 Post subject:
PostPosted: 2005-10-01 11:05:35 
Offline
Junior Expert
User avatar

Joined: 2004-06-24 22:08:56
Posts: 3220
Гмм, где-то я эту ссылочку на алгоритмы видел -)

У меня ходилка лучше, хотя писал и не я :roll:

Скажем так, если хочешь улучшить ходилку - юзай ASM, эффективность возрастет раза в два.

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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 42 posts ]  Go to page 1 2 3 Next

All times are UTC+02:00


Who is online

Users browsing this forum: No registered users and 12 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited