Author Topic: Перемещение бота к цели при помощи WASD  (Read 4519 times)

0 Members and 1 Guest are viewing this topic.

JustAUser

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Доброго времени суток!
Имеется 3D приложение с видом сверху, в котором есть персонаж и собираемый ресурс. Ресурс появляется рандомно в определённой области на экране. Чтобы ресурс мог собираться, нужно подойти персонажем вплотную. Персонаж двигается по принципу: W - вверх, S - вниз, A - влево, D - вправо (диагональное перемещение возможно). Премещение персонажа мышью невозможно. Отсюда возникают следующие мысли: 1. Возможно ли на основании данной программы составить скрипт, который сможет самостоятельно подходить к текущему положению курсора на экране с помощью клавиатуры? 2. Справится ли с таким скриптом рядовой пользователь пк, имеющий нулевой уровень в программировании? 3. Возможны ли какие-то альтернативные варианты для выполнения данной задачи?
Я уже разобрался как находить искомый пиксель на экране и работать с ним, используя только мышь. Однако теперь нужно подключить ещё и клавиатуру для составления бота. Если имеются какие-нибудь обучающие статьи, то буду рад почитать. К сожалению на форуме ничего подобного не нашёл.


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Перемещение бота к цели при помощи WASD
« Reply #1 on: September 10, 2019, 03:51:37 PM »
1. Возможно.
2. С нулевым - нет. Нужен от 0.002 и выше, зависит от сложности задачи.
3. Есть, но они сложнее и небезопасней.

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

На форуме много чего что может пригодится, но, естественно, именно такой задачи нет.


JustAUser

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Перемещение бота к цели при помощи WASD
« Reply #2 on: September 10, 2019, 05:03:34 PM »
Препятствие есть, одно, в фиксированном месте, но оно меня особо не интересует, по крайней мере пока что :) В остальном можно ходить куда угодно и как угодно.

Допустим, я высчитаю скорость движения персонажа в секунду, какой функцией мне воспользоваться, чтобы в дальнейшем производился автоматический подсчёт и движение к искомому объекту? Я могу вычислить на бумаге время зажатия и прочее, но вот сделать из этого скрипт... Если возможно, напишите необходимые функции, с которым я должен познакомиться или небольшой фрагмент скрипта для примера. Скорость какая угодно, к примеру 30 пикселей в секунду, не важно и без учёта препятствия.

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

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Перемещение бота к цели при помощи WASD
« Reply #3 on: September 11, 2019, 09:45:18 AM »
Определяешь координаты начальной и конечной точки.
Функция вычисления расстояний между двумя точками:
Code: (clickermann) [Select]
DIST(x1, y1, x2, y2)

Дальше возможны варианты:
1. Ходить углами - самое простое, но долго и некрасиво.
2. Часть пути проходить по диагонали и остаток добивать по прямой x или y.
3. Идти по наклонной давя постоянно вдоль длинной координаты и периодически подмешивая нажатия вдоль второй. Самый сложный в реализации и настройке, но самый красивый.

2 и 3 возможны грабли в виде разных скоростей вдоль оси и диагонали. Как в Quake  :)


JustAUser

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Перемещение бота к цели при помощи WASD
« Reply #4 on: September 11, 2019, 11:22:05 AM »
Спасибо за помощь! Пойду составлять и тестировать  :)

JustAUser

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Перемещение бота к цели при помощи WASD
« Reply #5 on: September 11, 2019, 08:02:17 PM »
 Вот что у меня получилось в итоге. Это не конечный, а черновой вариант, но тем не менее персонаж проходит расстояние сам, в зависимости от расстояния между точками А и Б. Если я правильно понял, то функция DIST показывала общее расстояние, поэтому пошёл на другому пути. Оказывается в справке программы, во владке "введение", находилось почти всё, что мне нужно было знать, для начала работы. Открывал всё до этого, кроме этой вкладки, тогда и вопрос с вычислением отпал.
 В данном алгоритме отсутствует анализ экрана, который собираюсь добавить позже, а также некоторые другие элементы.В данном виде персонаж ходит только по х и у осям, поэтому  алгоритм получился грубый, первобытный, но работает и это главное.
Code: (clickermann) [Select]
waitms(50)
move(988, 547)
waitms(110)
 $x1 = $_xmouse
 $y1 = $_ymouse
move (311, 50)
 $x2 = $_xmouse
 $y2 = $_ymouse
waitms(124)
 $Diff_x = ($x2 - $x1)
waitms(30)
 $Diff_y = ($y2 - $y1)
 $mtt_x = ($Diff_x / 0.43)  // 0.43 скорость персонажа пиксель/мс, высчитана вручную.
 $mtt_y = ($Diff_y / 0.43)
 
If ($mtt_x < 0)
  $mtt_x = Abs($mtt_x)
  $mtt_x = round($mtt_x, 0)
    keyDown(#A)
waitms($mtt_x)
  keyup(#A)
else
  keyDown(#D)
 waitms($mtt_x)
  keyUp(#D)
End_IF

If ($mtt_y < 0)
  $mtt_y = Abs($mtt_y)
   $mtt_y = round($mtt_y, 0)
    keyDown(#W)
waitms($mtt_y)
  keyup(#W)
else
  keyDown(#S)
 waitms($mtt_y)
  keyUp(#S)
End_IF

waitms(276 + $S_CORR)
  lDown($_xmouse, $_ymouse)
waitms(36272 + $S_CORR)
  lUp($_xmouse, $_ymouse)
waitms(470 + $S_CORR)
Halt

P.s не сразу понял, что дробное число миллисекунд не даёт выполнить алгоритм, но, благо, ошибку нашёл.
« Last Edit: September 11, 2019, 08:04:35 PM by JustAUser »

JustAUser

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Перемещение бота к цели при помощи WASD
« Reply #6 on: September 12, 2019, 08:59:35 PM »
 Прошу помощи ещё с несколькими проблемами. У меня не работает функция If_picture_in. Я бы всё понял, если бы что-то делал не так, но оказалось, что моей вины не было. Я скинул своей скриншот и искомый фрагмент своему другу и объяснил, что делать. У моего друга программа находит искомый фрагмент на скриншоте, а у меня нет. В чём может быть причина? Вторая проблема в том, что я не могу заставить бота увидеть ресурсы на экране по пикселям, потому что у меня не получается выявить "уникальный" пиксель. Да ещё и дело осложняется сменой дня и ночи, а соответственно и сменой цветов. Поэтому я решил спросить про альтернативные методы распознавания элементов в игре, по всей видимости, не связанные с анализом экрана :(
« Last Edit: September 12, 2019, 09:01:13 PM by JustAUser »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Перемещение бота к цели при помощи WASD
« Reply #7 on: September 12, 2019, 09:56:05 PM »
Включи лупу, если видишь изображение значит кликер видит. Также удостоверься что у тебя с масштабом в винде 100%.

На счет уникальных пикселей, есть программка Unique Colors Search
http://crapware.aidf.org/forum/index.php?topic=42.msg572#msg572

Создаешь несколько скриншотов объекта с захватом фона, и несколько фоновых изображений где этого объекта точно нет (можно закрасить). После анализа программа выдает уникальные цвета объекта.

JustAUser

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Перемещение бота к цели при помощи WASD
« Reply #8 on: September 12, 2019, 10:42:21 PM »
С масштабом всё нормально, лупа видит изображение. В аппаратной части не может быть проблем? Может вопрос покажется глупым, но у меня изначально монитор с дефектами цветов и сломано встроенное видеоядро (покупали с рук с таким дефектом). Пользуюсь дискретной, само собой. В этом не может быть проблема? Я просто не совсем понимаю как работает программа -пк, поэтому на всякий случай говорю об этом. Монитор имеет цвета rgb:75, 90, 65. Настраивал вручную, чтобы цвет был белый, а не фиолетовый, но монитор уже брали не б/у, а просто не повезло :)

Благодарю за ссылку на программу, обязательно попробую.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Перемещение бота к цели при помощи WASD
« Reply #9 on: September 13, 2019, 01:36:32 PM »
С масштабом всё нормально, лупа видит изображение. В аппаратной части не может быть проблем? Может вопрос покажется глупым, но у меня изначально монитор с дефектами цветов и сломано встроенное видеоядро (покупали с рук с таким дефектом). Пользуюсь дискретной, само собой. В этом не может быть проблема? Я просто не совсем понимаю как работает программа -пк, поэтому на всякий случай говорю об этом. Монитор имеет цвета rgb:75, 90, 65. Настраивал вручную, чтобы цвет был белый, а не фиолетовый, но монитор уже брали не б/у, а просто не повезло :)
Монитор не может.

Ищи ошибки с координатами, картинками и прочее.


JustAUser

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Перемещение бота к цели при помощи WASD
« Reply #10 on: September 16, 2019, 02:01:27 PM »
Всё, с помощью программы Unique Colors Search, удалось настроить бота для добычи. Благодарю за помощь и на всякий случай скидываю код, с исправленными ошибками. Мало ли, кому-нибудь пригодится.

Code: (clickermann) [Select]
move(961,528) //статичное положение персонажа на экране
 $x1 = $_xmouse
 $y1 = $_ymouse
Getscreen // поиск пикселя ресурса на экране
 If_pixel_in(966,449, 1226,765, 5590612, 6775139, 6248282, 5853784, 5459026, 5327694, 6511968, 5985624, 6248542, 6577247, 5261900, 6446174, 5919577, 5130315, 5722710, 5525331, 5854297, 6183003, 5130573, 6182749, 6709089, 6117209, 5195080, 5195080, 5195080, 5656659, 5788502, 7300970, 5918803, 6446175, 6841705)
 waitms(42)
  move($_return1, $_return2)
 $x2 = $_xmouse
 $y2 = $_ymouse
End_If
 $Diff_x = ($x2 - $x1)
waitms(30)
 $Diff_y = ($y2 - $y1)
 $mtt_x = ($Diff_x / 0.043) // 0.043 - скорость персонажа пиксель/миллисекунда, высчитана вручную
 $mtt_y = ($Diff_y / 0.043)
 $mtt_x = round($mtt_x, 0)
 $mtt_y = round($mtt_y, 0)
rDown($_xmouse, $_ymouse) // условия конкретной игры, для стабилизации скорости персонажа
If ($mtt_x < 0)
  $mtt_x = Abs($mtt_x)
    keyDown(#A)
waitms($mtt_x)
  keyup(#A)
else
  keyDown(#D)
 waitms($mtt_x)
  keyUp(#D)
End_IF

If ($mtt_y < 0)
  $mtt_y = Abs($mtt_y)
    keyDown(#W)
waitms($mtt_y)
  keyup(#W)
else
  keyDown(#S)
 waitms($mtt_y)
  keyUp(#S)
End_IF
waitms(276 + $S_CORR)
  lDown($_xmouse, $_ymouse)
waitms(36272 + $S_CORR)   // время добычи ресурса
  lUp($_xmouse, $_ymouse)
waitms(470 + $S_CORR)
rUp($_xmouse, $_ymouse)

По поводу If_Picture_In так и не смог полностью разобраться. Допустим, лежит картинка небольшого размера в папке и алгоритм её находит, но стоит мне открыть её средством для просмотра фотографий Windows и алгоритм уже её не находит, хотя размер этой картинки абсолютно не меняется на экране. Видимо, какие-то изменения всё же происходят с ней.

Всем большое спасибо за помощь. Приятная программа для простых людей :)

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Перемещение бота к цели при помощи WASD
« Reply #11 on: September 16, 2019, 02:53:09 PM »
Потому, что "средство для просмотра фотографий Windows" это шлак для домохозяек, для работы не годится, только для котиков  :).

Какой масштаб включен - неясно (а для поиска нужно 100%). При изменении масштаба или области видимости (а может и всегда) применяется какое-то своё сглаживание.
Короче, не подходит.

Используй любые нормальные просмотрщики XnView, IrfanViev. Да хоть Photoshop с Paint-ом. Любая, где есть полный контроль что мы выводим и как.