Лабораторные работы (2009) (rdo)

Посмотреть архив целиком

Московский Энергетический Институт (Технический Университет)
















Лабораторная работа № 2 по дисциплине:

Теория игр и исследование операций.

Тема: работа в системе РДО.










Выполнил: студент группы А-13-05 Шамаль П.Н.















13.05.09


Оглавление

Постановка задачи 2

Описание предметной области 2

Описание имитационной модели 5

Типы ресурсов 5

Ресурсы 6

Операции 6

Интерфейс 7

Объект прогона 8

Приложение 8

Константы. 9

Функции. 9

Объект кадра 11

Образцы операций. 12



  1. Постановка задачи


Реализовать в системе имитационного моделирования РДО следующую ситуацию: незаметное проникновение.



  1. Описание предметной области


Модель представляет собой пошаговую игру 2-х лиц: игрока и противника (в данном случае под противником подразумевается несколько(4) игровых сущностей); шаги чередуются, пока не достигнут конец игры. На каждом своем шаге сторона (игрок или противники) обязаны сделать ход (пропуск хода недопустим). Ход игрока осуществляется действиями пользователя (ввод с клавиатуры). Ход противника полностью находится под управлением ИИ. Задача игрока — незамеченным покинуть игровую зону, перейдя с одной стороны игрового поля на противоположную. Задача противников — помешать этому, обнаружить и нейтрализовать игрока.


