Урок 1 ( учим бота ездить не натыкаясь на стены и препятствия ).

Используем радар

Объект радар находится на боте, и при вызове функции ScanRadar(angle) (angle -абсолютный угол в градусах на который будет повернут радар при сканировании) радар сканирует уровень на 150 метров, возвращая результаты во встроенные переменные.
В переменных Obstacle и wall возвращаются расстояния до места пересечения луча радара с плоскостью препятствия прямо по курсу радара
Для остальных переменных (Frend, Enemy, BulletBonus, RocketBonus, RepairBonus) радар возвращает хендлы объектов в секторе +\- 10 градусов.

ScanRadar(CorpusYaw)              ;в переменной CorpusYaw у нас содержится текущий угол бота по оси У
If (obstacle>0) And (obstacle<400)
    turn_c=20                     ; наша переменная принимает значение если расстояние меньше 40 метров, назовем ее счетчик
    oba=ObsAngle                 ; в переменную oba запоминаем угол с этим препятствием относительно бота
    EndIf
;----------------------выполняем маневр
If turn_c>0         ; если счетчик больше 0
    turn_c=turn_c-1  ; уменьшаем счетчик
    TurnCorpus=oba   ;бот будет поворачиваться соответственно с углом между препятствием и ботом
EndIf
 
Move = 1  ; двигаем бота

Иногда все же бот утыкается в стенки и препятствия.


Используем переменные CollidedObstacle%

If CollidedObstacle% <> 0 ; если есть столкновение
  If (turn_b1 = 0) And (turn_b2 = 0)                   ; если маневр еще не начат
    turn_b1 = 60                                    ; включаем первый счетчик маневра
  EndIf
EndIf


Выполняем маневр: отъехать назад, повернуть вправо, ехать вперед, поворачивая влево.

Для этого используем две переменные для наглядности:
- переменная turn_b1 отвечает за первые две фазы: ехать назад и поворачивать вправо.
- после того, как как вторая фаза заканчивается, используем вторую переменную turn_b2, которая отвечает за третью фазу : ехать вперед, поворачивая влево.

If turn_b1 > 0                                    ; если счетчик включен
   turn_b1 = turn_b1 - 1
   If turn_b1 = 0                                 ; если счетчик отработал
      turn_b2 = 50                                ; запускаем второй счетчик
   EndIf
Move = -1                                         ;двигаем бота назад
  If turn_b1 < 40                                 ; если счетчик меньше 40
   TurnCorpus = -1                                ; поворачиваем влево
  EndIf
EndIf
 
If turn_b2 > 0                                    ;если второй счетчик включен
   turn_b2 = turn_b2 - 1
   Move = 1                                       ;двигаем бота вперед
   TurnCorpus = 1                                 ;поворачиваем вправо
EndIf


Исходный код

Естественно данный код не совершенен и требует корректировки. Но главное - он работает :)

ScanRadar(CorpusYaw)              ;в переменной CorpusYaw у нас содержится текущий угол бота по оси У
If (obstacle>0) And (obstacle<400)
    turn_c=20                     ; наша переменная принимает значение если расстояние меньше 40 метров, назовем ее счетчик
    oba=ObsAngle                 ; в переменную oba запоминаем угол с этим препятствием относительно бота
    EndIf
;----------------------выполняем маневр
If turn_c>0         ; если счетчик больше 0
    turn_c=turn_c-1  ; уменьшаем счетчик
    TurnCorpus=oba   ;бот будет поворачиваться соответственно с углом между препятствием и ботом
EndIf
 
Move = 1  ; двигаем бота

If CollidedObstacle% <> 0 ; если есть столкновение
  If (turn_b1 = 0) And (turn_b2 = 0)                   ; если маневр еще не начат
    turn_b1 = 60                                    ; включаем первый счетчик маневра
  EndIf
EndIf

If turn_b1 > 0                                    ; если счетчик включен
   turn_b1 = turn_b1 - 1
   If turn_b1 = 0                                 ; если счетчик отработал
      turn_b2 = 50                                ; запускаем второй счетчик
   EndIf
Move = -1                                         ;двигаем бота назад
  If turn_b1 < 40                                 ; если счетчик меньше 40
   TurnCorpus = -1                                ; поворачиваем влево
  EndIf
EndIf
 
If turn_b2 > 0                                    ;если второй счетчик включен
   turn_b2 = turn_b2 - 1
   Move = 1                                       ;двигаем бота вперед
   TurnCorpus = 1                                 ;поворачиваем вправо
EndIf