Что нового

[Массивы] Логическое определение ближайшей точки

desferk

Новичок
Сообщения
11
Репутация
0
Здравствуйте!
Думаю любой человек который когда либо пытался написать собственного бота или возвращалку на спот и прочее... сталкивался с проблемой, как организовать в мозгу скрипта думалку дабы о мог по определенным точкам ориентироваться на местности и делать правильные выводы.
И так есть скрипт(в процессе сборки):
Код:
func _check()
	sleep(200)
		$x = _MemoryRead("0x"&$x, $dll,"dword")
		$y = _MemoryRead("0x"&$y, $dll,"dword")
	;---------chk radius--------------
		if $sx > $x Then
		$minusx = $sx - $x
	else
		$minusx = $x - $sx
	EndIf
	if $sy > $y Then
		$minusy = $sy - $y
	else
		$minusy = $y - $sy
	EndIf
	sleep(100)
	;-----------math over-------------
	If $minusx = 0 or $minusy = 0 Then
	_check()
endif
	If $minusx < 3 or $minusy < 3 Then
	_sdvig()
Else
	If $minusx > 3 or $minusy > 3 Then
	_goto()
EndIf
endif
EndFunc

func _sdvig()
endfunc
func _goto()
endfunc

_сдвиг если персонажа сдвинули то никуда не телепортируемся и не читаем вейпоинты...
но ето как то коряво.. хотелось бы чтобы в етой функции скрипт читал значения в массив ($xw,$yw) координат, сравнивал с текущими, определял ближайшую точку и дальше уже шел процесс
по автокликам на местности...
Собственно в данной логике у меня и загвоздка, как научить его делать ети выводы...
можно конечно через +- но ето будет помойму коряво.. думаю должен быть более простой выход из этой ситуации.. помогите плиз.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: Вейпоинты

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"Вейпоинты" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, Администратор форума.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код:
; поиск ближайшего вейпоинта

#include <Array.au3>

Dim $waypoints[5][2] = [[1,1],[2,2],[3,3],[4,4],[5,5]]   ; координаты вейпоинтов [x,y]
Dim $radius[5]

        $x = _MemoryRead("0x"&$x, $dll,"dword")
        $y = _MemoryRead("0x"&$y, $dll,"dword")

For $i=0 to 4							; считаем расстояния до всех вейпоинтов
	$delta_x = $x - $waypoints[$i][0]
	$delta_y = $y - $waypoints[$i][1]
	$radius[$i] = Sqrt ( $delta_x * $delta_x + $delta_y * $delta_y )
Next

$i = _ArrayMinIndex($radius)     ; получаем индекс ближайшего вейпоинта

MsgBox(0, "вейпоинт", "ближайшая точка № " & $i)
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Если карта небольшая и есть геодата, то можно использовать волновой алгоритм или A*
Если есть просто сеть вейпоинтов, то алгоритм Дийкстры
Или просто тупо и брутально, алгоритм смещения на 1, но если попадешь в какой-нибудь угол, застрянешь.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
:smile: Сразу видно высшее математическое образование. ;D

Но, я так понял, что у него задача не поиск пути в графе, а просто открытая карта и он хочет выйти к маяку, если вдруг "заблудился".
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Не, я строитель, инженер проектировщик по образованию. Просто тернистый путь ботовода заставляет углубляться всё больше и больше в различные алгоритмы :smile:
 
Автор
D

desferk

Новичок
Сообщения
11
Репутация
0
хммм очень помогли спасибо! осталось дело за малым.
Каким образом считать в массив переменных из ...txt файла вида X,Y или X;Y
Задача просто в следующем. Думаю многие может слышали когда либо или играли в игрушку MU ONLINE так вот там в основном качаются на кликере т.е тупо стоишь на одном месте и зажав правую кнопку мышки гасишь.
Только вот есть всякие неадекватные люди которые сливают тебя со "спота" или сдвигают тебя с места твоего обитания.
Так вот хочу сделать скриптег дабы мне все ето было по барабану.
Ранее делал бота для игры "Седьмой Элемент". Но он тоже не умел ходить по вейпоинтам...

В итоге необходимо конкретно следующее..

Код:
#include ...
#form...
$edit2 = "список с вейпоинтами"
Gui описания.. (GUI_ONEVENT_1)
(func ()  чтение памяти (аля _reglibregister 1500))
func()
if $x <> $curx or $y <> $cury then
for
... определение ближайшей точки вейпоинта ...
do
If $curx > $ix then
mouseclick (координаты)
If $curx < $ix then
mouseclick (координаты)
If $cury > $iy then
mouseclick (координаты)
If $cury < $iy then
mouseclick (координаты)
...
зациклить пока не достигнем нужной точки, и врубим проверку заново.