Допустимы следующие действия игрока:

  • шаг вперед (клавиша «cтрелка влево»);

  • шаг назад (клавиша «стрелка вправо»;

  • шаг вправо (клавиша «стрелка вверх»);

  • шаг влево (клавиша «стрелка вниз»);

  • выбор цели (клавиша «Tab») и ее ликвидация (клавиша «Q», если цель находится в радиусе поражения.


Возможны следующие действия противников:

  • патрулирование - движение в противоположном игроку направление;

  • обнаружение игрока на близком расстояние — в этом случае немедленно следует уничтожение игрока и конец игры.

  • поднятие тревоги — противники заметили выстрел игрока и направляются к месту его вероятной дислокации.


Конец игры наступает в 2-х случаях: игрок благополучно покинул зону, игрок был обнаружен (следовательно уничтожен) противником.


Кадр из игры:




Пояснение: игрок приблизился слишком близко к одному из противников и был обнаружен. Игра окончена.

  1. Описание имитационной модели

      1. Типы ресурсов


Общее количество — 4.


Ресурс: сущность игрока.

$resource_type ClassPlayer : permanent

$parameters

// Координаты.

X : integer

Y : integer

// Состояние (ALIVE = 1, DEAD = 0).

Status : integer = 1

// Id выбранной цели. 0 - не выбрано.

Target : integer [0..4] = 0

$end


Ресурс: сущность противника.

$resource_type ClassEnemyUnit : permanent

$parameters

// Кооридинаты.

X : integer

Y : integer

// Идентификатор.

Id : integer

// Состояние (ALIVE = 1, DEAD = 0).

Status : integer = 1

IsSelected : (TRUE, FALSE) = FALSE

// Статус по отношению к игроку. (SEEK = 0, ALARM = 1, AIMING = 2)

TrgStatus : integer = 0

// Направление следования.

DirX : real

DirY : real

$end


Ресурс: состояние игры.

$resource_type ClassGameState : permanent

$parameters

// Ход 0 - игрока, 1 - противника, 2 - игра окончена.

Turn : integer [0..2]

// Был ли выстрел на шаге игрока.

WasShot : integer = 0

$end


Ресурс: таймер (необходим для непрерывного отображения анимации).

$resource_type ClassTimer : permanent

$parameters

CurTime : integer = 0

$end


      1. Ресурсы



Общее количество - 7.


Объект ресурса

Описание

ObjPlayer

Экземпляр игрока.

ObjEnemy1

ObjEnemy2

ObjEnemy3

ObjEnemy4

Экземпляры противников.

ObjGameState

Состояние игры.

ObjTimer

Таймер.


$resources

ObjPlayer : ClassPlayer 600 300 * *

ObjEnemy1 : ClassEnemyUnit 0 50 0 * * * 1 0

ObjEnemy2 : ClassEnemyUnit 100 200 1 * * * 1 0

ObjEnemy3 : ClassEnemyUnit 0 350 2 * * * 1 0

ObjEnemy4 : ClassEnemyUnit 50 500 3 * * * 1 0

ObjGame : ClassGameState 0 *

ObjTimer : ClassTimer *

$end


      1. Операции



Общее количество — 14.


Список операций:


Название операции

Назначение

OnTimer

Событие таймера.

GameFr

Начало кадра. Сброс состояний.

CheckPlayer

Проверка состояния игрока.

MovFwd

Движение игрока вперед.

MovBack

Движение игрока назад.

MovUp

Движение игрока вправо.

MovDown

Движение игрока влево.

SelTrg

Выбор цели.

Fire

Выстрел по выбранной цели.

PlrSpotted

Обнаружение игрока противником.

EnemyAlarm3

Реакция 3-х оставшихся противников на выстрел.

EnemyAlarm2

-//-

EnemyAlarm1

-//-

EnemyStep

Патрулирование.


$operations

OnTimer : ActionTimer

GameFr : ActionGameFrame

// Действия игрока.

CheckPlayer : ActionCheckPlayer

MovFwd : ActionMoveFwd 'LEFT'

MovBack : ActionMoveBack 'RIGHT'

MovUp : ActionMoveUp 'UP'

MovDown : ActionMoveDown 'DOWN'

SelTrg : ActionSelectTarget 'TAB'

Fire : ActionFire 'Q'


// Действия противников.

PlrSpotted : ActionPlayerSpotted

EnemyAlarm3 : ActionEnemyAlarm3

EnemyAlarm2 : ActionEnemyAlarm2

EnemyAlarm1 : ActionEnemyAlarm1

EnemyStep : ActionEnemyStep

$end


      1. Интерфейс


Использовано кадров — 1.

Изображений — 3.


Изображения


Маркер юнита.



Тип маркера

Цвет

Значение

Зеленый

Игрок

Желтый

Противник

Красный

Выбранная цель

      1. Объект прогона



// Имя модели (*.pat, *.rtp, *.fun и *.dpt)

Model_name = sneak


// Ресурсы (*.rss)

Resource_file = sneak


// Операции (*.opr)

// Одновременно в модели может присутствовать или файл *.opr или файл *.dpt, но не оба сразу

OprIev_file = sneak


// Собираемые показатели (*.pmd)

Statistic_file = sneak


// Результаты прогона (*.pmv), выводятся внизу экрана

Results_file = sneak


// Трассировка (*.trc)

// Если файл трассировки закомментировать, то отключится вся трассировка в модели

Trace_file = sneak


// Анимация (*.trc)

Frame_file = sneak

// Отображение анимации начинается с кадра Frame_number

Frame_number = 1


// Режим прогона, включить анимацию

Show_mode = Animation

// Скорость анимации. Чем больше значение, тем быстрее прогон

Show_rate = 10000.0


// Условие остановки модели. После Terminate_if можно указать любое логическое выражение

Terminate_if Time_now >= 10*60*60.0 //or ObjGame.Turn = 2



  1. Приложение


      1. Константы.


$constant

// Параметры игры.

FieldWidth : integer = 610

FieldHeight : integer = 610

DetectRange : integer = 60

ShootRange : integer = 150

AlarmRange : integer = 301

Step : integer = 32

// Направление противников по умолчанию.

DefDirX : real = 1

DefDirY : real = 0

ALIVE : integer = 1

DEAD : integer = 0

// Число противников.

NumEnemies : integer = 4

$end



      1. Функции.


// Проверка расстояния до цели (|(X,Y) - (TrgX,TrgY)| < Dist)

$function IsInRange : integer

$type = algorithmic

$parameters

X : integer

Y : integer

TrgX : integer

TrgY : integer

Dist : integer

$body

calculate_if sqrt( (TrgX-X)*(TrgX-X) + (TrgY-Y)*(TrgY-Y) ) <= Dist

IsInRange = 1

IsInRange = 0

$end


$function IsVisible : integer

$type = algorithmic

$parameters

TrgX : integer

TrgY : integer

$body

calculate_if IsInRange( TrgX, TrgY, ObjPlayer.X, ObjPlayer.Y, ShootRange ) = 1

IsVisible = 1

IsVisible = 0

$end


// Проверка видимости противников.

$function IsTrgVisible : integer

$type = algorithmic

$parameters

Trg : integer

$body

calculate_if Trg = 1 and ObjEnemy1.Status = ALIVE and IsVisible( ObjEnemy1.X, ObjEnemy1.Y ) = 1

IsTrgVisible = 1

calculate_if Trg = 2 and ObjEnemy2.Status = ALIVE and IsVisible( ObjEnemy2.X, ObjEnemy2.Y ) = 1

IsTrgVisible = 1

calculate_if Trg = 3 and ObjEnemy3.Status = ALIVE and IsVisible( ObjEnemy3.X, ObjEnemy3.Y ) = 1

IsTrgVisible = 1

calculate_if Trg = 4 and ObjEnemy4.Status = ALIVE and IsVisible( ObjEnemy4.X, ObjEnemy4.Y ) = 1

IsTrgVisible = 1

IsTrgVisible = 0

$end


$function NextEnt : integer

$type = algorithmic

$parameters

Cur : integer

Next : integer

$body

calculate_if Cur + Next > NumEnemies

NextEnt = 0

NextEnt = Cur + Next

$end


// Перебор доступных целей.

$function IterateTarget : integer

$type = algorithmic

$parameters

Id : integer

$body

calculate_if IsTrgVisible( NextEnt( Id, 0 ) ) = 1

IterateTarget = NextEnt( Id, 0 )

calculate_if IsTrgVisible( NextEnt( Id, 1 ) ) = 1

IterateTarget = NextEnt( Id, 1 )

calculate_if IsTrgVisible( NextEnt( Id, 2 ) ) = 1

IterateTarget = NextEnt( Id, 2 )

calculate_if IsTrgVisible( NextEnt( Id, 3 ) ) = 1

IterateTarget = NextEnt( Id, 3 )

IterateTarget = 0

$end


// Нормализация компоненты вектора (X / |(X,Y)|).

$function NormComponent : real

$type = algorithmic

$parameters

X : real

Y : real

$body

NormComponent = (X / sqrt( X*X + Y*Y ))

$end


// Проверка направления по X (зеркально отражаем от края или устанавливаем в default).

$function CheckDirX : real

$type = algorithmic

$parameters

X : real

Y : real

DirX : real

$body

calculate_if (X + Step*DirX > FieldWidth )

CheckDirX = 1

calculate_if (X + Step*DirX < 0) //or (X + Step*DirX > FieldWidth-Step)

CheckDirX = -DirX

CheckDirX = DirX

$end


// Проверка направления по Y (зеркально отражаем от края или устанавливаем в default).

$function CheckDirY : real

$type = algorithmic

$parameters

X : real

Y : real

DirY : real

$body

calculate_if (X + Step*DirY > FieldWidth)

CheckDirY = 0 // Reset the enemy.

calculate_if (Y + Step*DirY < 0) or (Y + Step*DirY > FieldHeight)

CheckDirY = -DirY

CheckDirY = DirY

$end



      1. Объект кадра


$frame GFrame

$back_picture = <0 0 200> 640 640

show

s_bmp [ObjPlayer.X, ObjPlayer.Y, 32, 32, player, playerm]

show_if ObjPlayer.Status = DEAD

text [10, 100, 300, 15, transparent, <255 255 255>, < 'You have been killed in action. Mission failed.' ]

show_if ObjPlayer.X < 0

text [10, 100, 300, 15, transparent, <255 255 255>, < 'Mission accomplished.' ]

show_if ObjPlayer.Target <> 1 and ObjEnemy1.Status = ALIVE

s_bmp [ObjEnemy1.X, ObjEnemy1.Y, 32, 32, enemy, enemym]

show_if ObjPlayer.Target = 1 and ObjEnemy1.Status = ALIVE

s_bmp [ObjEnemy1.X, ObjEnemy1.Y, 32, 32, hlight, hlightm]

show_if ObjPlayer.Target <> 2 and ObjEnemy2.Status = ALIVE

s_bmp [ObjEnemy2.X, ObjEnemy2.Y, 32, 32, enemy, enemym]

show_if ObjPlayer.Target = 2 and ObjEnemy2.Status = ALIVE

s_bmp [ObjEnemy2.X, ObjEnemy2.Y, 32, 32, hlight, hlightm]

show_if ObjPlayer.Target <> 3 and ObjEnemy3.Status = ALIVE

s_bmp [ObjEnemy3.X, ObjEnemy3.Y, 32, 32, enemy, enemym]

show_if ObjPlayer.Target = 3 and ObjEnemy3.Status = ALIVE

s_bmp [ObjEnemy3.X, ObjEnemy3.Y, 32, 32, hlight, hlightm]

show_if ObjPlayer.Target <> 4 and ObjEnemy4.Status = ALIVE

s_bmp [ObjEnemy4.X, ObjEnemy4.Y, 32, 32, enemy, enemym]

show_if ObjPlayer.Target = 4 and ObjEnemy4.Status = ALIVE

s_bmp [ObjEnemy4.X, ObjEnemy4.Y, 32, 32, hlight, hlightm]

$end



      1. Образцы операций.


// ------------------------------ Управление состоянием игры -----------------------------------


// Проверка состояния игры.

$pattern ActionTimer : irregular_event

$relevant_resources

thisTimer : ObjTimer keep

$time = 0.01

$body

thisTimer

convert_event

CurTime set Cond( Less(thisTimer.CurTime, 1000.0), thisTimer.CurTime + 1, 0 )

$end


// Начало каждого хода. Сброс per-step состояний и т.п.

$pattern ActionGameFrame : irregular_event

$relevant_resources

thePlayer : ObjPlayer keep

$time = 0.01

$body

thePlayer

convert_event

// Сброс цели.

Target set Cond( Equal( ObjGame.Turn, 1 ), 0, thePlayer.Target )

$end


// ---------------- Действия игрока. --------------------------


$pattern ActionCheckPlayer : rule

$relevant_resources

theGame : ClassGameState keep

$body

// Пользователь покинул зону. Игра окончена.

theGame

choice from

ObjPlayer.X < 0

first

convert_rule

Turn set 2

$end


// Движение вперед.

$pattern ActionMoveFwd : keyboard

$relevant_resources

thisPlayer : ClassPlayer keep NoChange

thisGame : ClassGameState keep NoChange

$time = 0.0

$body

thisPlayer

choice nocheck

convert_begin

X set thisPlayer.X - Step

thisGame

choice from thisGame.Turn = 0

convert_begin

Turn set 1

WasShot set 0

$end


// Движение назад.

$pattern ActionMoveBack : keyboard

$relevant_resources

thisPlayer : ClassPlayer keep NoChange

thisGame : ClassGameState keep NoChange

$time = 0.0

$body

thisPlayer

choice from

thisPlayer.X < FieldWidth

first

convert_begin

X set thisPlayer.X + Step

thisGame

choice from thisGame.Turn = 0

convert_begin

Turn set 1

WasShot set 0

$end


// Движение вправо.

$pattern ActionMoveUp : keyboard

$relevant_resources

thisPlayer : ClassPlayer keep NoChange

thisGame : ClassGameState keep NoChange

$time = 0.0

$body

thisPlayer

choice from

thisPlayer.Y > 0

first

convert_begin

Y set thisPlayer.Y - Step

thisGame

choice from thisGame.Turn = 0

convert_begin

Turn set 1

WasShot set 0

$end


// Движение влево.

$pattern ActionMoveDown : keyboard

$relevant_resources

thisPlayer : ClassPlayer keep NoChange

thisGame : ClassGameState keep NoChange

$time = 0.0

$body

thisPlayer

choice from thisPlayer.Y < FieldHeight

first

convert_begin

Y set thisPlayer.Y + Step

thisGame

choice from thisGame.Turn = 0

convert_begin

Turn set 1

WasShot set 0

$end


// Выбор цели.

$pattern ActionSelectTarget : keyboard

$relevant_resources

thisPlayer : ClassPlayer keep NoChange

$time = 0.0

$body

thisPlayer

choice nocheck

first

convert_begin

Target set IterateTarget( thisPlayer.Target + 1 )

$end


// Выстрел.

$pattern ActionFire : keyboard

$relevant_resources

thisPlayer : ClassPlayer keep NoChange

theEnemy1 : ClassEnemyUnit keep NoChange

theEnemy2 : ClassEnemyUnit keep NoChange

theEnemy3 : ClassEnemyUnit keep NoChange

theEnemy4 : ClassEnemyUnit keep NoChange

thisGame : ClassGameState keep NoChange

$time = 0.0

$body

thisPlayer

choice nocheck

convert_begin

theEnemy1

choice from

theEnemy1.Id = 0

first

convert_begin

Status set Cond( MyOr( Equal( theEnemy1.Status, DEAD ), Equal(ObjPlayer.Target, 1) ), DEAD, ALIVE )

theEnemy2

choice from

theEnemy2.Id = 1

first

convert_begin

Status set Cond( MyOr( Equal( theEnemy2.Status, DEAD), Equal(ObjPlayer.Target, 2) ), DEAD, ALIVE )

theEnemy3

choice from

theEnemy3.Id = 2

first

convert_begin

Status set Cond( MyOr( Equal( theEnemy3.Status, DEAD), Equal(ObjPlayer.Target, 3) ), DEAD, ALIVE )

theEnemy4

choice from

theEnemy4.Id = 3

first

convert_begin

Status set Cond( MyOr( Equal( theEnemy4.Status, DEAD), Equal(ObjPlayer.Target, 4) ), DEAD, ALIVE )

thisGame

choice from

ObjPlayer.Target <> 0 and

thisGame.Turn = 0

convert_begin

Turn set 1

WasShot set 1//ObjGame.NumActiveEnemies

/*NumActiveEnemies set Cond( NNot( Equal( ObjPlayer.Target, 0 ) ),

thisGame.NumActiveEnemies - 1,

thisGame.NumActiveEnemies )*/

$end


// ----------------- Действия противников. -------------------


// Обнаружение и уничтожение игрока. (Конец игры.)

$pattern ActionPlayerSpotted : rule

$relevant_resources

theEnemy1 : ClassEnemyUnit keep

thePlayer : ClassPlayer keep

theGame : ClassGameState keep

$body

theEnemy1

choice from

theEnemy1.Status = ALIVE and

IsInRange( theEnemy1.X, theEnemy1.Y, ObjPlayer.X, ObjPlayer.Y, DetectRange ) = 1

first

convert_rule

// Игрок раскрыт и будет немедленно уничтожен.

thePlayer

choice nocheck

convert_rule

Status set DEAD

theGame

choice nocheck

first

convert_rule

Turn set 2

$end


// Реакция 3 противников на выстрел поблизости.

$pattern ActionEnemyAlarm3 : rule

$relevant_resources

theEnemy1 : ClassEnemyUnit keep

theEnemy2 : ClassEnemyUnit keep

theEnemy3 : ClassEnemyUnit keep

theGame : ClassGameState keep

$body

theEnemy1

choice from

theEnemy1.Status = ALIVE and

ObjGame.Turn = 1 and

ObjGame.WasShot <> 0 and

IsInRange( theEnemy1.X, theEnemy1.Y, ObjPlayer.X, ObjPlayer.Y, AlarmRange ) = 1

first

convert_rule

// Выбираем направление на пользователя.

DirX set NormComponent( ObjPlayer.X - theEnemy1.X, ObjPlayer.Y - theEnemy1.Y )

DirY set NormComponent( ObjPlayer.Y - theEnemy1.Y, ObjPlayer.X - theEnemy1.X )

theEnemy2

choice from

theEnemy2.Status = ALIVE and

theEnemy2.Id <> theEnemy1.Id and

ObjGame.Turn = 1 and

ObjGame.WasShot <> 0 and

IsInRange( theEnemy2.X, theEnemy2.Y, ObjPlayer.X, ObjPlayer.Y, AlarmRange ) = 1

first

convert_rule

// Выбираем направление на пользователя.

DirX set NormComponent( ObjPlayer.X - theEnemy2.X, ObjPlayer.Y - theEnemy2.Y )

DirY set NormComponent( ObjPlayer.Y - theEnemy2.Y, ObjPlayer.X - theEnemy2.X )

theEnemy3

choice from

theEnemy3.Status = ALIVE and

theEnemy3.Id <> theEnemy1.Id and

theEnemy3.Id <> theEnemy2.Id and

ObjGame.Turn = 1 and

ObjGame.WasShot <> 0 and

IsInRange( theEnemy3.X, theEnemy3.Y, ObjPlayer.X, ObjPlayer.Y, AlarmRange ) = 1

first

convert_rule

// Направляемся на пользователя.

DirX set NormComponent( ObjPlayer.X - theEnemy3.X, ObjPlayer.Y - theEnemy3.Y )

DirY set NormComponent( ObjPlayer.Y - theEnemy3.Y, ObjPlayer.X - theEnemy3.X )

theGame

choice nocheck

first

convert_rule

WasShot set theGame.WasShot - 1

$end


// Реакция 2 противников на выстрел поблизости.

$pattern ActionEnemyAlarm2 : rule

$relevant_resources

theEnemy1 : ClassEnemyUnit keep

theEnemy2 : ClassEnemyUnit keep

theGame : ClassGameState keep

$body

theEnemy1

choice from

theEnemy1.Status = ALIVE and

ObjGame.Turn = 1 and

ObjGame.WasShot <> 0 and

IsInRange( theEnemy1.X, theEnemy1.Y, ObjPlayer.X, ObjPlayer.Y, AlarmRange ) = 1

first

convert_rule

// Выбираем направление на пользователя.

DirX set NormComponent( ObjPlayer.X - theEnemy1.X, ObjPlayer.Y - theEnemy1.Y )

DirY set NormComponent( ObjPlayer.Y - theEnemy1.Y, ObjPlayer.X - theEnemy1.X )

theEnemy2

choice from

theEnemy2.Status = ALIVE and

theEnemy2.Id <> theEnemy1.Id and

ObjGame.Turn = 1 and

ObjGame.WasShot <> 0 and

IsInRange( theEnemy2.X, theEnemy2.Y, ObjPlayer.X, ObjPlayer.Y, AlarmRange ) = 1

first

convert_rule

// Выбираем направление на пользователя.

DirX set NormComponent( ObjPlayer.X - theEnemy2.X, ObjPlayer.Y - theEnemy2.Y )

DirY set NormComponent( ObjPlayer.Y - theEnemy2.Y, ObjPlayer.X - theEnemy2.X )

theGame

choice nocheck

first

convert_rule

WasShot set theGame.WasShot - 1

$end


// Реакция 1 противника на выстрел поблизости.

$pattern ActionEnemyAlarm1 : rule

$relevant_resources

theEnemy1 : ClassEnemyUnit keep

theGame : ClassGameState keep

$body

theEnemy1

choice from

theEnemy1.Status = ALIVE and

ObjGame.Turn = 1 and

ObjGame.WasShot <> 0 and

IsInRange( theEnemy1.X, theEnemy1.Y, ObjPlayer.X, ObjPlayer.Y, AlarmRange ) = 1

first

convert_rule

// Выбираем направление на пользователя.

DirX set NormComponent( ObjPlayer.X - theEnemy1.X, ObjPlayer.Y - theEnemy1.Y )

DirY set NormComponent( ObjPlayer.Y - theEnemy1.Y, ObjPlayer.X - theEnemy1.X )

theGame

choice nocheck

first

convert_rule

WasShot set theGame.WasShot - 1

$end


// Стандартное поведение противника, когда цель не обнаружена.

$pattern ActionEnemyStep : rule

$relevant_resources

theEnemy1 : ClassEnemyUnit keep

theEnemy2 : ClassEnemyUnit keep

theEnemy3 : ClassEnemyUnit keep

theEnemy4 : ClassEnemyUnit keep

theGame : ClassGameState keep

$body

theEnemy1

choice from

theEnemy1.Id = 0 and

ObjGame.Turn = 1

first

convert_rule

// Меняем направление движение, если достигли края зоны.

DirX set CheckDirX( theEnemy1.X, theEnemy1.Y, theEnemy1.DirX )

DirY set CheckDirY( theEnemy1.X, theEnemy1.Y, theEnemy1.DirY )

// Переустанавливаем позицию на начало, если достигли правого конца зоны.

X set CondF( LessF(theEnemy1.X, FieldWidth), theEnemy1.X + Step*theEnemy1.DirX, 0 )

Y set theEnemy1.Y + Step*theEnemy1.DirY

// Аналогично:

theEnemy2

choice from

theEnemy2.Id = 1 and

ObjGame.Turn = 1

first

convert_rule

DirX set CheckDirX( theEnemy2.X, theEnemy2.Y, theEnemy2.DirX )

DirY set CheckDirY( theEnemy2.X, theEnemy2.Y, theEnemy2.DirY )

X set CondF( LessF(theEnemy2.X, FieldWidth), theEnemy2.X + Step*theEnemy2.DirX, 0 )

Y set theEnemy2.Y + Step*theEnemy2.DirY

theEnemy3

choice from

theEnemy3.Id = 2 and

ObjGame.Turn = 1

first

convert_rule

DirX set CheckDirX( theEnemy3.X, theEnemy3.Y, theEnemy3.DirX )

DirY set CheckDirY( theEnemy3.X, theEnemy3.Y, theEnemy3.DirY )

X set CondF( LessF(theEnemy3.X, FieldWidth), theEnemy3.X + Step*theEnemy3.DirX, 0 )

Y set theEnemy3.Y + Step*theEnemy3.DirY

theEnemy4

choice from

theEnemy4.Id = 3 and

ObjGame.Turn = 1

first

convert_rule

DirX set CheckDirX( theEnemy4.X, theEnemy4.Y, theEnemy4.DirX )

DirY set CheckDirY( theEnemy4.X, theEnemy4.Y, theEnemy4.DirY )

X set CondF( LessF(theEnemy4.X, FieldWidth), theEnemy4.X + Step*theEnemy4.DirX, 0 )

Y set theEnemy4.Y + Step*theEnemy4.DirY

theGame

choice from

theGame.Turn = 1

first

convert_rule

Turn set 0

$end


5


Случайные файлы

Файл
16343.rtf
22295-1.rtf
101648.rtf
12039.rtf
27103-1.rtf




Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.