OffTopic:
Старый пост:
Старый пост:
Предисловие :
Игра:
World Of Warplanets - Авиасимулятор от разработчиков WOT и соответственно на том-же движке что и танки.
Сложность состоит в том что есть очень много параметров которые нужно учитывать в полете - скорость, высота (барометрическая - ур моря и радиометрическая - реальная), ландшафт, объекты и т.д.
Из того что облегчает нам жизнь - самолет уже на старте имеет достаточную высоту и скорость, направление тоже можно не менять.
Задача:
Минимум - поднимаемся еще чуть выше чем все, если долетим до базы живыми бомбим, стреляем или врезамся в обьекты, чтобы получить профит.
Средняя - минимум + небольшое маневрирование от атак самолетов, точное прицеливание бомб\ракет\пулеметов на обьекты, выжить летая по краям карты.
Максимум - Средняя + стрельба по самолетам после бомбежки обстрела зданий или если во время бомбежки нас кто-то атакует.
Ход выполнения:
Работаю уже в течении месяца небольшими шагами.
Первую неделю потратил на поиск статического указателя, который так и не был найден на параметры самолета (4-5 ур. дл 8192 смещения).
На UOPilot написал поиск макс, мин значений высоты\скорости - что как в итоге оказалось по геймплею не особо нужно было, нашел стрелочку указывающую на текущее положение скорости и высоты, определил ее уникальные цвета и точную область поиска этого пикселя, изменение положения GUI в зависимости от разрешения.
Положение на карте - текущее мое, врагов, союзников, обьектов.
Ну и пока все, дальше я нашел уже написанный очень небольшой и не работающий скрипт, но в котором были заложены небольшие основы, а самое главное показано что можно изменить GUI на свой - чем упростить задачу поиска многих ВАЖНЫХ вещей - чем собственно сейчас и занимаюсь + изучение нюансов синтаксиса нового языка.
Теперь по пунктам:
-1)Переписать то что уже написано на новый язык, исправить и разобрать уже написанный не работающий скрипт.
0)Сам полет, в зависимости от разрешение вычислять кол-во пикселей для смещения указателя в нужную сторону, использование "форсажа"(ускорения) и "0й тяги"(тормоза).
1)Определение статических обьектов (после захвата цели и на достаточном расстоянии появляются желтые квадратики) для атаки разными типами оружия. Можно для начала врезатся в него, главное определить по картинке\цвету сам обьект.
2)Определение "Опасной высоты", "опасного крена", "низкой скорости" и др. чтобы избежать падения, хотя бы симулировать попытки выжить.
3)Определение направления нашего движения (тоненькая прямая на карте от носа самолета - стрелочки на карте).
4)Маневрирование от самолетов - небольшие повороты влево\право или вверх\вниз.
5)Маневрирование к самолетам, а лучше дальше заняться уже написанием собственного GUI.
Возможно все эти пункты выполнять в почти в любом порядке - главное это хорошо написанные отдельные функции для всех этих пунктов.
Сейчас изучаю особенности синтаксиса и новые возможности языка.
Скриншоты:
скрипт любезно предоставленный "DIMONPC2010":
П.С. Сильно не пинайте, если что - пишите я все поправлю.
Я программист Delphi\C++ после начала кризиса и сокращения фрилансер-программист VBA\VBS, специализируюсь на автоматизации Excel, Windows, Internet процессов т.е. парсинг, структуризация данных, автоматизация расчетов, залитие данных в интернет, какие-то смешаные парсинг+структуризация+отправка на почту и это все по таймеру и с параметрами и т.д. Но отдыхать, сбрасывать стресс нужно и делаем мы это чаще в играх.
Игра:
World Of Warplanets - Авиасимулятор от разработчиков WOT и соответственно на том-же движке что и танки.
Сложность состоит в том что есть очень много параметров которые нужно учитывать в полете - скорость, высота (барометрическая - ур моря и радиометрическая - реальная), ландшафт, объекты и т.д.
Из того что облегчает нам жизнь - самолет уже на старте имеет достаточную высоту и скорость, направление тоже можно не менять.
Задача:
Минимум - поднимаемся еще чуть выше чем все, если долетим до базы живыми бомбим, стреляем или врезамся в обьекты, чтобы получить профит.
Средняя - минимум + небольшое маневрирование от атак самолетов, точное прицеливание бомб\ракет\пулеметов на обьекты, выжить летая по краям карты.
Максимум - Средняя + стрельба по самолетам после бомбежки обстрела зданий или если во время бомбежки нас кто-то атакует.
Ход выполнения:
Работаю уже в течении месяца небольшими шагами.
Первую неделю потратил на поиск статического указателя, который так и не был найден на параметры самолета (4-5 ур. дл 8192 смещения).
На UOPilot написал поиск макс, мин значений высоты\скорости - что как в итоге оказалось по геймплею не особо нужно было, нашел стрелочку указывающую на текущее положение скорости и высоты, определил ее уникальные цвета и точную область поиска этого пикселя, изменение положения GUI в зависимости от разрешения.
Положение на карте - текущее мое, врагов, союзников, обьектов.
Ну и пока все, дальше я нашел уже написанный очень небольшой и не работающий скрипт, но в котором были заложены небольшие основы, а самое главное показано что можно изменить GUI на свой - чем упростить задачу поиска многих ВАЖНЫХ вещей - чем собственно сейчас и занимаюсь + изучение нюансов синтаксиса нового языка.
Теперь по пунктам:
-1)Переписать то что уже написано на новый язык, исправить и разобрать уже написанный не работающий скрипт.
0)Сам полет, в зависимости от разрешение вычислять кол-во пикселей для смещения указателя в нужную сторону, использование "форсажа"(ускорения) и "0й тяги"(тормоза).
1)Определение статических обьектов (после захвата цели и на достаточном расстоянии появляются желтые квадратики) для атаки разными типами оружия. Можно для начала врезатся в него, главное определить по картинке\цвету сам обьект.
2)Определение "Опасной высоты", "опасного крена", "низкой скорости" и др. чтобы избежать падения, хотя бы симулировать попытки выжить.
3)Определение направления нашего движения (тоненькая прямая на карте от носа самолета - стрелочки на карте).
4)Маневрирование от самолетов - небольшие повороты влево\право или вверх\вниз.
5)Маневрирование к самолетам, а лучше дальше заняться уже написанием собственного GUI.
Возможно все эти пункты выполнять в почти в любом порядке - главное это хорошо написанные отдельные функции для всех этих пунктов.
Сейчас изучаю особенности синтаксиса и новые возможности языка.
Скриншоты:
скрипт любезно предоставленный "DIMONPC2010":
Код:
#include <Misc.au3>
;Функци для наведени прицела на нужный цвет
Func MouseMove_for_color($x,$y,$Window_posX,$Window_posY,$Window_width,$Window_height)
$aPos = MouseGetPos()
$MidleX=$Window_posX+($Window_width/2)
$MidleY=$Window_posY+(($Window_height-38)/2)+30
$toX = $x - $MidleX
$toY = $y - $MidleY
$aX = ( 100 / ($Window_width-16) ) * $toX
$aY = ( 100 / ($Window_height-38) ) * $toY
$dX=( 192 / 360 ) * $aX
$dY=( 108 / 360 ) * $aY
$X=$aPos[0]+$dX
$Y=$aPos[1]+$dY
MouseMove($X,$Y ,100);192,108
EndFunc
$aWinPos = WinGetPos("World of Warplanes"); 1.6.1
If @error Then
MsgBox(48, 'Error!', 'World of Warplanes не запущен!')
EndIf
$EndX=$aWinPos[0]+$aWinPos[2]
$EndY=$aWinPos[1]+$aWinPos[3]
$hWnd = WinGetHandle("World of Warplanes 1.6.1")
$Flag_Ground_attack=1
MsgBox(0, 'BOT', 'Для запуска нажмите "ОК" / Для остановки удерживайте "X"')
MsgBox(0, 'BOT', 'Наведите указатель на первый самолет и нажмите 1')
While 1
Sleep(1)
If _IsPressed("31") Then
$new_plane_1 = MouseGetPos()
ExitLoop
Else
EndIf
WEnd
MsgBox(0, 'BOT', 'Наведите указатель на второй самолет и нажмите 2')
While 1
Sleep(1)
If _IsPressed("32") Then
$new_plane_2 = MouseGetPos()
ExitLoop
Else
EndIf
WEnd
MsgBox(0, 'BOT', 'Наведите указатель на третий самолет и нажмите 3')
While 1
Sleep(1)
If _IsPressed("33") Then
$new_plane_3 = MouseGetPos()
ExitLoop
Else
EndIf
WEnd
$FLAG=1
;Sleep( 15000 )
While 1
If _IsPressed("58") Then
Exit
Else
EndIf
;Нажимаем В бой!
$GoX=(581+$aWinPos[0]+8)
$GoY=(570+$aWinPos[1]+30)
$GoXEnd=(706+$aWinPos[0]+8)
$GoYEnd=(615+$aWinPos[1]+30)
$GO = PixelSearch($GoX, $GoY, $GoXEnd, $GoYEnd, 0xB0370B, 1, 1, hWnd)
If Not @error Then
MouseMove(680+$aWinPos[0]+8,595+$aWinPos[1]+30 ,100)
MouseClick("left")
MouseMove($aWinPos[0]+($aWinPos[2]/2),$aWinPos[1]+(($aWinPos[3]-38)/2)+30-5 ,100)
Else
;Очередь самолетов
$GO = PixelSearch($GoX, $GoY, $GoXEnd, $GoYEnd, 0x828282, 1, 1, hWnd)
If Not @error Then
If $FLAG=1 Then
MouseMove($new_plane_1[0],$new_plane_1[1],100)
MouseClick("left")
$FLAG=2
Else
EndIf
If $FLAG=2 Then
MouseMove($new_plane_2[0],$new_plane_2[1],100)
MouseClick("left")
$FLAG=3
Else
EndIf
If $FLAG=3 Then
MouseMove($new_plane_3[0],$new_plane_3[1],100)
MouseClick("left")
$FLAG=1
Else
EndIf
EndIf
;Ждем начало боя, установка начального направления полета
$StartBattle = PixelSearch((1055+$aWinPos[0]+8), (125+$aWinPos[1]+30), (1189+$aWinPos[0]+8), (179+$aWinPos[1]+30), 0x75E100, 5, 1, hWnd)
If Not @error Then
Sleep( 70000 )
$NewPos0=MouseGetPos()
$rand0=Random(0, 2, 1)
If $rand0>1 Then
MouseMove($NewPos0[0]+20,$NewPos0[1]-3 ,100)
Sleep( 3500 )
Else
EndIf
If $rand0<1 Then
MouseMove($NewPos0[0]-20,$NewPos0[1]-3 ,100)
Sleep( 3000 )
Else
EndIf
Sleep( 3000 )
Else
EndIf
;Выход из боя если самолет сбили
$GoAway = PixelSearch((654+$aWinPos[0]), (600+$aWinPos[1]), (685+$aWinPos[0]), (631+$aWinPos[1]), 0xFFFF00, 5, 1, hWnd)
If Not @error Then
Send("{ESC}")
Sleep(100)
MouseMove(633+$aWinPos[0]+8,319+$aWinPos[1]+30 ,10)
Sleep(100)
MouseClick("left")
Sleep(100)
MouseMove(637+$aWinPos[0]+8,421+$aWinPos[1]+30 ,10)
Sleep(100)
MouseClick("left")
Sleep(5000)
Else
EndIf
;Если самолет выжил то закрываем результаты боя
$CloseRes = PixelSearch($GoX, $GoY, $GoXEnd, $GoYEnd, 0x0E1318, 1, 1, hWnd)
If Not @error Then
Send("{ESC}")
Else
EndIf
;Реагируем если по нам стреляют
$Damage = PixelSearch((531+$aWinPos[0]), (274+$aWinPos[1]), (783+$aWinPos[0]), (573+$aWinPos[1]), 0xFF0000, 10, 1, hWnd)
If Not @error Then
MouseMove_for_color($Damage[0]+5,$Damage[1],$aWinPos[0],$aWinPos[1],$aWinPos[2],$aWinPos[3])
Else
EndIf
;Стреляем если видим синий цвет
$coord = PixelSearch(($aWinPos[0]), ($aWinPos[1]), ($EndX), ($EndY), 0x0000FF, 10, 10, hWnd)
If Not @error Then
MouseMove_for_color($coord[0],$coord[1],$aWinPos[0],$aWinPos[1],$aWinPos[2],$aWinPos[3])
Sleep ( 500 )
MouseDown("left")
Else
MouseUp("left")
;Если не стреляем то чего нибуть делаем
$NewPos=MouseGetPos()
$rand=Random(0, 2, 1)
If $rand>1 Then
MouseMove($NewPos[0]+10,$NewPos[1], 100)
Sleep( 100 )
MouseMove($NewPos[0]+10,$NewPos[1], 100)
Sleep( 100 )
Else
EndIf
If $rand<1 Then
MouseMove($NewPos[0]-10,$NewPos[1], 100)
Sleep( 100 )
MouseMove($NewPos[0]-10,$NewPos[1], 100)
Sleep( 100 )
Else
EndIf
Sleep( 300 )
EndIf
EndIf
WEnd
П.С. Сильно не пинайте, если что - пишите я все поправлю.
Как говорится: "Прогресс не стоит на месте" и мой код этому соответствует.
Прогресс написание бота: 75-80%.
Использовано: FastFind Библиотека для увеличения скорости поиска информации на экране, WinAPI для отображения Debug сообщений и отрисовки линий, сам AutoIt.
Работает
Авто Пилот: управляет рандомно самолетом - просто летает не врезаясь, не падая, пока не маневрирует от стрельбы (маневрирует но в 30%).Авто Стрельба: стреляет в нужный момент в точку упреждения, очередями (избегает перегрева), стреляет в обьекты в нужный момент (работает не всегда правильно).
Авто Наводка: Наводит прицел на точку упреждения, на строения или самолет (под маркер обьекта) очень хорошо гоняется за самолетом, если нашел точку упреждения (из проблем - часто переключается между обьектами).
При включении авто стрельбы и авто наводки - ведет себя как 9-10 летний школьник (очень агрессивен и часто переключается, пока не захватит цель) , но разбивается частенько.
Debug режим: отображает все что находит текущие значения вычисленных высоты, скорости, их пределов и др.
чего не хватает или "в планах"
GUI - очень сильно не хватает, хотя бы минимального, уже начинаю раздавать бота на тестирование и постоянно перезапускать EXE - не вариант, а были-бы кнопочки:"В бой", "Доиграй за меня", "Задать самолет", "Выбор тактики самолета" + небольшая информация (парочка Label`ов) и все.
Тактики: ну изначально конечно понятно что разные типы самолетов для разных целей предназначены, но нужна тактика не в общем смысле, а алгоритм т.е. нужна блок-схема действий в зависимости от:
1)Типа самолета
2)Количества Противников\Союзников
3)Активной Цели
4)Поставленной задачи или приоритетам (Самолеты\Наземные цели)
Все настолько надоело что сел и за ночь сделал вот такой GUI: