Что нового

Pathing Bot. Волновой алгоритм перемещения в ммо играх.

Belfigor

Модератор
Локальный модератор
Сообщения
3 593
Репутация
938
Какой самый лучший способ переместить персонажа в игре из пункта А в пункт Б? Правильно, по прямой! А если на пути стоит препятствие? Большинство ботов начинают тупить, дергаться, пытаться отбежать чуть в сторону и снова продолжить путь. Надежности в этом методе мало. Вашему вниманию представляется алгоритм который используется в большинстве рпг игр. По этому алгоритму в них двигается все. Игроки, мобы, и тд и тп. Когда игрок нажимает "бежать туда-то", клиент принимает пункт назначения, смотрит текущее положение, обращается к геодате и расчитывает оптимальный маршрут.
И так, представляю вашему вниманию волновой алгоритм перемещения. Код правда трешевый, но его при желании любой может оптимизировать.

Что мы имеем?
1) Небольшой мирок размером 53х60 клеточек
2) Несколько типов поверхности: Проходимая поверхность, непроходимая поверхность, поверхность которую мы уже просканировали, точка старта и точка конца пути.

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

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

Действия:
После старта выбираем сверху "тип данных" "непроходимый". Генерируем щелчками по ячейкам "геодату". Черные ячейки - это те ячейки которые скрипт будет считать безоговорочно непроходимыми.
Чтобы заменить "непроходимые" ячейки "проходимыми" выбираем соответствующий тип данных сверху и тыкаем туда куда считаем нужным.

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

Если вдруг кто-то решит опробовать, выкладывайте варианты своих лабиринтов с проложенным по ним маршрутом скрипта. Вот мой вариант:


Вот видео: http://www.youtube.com/watch?v=tvMQNibhlgU

Найденные и неисправленные баги:
spider_xr сказал(а):
нехватает "Else" между 184 и 185 строчкой. из-за чего "бот" не может топать вверх по прямой как следствие не проходит в узкий проход.
 

OXC1

Новичок
Сообщения
4
Репутация
0
Решил попробовать)
Но почему то при запуске выдает ошибку, нужны какие то библиотеки?)(хотя папку Include глянул, там есть все, что указано в скрипте)
Скриншот во вложении
 

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
классная штука... сейчас попробую
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 593
Репутация
938
А, там ошибка была, я когда лишнее стирал не стер одну скобочку, посмотри в той строке правее стоит
Код:
")
 

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
не удобно рисовать...
все время кликать надо.
а каков смысл в этой игрушке то? куда эту фичу привинтить то можно?
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 593
Репутация
938
Bloodrinker сказал(а):
не удобно рисовать... все время кликать надо. а каков смысл в этой игрушке то? куда эту фичу привинтить то можно?
Это пример алгоритма поиска пути. ГУИ тут сделано только как наглядный пример. Замени ГУИ - любой ммо игрой типа вов или же ладвы, получи доступ к ее ресурсам, вот там то и пригодится алгоритм передвижения для организации вменяемого вейпоинтинга. Так же можно использовать алгоритмы A* или Алгоритм Дийкстры, да их в принципе куча. Я например собираюсь применить это в боте для Iris Online
 

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
Код:
Dim $ala = 1
While 1
    HotKeySet("{F8}", "klic")
    HotKeySet("{F9}", "klic1")
    Sleep(100)
WEnd
Func klic1()
    $ala = 5
EndFunc   ;==>klic1

Func klic()
    While $ala = 1
        MouseClick("left")
        Sleep(50)
    WEnd
EndFunc   ;==>klic


ато у меня уже палец дергается)
сейчас на твой ирис гляну... мне оч понра идея сама...

Эммм.. вот это как понять? я завел твоего ботэ в тупик хаха) :blum:
забудилсо бедняжко....
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 593
Репутация
938
Видимо алгоритм дал сбой. Значит выложенная версия не идеальна :smile:
 

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
он короче шел правильно, потом начал плутать в этом "зеленом пятне" и завис, я сам не понял почему правда. и добавь еще чтоб не отпуская мышь рисовать можно было, у меня не получилось
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 593
Репутация
938
Bloodrinker сказал(а):
он короче шел правильно, потом начал плутать в этом "зеленом пятне" и завис, я сам не понял почему правда. и добавь еще чтоб не отпуская мышь рисовать можно было, у меня не получилось
У меня тоже. С гуи я плохо работаю :smile:
 

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
OffTopic:
да се мы не без греха :whistle:
 

spider_xr

Знающий
Сообщения
14
Репутация
7
нехватает "Else" между 184 и 185 строчкой. из-за чего "бот" не может топать вверх по прямой как следствие не проходит в узкий проход.
 

speshitel

Знающий
Сообщения
10
Репутация
5
[Мышь, клавиатура] Re: Pathing Bot. Волновой алгоритм перемещения в ммо играх.