собственно както так -)
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
FileRead команду смотри, или занеси всё в INI в формате x=y и читай с помощью iniread
 

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Может пригодится функция для чтения координат в массив из файла.
Самое хорошее в этой функции то, что размерность массива может быть любая.
Код:
Func _File4Array($lFileDir,$lSection)
Local $iUb2 = 2
Dim $aSection = IniReadSection($lFileDir, $lSection)
If @error Then
	Return @error
EndIf
				;Author: "madmasles"
Dim $aResult[$aSection[0][0]][$iUb2]
For $i = 0 To $aSection[0][0] - 1
    Local $aTemp = StringSplit($aSection[$i + 1][1], '|')
    If $iUb2 < $aTemp[0] Then
        $iUb2 = $aTemp[0]
        ReDim $aResult[$aSection[0][0]][$iUb2]
    EndIf
    For $j = 0 To $aTemp[0] - 1
        $aResult[$i][$j] = $aTemp[$j + 1]
    Next
Next
Return $aResult
EndFunc

Тип файла:
Код:
[Base]
0=12|12|0|
1=14|14||
2=15|16|0|
3=17|18|1||
4=1|1|2|
5=1|1|0|
6=2|2|0|

Из массива в файл:
Код:
Func _Array4File($lFileDir,$Array4File,$lSection='Base')
	For $i=0 To 100
		If $Array4File[$i][0]='' Then Return 0
		IniWrite($lFileDir,$lSection,$i,$Array4File[$i][0]&'|'&$Array4File[$i][1]&'|'&$Array4File[$i][2]&'|'&$Array4File[$i][3])
	Next
EndFunc
 
Автор
D

desferk

Новичок
Сообщения
11
Репутация
0
О, привет Лир! :laugh:
Сколько лет сколько зим.
Я просто уже не кодил года пол наверное -))
Интерфейс сделал, память читаю, тупо по прямой бот ходит..
тока вот как заставить ходить во ВП до сих пор не могу понять..
Нужно Х Y (их всего 2 кардинаты т.к игра 2.5D вид сверху)
Пройтись по нужным ВП нажать добавить, и чтобы он добавился В ЕДИТ1.
После чего когда все гуд, нажать save. И сохранить все ето в файл.
waypoints....ini.
Выбрать некоторые пресеты, и т.д. не столь важно.
И далее по нажатии старт, проверка каждые Н секунд на предмет ухода с точки кача.. (она статичная)
но есть два варианта... Персонажа могут как бы подвинуть на другие координаты... либо убить и он респанется в городе...
Проблема в том что в памяти каким то макаром не хранится значение ХП... хз.. не могу найти вообще..
Но не суть главное чтобы етот бот определял свой путь и шел по нему обратно...
как часы... Лир! Помоги, а... я знаю тебе работы на 5 минут..
если что игруха весит 200+ мегобайт -)
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
desferk сказал(а):
Лир! Помоги, а... я знаю тебе работы на 5 минут.. если что игруха весит 200+ мегобайт -)
Как больно и обидно, читать такие посты
 

lirikmel

Продвинутый
Сообщения
226
Репутация
84
OffTopic:
Как больно и обидно, читать такие посты
да ладно тебе это где-то на 3 минуты


самое интересное как направлять персонажа не имея ротации как таковой в 2.5 игре
 

lirikmel

Продвинутый
Сообщения
226
Репутация
84
хммм кликать по сторонам......как то не кошерно.. кинь ссыль на клиент поковыряюсь в памяти
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Вычислять ротацию к цели исходя из изменения позиции
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Ротация вычисляется из текущих координат чара к текущим координатам вейпоинта. Ищи на форуме тему про Flyff
 

lirikmel

Продвинутый
Сообщения
226
Репутация
84
:scratch: там же нет ротации...

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

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


ПС чтоб привязать градусы к лепесткам и координатам мне пришлость...координатную сетку маркером на экране монитора рисовать
 
Автор
D

desferk

Новичок
Сообщения
11
Репутация
0
я думаю он имел ввиду что положение камеры игры и управление.. не позволяет поворачивать персонажа в нужную сторону.
Дада белф )) как я писал выше -) ротации в игре нет.
 
Верх