Новая ходилка

Anything and all.

Moderators: Murderator+, Murderator

SerrouS
Posts: 25
Joined: 2005-06-04 16:01:26

Новая ходилка

Post by SerrouS »

Я в поисках наиболее удачной версии ходилки.
Ниже приведен код по реализации Ходилки с обходом препятствий по алгоритму "Надежная трассировка" с соединенем алгорима "Трассировка вокруг препятствия".
Суть алгоритмов можно почерпнуть http://dev.dtf.ru/articles/read.php?id=46 внизу страницы.
Для алгорима необходим Стек. Вот он

Code: Select all

#(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: Select all

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.
PCGamer
Posts: 125
Joined: 2005-08-12 03:04:00

Post by PCGamer »

Афигительно в тему. Тока сегодня разочаровался в своей текущей ходилке и стал искать новую . Убёг тестить.
I NEED HELP at viewtopic.php?t=4903
PCGamer
Posts: 125
Joined: 2005-08-12 03:04:00

Post by PCGamer »

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

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

А так это именно та ходилка которую я искал. Спасибо. Если возникнут какие-нибудь сложности - напишу.
I NEED HELP at viewtopic.php?t=4903
SerrouS
Posts: 25
Joined: 2005-06-04 16:01:26

Post by SerrouS »

Жмёт на кнопку, тока когда это необходимо, избегая такиим образом постоянных сообщений "step bufer overflow" и лагов.

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

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


А остальные ~25 прочитавших что-же ?[/quote]
MazaFaka
Posts: 77
Joined: 2005-02-22 20:03:13

Post by MazaFaka »

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

Post by SerrouS »

MazaFaka wrote:если координаты цели постоянно меняются? и почему то у меня не работает*(((((((( Образование не позволяет)
если не сложно то с параметрами задания координат цели! прлллз

чеегоо :?:

да кстати

Code: Select all

var stepdelay = 1000

лучше поставить около 350. Ходит быстрее. А вообще подбираем под себя. (Потому как принципиальная схема убыстрения ходилки на прямых участках принципиально не сработает, из принципиальных соображений :) )
Sfagnum
Expert!
Posts: 1284
Joined: 2004-07-04 00:14:58
Contact:

Post by Sfagnum »

SerrouS wrote:

Code: Select all

var stepdelay = 1000
или wait(stepdelay) заменить на CheckLag()
dUha
Posts: 13
Joined: 2005-07-06 04:57:14
Contact:

Post by dUha »

тестировал я тоже ходилку
да довольно не плоха написона
но вот цикл бывает сбиваетса
тестировал я ее на своем скрипте на ламбер вокруг минок банка из 3 кругов 1 заглючил
Corwin
Posts: 25
Joined: 2005-05-22 08:35:28

Re: Новая ходилка

Post by Corwin »

Возможно, ошибка связана с этим:
SerrouS wrote:

Code: Select all

  dim deltax[7]; индекс - аналогично, значение - изменение координаты при проходе стенки
  dim deltay[7]


Тут опечатка - размерность массива должна быть равна восьми.
Никогда не бойся делать то, что ты не умеешь!
Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
SerrouS
Posts: 25
Joined: 2005-06-04 16:01:26

Post by SerrouS »

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

Post by SerrouS »

Для тех кто не вкурсе с чем ходилки едят.
Имеется три входных папаметра
x - целевая координата по оси Х (в заголовке Инжекта первая)
y - целевая координата по оси Y (в заголовке Инжекта вторая)
prec - точность подхода к координатам - если например в качестве координат указан тайл с сундуком, то туда вы просто не сможете придти следовательно ставя точность 1 вы подойдете к нему вплотную.
Промер использования:

Code: Select all

  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: Select all

  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: Select all

var stepdelay = 1000

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

PS Написано по просьбам трудящихся. Если у трудящихся все еще остались вопросы как использовать данную функцию пусть пишут сюда же.
Jerry
Posts: 28
Joined: 2004-11-10 15:50:26

Post by Jerry »

Огрромное спасибо, действительно суперходилка, прям шедевр :)

Правда тока что, когда из пещеры выходил, запутался чар, сначала оббежал всю пещеру по периметру, потом пробежал мимо точки, до которой должен идти и побежал дальше искать эту точку, я чувствую он бы далеко ушёл...
Askaneli
Sphere expert
Posts: 1143
Joined: 2004-10-01 08:27:38
Location: Уфа

Post by Askaneli »

[quote="Sfagnum"][/quote]
Тестал сам образец ?
Сделал дело - флуди смело !!!
Sfagnum
Expert!
Posts: 1284
Joined: 2004-07-04 00:14:58
Contact:

Post by Sfagnum »

Askaneli wrote:
Sfagnum wrote:

Тестал сам образец ?
нет :)
от добра-добра не ищут ;)
PCGamer
Posts: 125
Joined: 2005-08-12 03:04:00

Post by PCGamer »

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

Post by PCGamer »

MazaFaka wrote:все хорошо! но !
если координаты цели постоянно меняются? и почему то у меня не работает*(((((((( Образование не позволяет)
если не сложно то с параметрами задания координат цели! прлллз


Передавай в скрипт ID цели, а X и Y получай внутри функции в первом repeat-until м помощью UO.GetX(target_id) и UO.GetY(target_id).
I NEED HELP at viewtopic.php?t=4903
SerrouS
Posts: 25
Joined: 2005-06-04 16:01:26

Re: Новая ходилка

Post by SerrouS »

Выявлен баг: иногда начинает обходить несуществующие предметы и уходит в бесконечный цикл. Задержка 1000. Пинг до сервера меньше 10мс. Как пофиксить?

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


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

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

Кстати там Корвин ошибочку выявил ты вкурсе (может привести к подобному, потому как любой баг может привести к чему угодно)??
miha
Posts: 13
Joined: 2004-06-26 18:01:48

Re: Новая ходилка

Post by miha »

SerrouS wrote:
Выявлен баг: иногда начинает обходить несуществующие предметы и уходит в бесконечный цикл. Задержка 1000. Пинг до сервера меньше 10мс. Как пофиксить?

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


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

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

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



такая ситуация: иногда доходит до нужных координат и начинает обход, причем непонятно чего и на этом зацикливается :cry:
ForwarD
Posts: 9
Joined: 2005-10-01 06:27:55
Contact:

Post by ForwarD »

помогите михе
сделайте чтобы не сбивалось +)
:)
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Гмм, где-то я эту ссылочку на алгоритмы видел -)

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

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

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