Вот навоял кусочек кода, чтоб можно было рисовать не отпуская ЛКМ.
Изменения произошли в основном цикле программы.
Вот оригинал:
Код:
While 1
	Local $nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nMsg = 3	 To 6
			;
		Case $nMsg = $Label[0][0] To $Label[UBound($Label,1)-1][UBound($Label,2)-1]

			If BitAND(GUICtrlRead($radio1), $GUI_CHECKED) = $GUI_CHECKED  Then
				GUICtrlSetData($nMsg, 100000)
				GUICtrlSetBkColor($nMsg, 0x000000)
				GUICtrlSetColor($nMsg, 0x000000)
			ElseIf BitAND(GUICtrlRead($radio2), $GUI_CHECKED) = $GUI_CHECKED  Then
				GUICtrlSetData($nMsg, 99999)
				GUICtrlSetBkColor($nMsg, 0xFFFFFF)
				GUICtrlSetColor($nMsg, 0xFFFFFF)
			ElseIf BitAND(GUICtrlRead($radio3), $GUI_CHECKED) = $GUI_CHECKED  Then
				GUICtrlSetData($nMsg, 3)
				GUICtrlSetBkColor($nMsg, 0x00FF00)
				GUICtrlSetColor($nMsg, 0x00FF00)
			ElseIf BitAND(GUICtrlRead($radio4), $GUI_CHECKED) = $GUI_CHECKED  Then
				GUICtrlSetData($nMsg, 10004)
				GUICtrlSetBkColor($nMsg, 0xFF0000)
				GUICtrlSetColor($nMsg, 0xFF0000)
			EndIf

		Case $Button1
			Local $var = GetGeoData()
			GoHome($var[0], $var[1])
		Case $Button2
			For $y = 0 To $yMax-1 Step 1
				For $x = 0 To $xMax-1 Step 1
					GUICtrlSetData($Label[$x][$y], 99999)
					GUICtrlSetColor($Label[$x][$y], 0xFFFFFF)
					GUICtrlSetBkColor($Label[$x][$y], 0xFFFFFF)
				Next
			Next
	EndSwitch
WEnd

Вот доделка:
Код:
#include <Misc.au3> ;  добавил

Dim $dll = DllOpen("user32.dll") ;  добавил
AutoItSetOption("MouseCoordMode", 2) ;  добавил

While 1
	Local $nMsg = GUIGetMsg(), $pos ;  добавил $pos
	
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nMsg = 3	 To 6
			;
		Case $nMsg = $Label[0][0] To $Label[UBound($Label,1)-1][UBound($Label,2)-1]
			While _IsPressed("01", $dll) = 1 ;  добавил
				$pos = MouseGetPos() ;  добавил
				$x = Ceiling($pos[0]/$CellSize)-1 ;  добавил
				$y = Ceiling(($pos[1]-17)/$CellSize)-1 ;  добавил
				
				Select ; переделал
					Case GUICtrlRead($radio1) = $GUI_CHECKED
						GUICtrlSetData($Label[$x][$y], 100000)
						GUICtrlSetBkColor($Label[$x][$y], 0x000000)
						GUICtrlSetColor($Label[$x][$y], 0x000000)
					Case GUICtrlRead($radio2) = $GUI_CHECKED
						GUICtrlSetData($Label[$x][$y], 99999)
						GUICtrlSetBkColor($Label[$x][$y], 0xFFFFFF)
						GUICtrlSetColor($Label[$x][$y], 0xFFFFFF)
					Case GUICtrlRead($radio3) = $GUI_CHECKED
						GUICtrlSetData($Label[$x][$y], 3)
						GUICtrlSetBkColor($Label[$x][$y], 0x00FF00)
						GUICtrlSetColor($Label[$x][$y], 0x00FF00)
					Case GUICtrlRead($radio4) = $GUI_CHECKED
						GUICtrlSetData($Label[$x][$y], 10004)
						GUICtrlSetBkColor($Label[$x][$y], 0xFF0000)
						GUICtrlSetColor($Label[$x][$y], 0xFF0000)
				EndSelect
			Sleep(100) ;  добавил
			WEnd
		
		Case $Button1
			Local $var = GetGeoData()
			GoHome($var[0], $var[1])
		Case $Button2
			For $y = 0 To $yMax-1 Step 1
				For $x = 0 To $xMax-1 Step 1
					GUICtrlSetData($Label[$x][$y], 99999)
					GUICtrlSetColor($Label[$x][$y], 0xFFFFFF)
					GUICtrlSetBkColor($Label[$x][$y], 0xFFFFFF)
				Next
			Next
	EndSwitch
WEnd
DllClose($dll) ;  добавил
 

anonymous7

Знающий
Сообщения
40
Репутация
8
spider_xr сказал(а):
нехватает "Else" между 184 и 185 строчкой. из-за чего "бот" не может топать вверх по прямой как следствие не проходит в узкий проход.
по подробнее хотелось бы
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 593
Репутация
938
anonymous7 сказал(а):
по подробнее хотелось бы
Открой скрипт и добавь условие перемещения аналогичное как для других сторон. между 184 и 185 строчкой, как еще подробнее?
 

anonymous7

Знающий
Сообщения
40
Репутация
8
Belfigor сказал(а):
anonymous7 сказал(а):
по подробнее хотелось бы
Открой скрипт и добавь условие перемещения аналогичное как для других сторон. между 184 и 185 строчкой, как еще подробнее?
Написать ту строчку, которой не хватает
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 593
Репутация
938
anonymous7 сказал(а):
Написать ту строчку, которой не хватает
Оно создано для изучения, а не как готовый продукт. Кому надо тот подправит и еще с другими поделится своим решением
 

Buburum

Новичок
Сообщения
12
Репутация
0
Очень занимательно особенно если прикрутить куда следует...
Один вопрос только ... ускорить процесс поиска выходы можно как то ?
по моему как то медленно если сделать лабиринт ещё больше то придется очень долго ждать (((
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 593
Репутация
938
Да, проблема этого алгоритма в том что ему не хватает скорости, как вариант можно использовать другой алгоритм.
 
Верх