Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Code_Game_Challenge.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
585.22 Кб
Скачать

2.4 Клиент Code Game Challenge

Вы можете запустить клиент Code Game Challenge, щелкнув по соответствующему ярлыку на рабочем столе вашего компьютера. Используйте выданные вам пароль и логин для авторизации в клиенте.

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

Для тестирования вашего кода вы должны использовать закладки Local Test или Global Test клиента.

Во время проведения тестирования можно управлять скоростью боя при помощи клавиш:

F1 – нормальная скорость;

F2 – удвоенная скорость;

F3 – четырёхкратная скорость;

F4 – восьмикратная скорость;

F6 – 32-кратная скорость;

F7 – 128-кратная скорость;

F8 – автоподстройка скорости;

[O] – вкл/выкл цвета команд;

[Tab] – таблица результатов.

2.5 Пример кода игрока:

С++

void MyPlayer::Init()

{

GetWorld()->SetOwnName("Example");

}

void MyPlayer::Move()

{

int i;

IWorld *World = GetWorld();

IControllablesArray OwnUnits = World->GetOwnUnits();

IUnitsArray Enemies = World->GetEnemies();

IProjectilesArray Projectiles = World->GetProjectiles();

IDebrisArray DebrisArray = World->GetDebris();

for(size_t i = 0; i < OwnUnits.size(); i++)

{

if(OwnUnits[i]->GetType() == SHIP_Earthling)

{

if(Enemies.size() > 0)

{

OwnUnits[i]->TurnTo(Enemies[0]);

OwnUnits[i]->SpeedUp(100);

if(OwnUnits[i]->GetDistanceTo(Enemies[0]) < 350)

{

OwnUnits[i]->UseSecondaryWeapon();

}

if(OwnUnits[i]->GetDistanceTo(Enemies[0) < 800)

{

OwnUnits[i]->UsePrimaryWeapon();

}

}

}

}

}

Интерфейсы программирования

Классы

Class IPlayer

Абстрактный класс игрока. Участникам необходимо реализовать класс-наследник, определяющего методы init() и move()

Методы:

  • IWorld* GetWorld()

Возвращает объект IWorld для получения информации о игровом окружении. Служит для получения своих и чужих юнитов, снарядов, астероидов в игровом мире.

  • void Init()

Абстрактный метод инициализации. Этот метод должен быть переопределен в классе-наследнике. Имеет ограничение на время исполнения

  • void Move()

Абстрактный метод для совершения хода. Вызывается на каждом такте симуляции. Этот метод должен быть переопределен в классе-наследнике. Игрок манипулирует юнитами в этом методе, используя объект IDrivable/IHarvester. Также, игрок получает информацию об игровом окружении используя объект IWorld. Имеет ограничение на время исполнения

  • void SelectWarpUnit ()

Абстрактный метод для совершения выбора корабля. Вызывается, если игрок потерял все корабли/юниты. Для выбора корабля служит метод WarpShip класса IWorld. Игрок может пропустить такт, не выбирая корабль. Количество пропускаемых тактов ограничено 16ю попытками. После исчерпания всех попыток, этот метод перестает вызываться и игрок не сможет вызвать корабль на поле боя до окончания раунда.

Структуры

Class Vec2

Двумерный вектор с переопределенными операторами сложения, вычитания и умножения.

Методы:

  • float Magnitude ()

Возвращает длину вектора.

Интерфейсы

Интерфейс IObject

Этот интерфейс описывает некоторый объект в игровом мире. Объект характеризуется положением, направлением, скоростью, размером, массой, состоянием и номером команды. В этом интерфейсе находятся вспомогательные методы для вычисления расстояний и углов между объектами.

Методы:

  • float GetAverageRadius()

Возвращает радиус объекта.

  • Vec2 GetPosition()

Возвращает координаты объекта.

  • Vec2 GetVelocity()

Возвращает скорость движения объекта объекта.

  • float GetAngle()

Возвращает угол поворота объекта. Предполагается, что у объекта есть некоторое фронтальное направление.

  • float GetAngleTo(Vec2 pos)

Возвращает относительный угол в радианах, до точки заданной вектором pos. Угол отсчитывается относительно текущего фронтального направления объекта.

  • float GetAngleTo(float x, float y)

Возвращает относительный угол в радианах, до точки (x,y). Угол отсчитывается относительно текущего фронтального направления объекта.

  • float GetAngleTo(IObject *obj)

Возвращает относительный угол в радианах, до указанного объекта. Угол отсчитывается относительно текущего фронтального направления объекта.

  • float GetDistanceTo(Vec2 pos)

Возвращает расстояние от центра объекта до точки, заданной вектором pos.

  • float GetDistanceTo(float x, float y)

Возвращает расстояние от центра объекта до точки (x,y).

  • float GetDistanceTo(IObject *object)

Возвращает расстояние от центра объекта до указанного объекта.

  • int GetState()

Возвращает комбинацию флагов состояния объекта. Подбробнее см. флаги состояния.

  • int GetTeam()

Возвращает номер команды объекта. Применимо к юнитам и снарядам.

  • float GetHealth()

Возвращает запас прочности объекта/численность экипажа корабля.

  • float GetMass()

Возвращает массу объекта.

Интерфейс IProjectile

Этот интерфейс описывает снаряды.

Методы:

  • float GetRemaininLife()

Возвращает количество тактов, через которое снаряд исчезнет

  • float GetDamage()

Возвращает запас урона снаряда.

Интерфейс IDebris

Этот интерфейс описывает планеты и астероиды.

Методы:

  • DebrisType GetType()

Возвращает тип объекта – астероид или планета.

Интерфейс IUnit

Этот интерфейс описывает юнит. Он содержит методы для получения запаса энергии, численности экипажа/запас прочности кораблей, максимального ускорения и максимальной угловой и линейной скорости.

Методы:

  • float GetEnergy()

Возвращает запас энергии у корабля.

  • UnitType GetType()

Возвращает тип корабля. (подробнее см. Типы кораблей)

  • float GetMaximumTurnRate()

Возвращает максимальную угловую скорость корабля.

  • float GetMinimumTurnRate()

Возвращает минимальную угловую скорость корабля. (Для большинства кораблей = 0. Особый случай – Slylandro Probe).

  • float GetMaximumAcceleration()

Возвращает максимальное ускорение корабля.

  • float GetMaximumVelocity()

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

Интерфейс IControllable

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

Методы:

  • void SpeedUp(float dS)

Устанавливает желаемое изменение скорости

  • void Turn(float dA)

Устанавливает желаемый угол поворота.

  • void TurnTo(Vec2 pos)

Устанавливает желаемый угол поворота так, чтобы юнит был повернут к точке, заданной вектором pos.

  • void TurnTo(IObject *object)

Устанавливает желаемый угол поворота так, чтобы юнит был повернут к указанному объекту.

  • void TurnTo(float x, float y)

Устанавливает желаемый угол поворота так, чтобы юнит был повернут к точке (x,y).

  • void UsePrimaryWeapon()

Устанавливает желание выстрелить из основного орудия.

  • void UsePrimaryWeapon(Vec2 dir)

Устанавливает желание выстрелить из основного орудия по заданному направлению (для некоторых кораблей).

  • void UseSecondaryWeapon()

Устанавливает желание использовать дополнительное орудие.

  • void UseSecondaryWeapon(Vec2 dir)

Устанавливает желание использовать дополнительное орудие по заданному направлению (для некоторых кораблей, например: Chmmr Avater с своим транспортным лучом, Earthling Cruiser с системой лазерной защиты)

  • void UseWeapon(int index, Vec2 dir)

Устанавливает желание выстрелить из орудия под номером index, по направлению dir.

  • IProjectile* GetCurrentProjectile(void)

Возвращает текущий снаряд, для некоторых кораблей. (Например: мина, которую запускает Kohr-Ah Marauder)

  • void say(const char *text)

Этот метод служит для вывода на экран сообщения. Можно использовать для отладки.

Интерфейс IWorld

Этот интерфейс поставляет информацию о игровом мире. Интерфейс содержит методы для получения информации о своих войсках, противниках, выпущенных снарядах, размере мира и времени, прошедшем с начала раунда. Так же с помощью этого интерфейса можно вызвать корабль и узнать его цену.

Методы:

  • IUnitsArray& GetEnemies()

Возвращает массив кораблей врагов. Враги располагаются в массиве в случайном порядке. Используя методы классов IUnit и IObject можно получить подробную информацию о каждом враге.

  • IDebrisArray& GetDebris()

Возвращает массив астероидов и планет. Используя методы классов IDebris и IObject можно получить подробную информацию о каждом астероиде или планете.

  • IProjectilesArray& GetProjectiles()

Возвращает массив снарядов, выпущенных, но еще не взорвавшихся. Снаряды располагаются в массиве в случайном порядке. Используя методы классов IProjectile и IObject можно получить подробную информацию о каждом снаряде.

  • IControllablesArray& GetOwnUnits()

Возвращает массив собственных юнитов. Юниты располагаются в массиве в случайном порядке. Используя методы классов IObject и IUnit можно получить подробную информацию о каждом юните. С помощью методов класса IControllable можно управлять ими.

  • float GetWidth()

Возвращает ширину игрового поля. Это значение константно и не зависит от выбранного разрешения экрана

  • float GetHeight()

Возвращает высоту игрового поля. Это значение константно и не зависит от выбранного разрешения экрана

  • int GetTick()

Возвращает количество тактов, прошедших с начала игры. В момент инициализации (Player::Init) этот метод возвратит 0. Во время первого хода (первый вызов Player::Move) он возвратит 1 и т.д.

  • void SetSelfName(char *name)

Этот метод служит для установки названия команды. Задание имени возможно только в MyPlayer::Init.

  • int GetCreditsNum()

Возвращает количество кредитов, оставшихся у команды.

  • void WarpShip(UnitType type)

Устанавливает желание вызвать корабль на поле боя. На это тратится соответственное количество кредитов, если у игрока достаточно «денег» на покупку. (см. метод IWorld::GetShipCost). Вызов возможен только в MyPlayer::SelectWarpUnit.

  • int GetShipCost(UnitType type)

Возвращает стоимость корабля в кредитах.

Перечисления, константы

Перечисление UnitType

Это перечисление описывает типы юнитов. Возвращается методом IUnit::GetType().

enum UnitType

{

SHIP_KohrAh = 0,

SHIP_Earthling = 1,

SHIP_Chmmr = 2,

UNIT_ZapSat = 3,

SHIP_Slylandro = 8,

SHIP_Orz = 14,

UNIT_OrzIntruder = 15

};

Перечисление DebrisType

Это перечисление описывает типы космического мусора. Возвращается методом IDebris::GetType().

enum DebrisType

{

DEBRIS_Asteroid = 0,

DEBRIS_Planet = 1,

};

Флаги состояния

Комбинации этих флагов описывают состояние объекта. Объект может находится сразу в нескольких состояниях. Для того чтобы проверить, находится ли объект в каком-либо конкретном состоянии, нужно применить операцию «побитового и». Например: (Unit->GetState() & STATE_INVULENRABLE). Возвращается методом IObject::GetState().

  • STATE_NORMAL = 0

Объект находится в своём обычном состоянии, без каких-либо эффектов. Пример использования: Unit->GetState() == STATE_NORMAL

  • STATE_EMP = 1

В объект попал EMP-снаряд. Если это корабль, то у него отключается управление поворотным двигателем и вторичное оружие. На другие типы объектов не действует.

  • STATE_INVULENRABLE = 2

Объект неуязвим (Например: планета). Пример использования: Debris->GetState() & STATE_INVULENRABLE

  • STATE_KINETIC = 4

На объект не действуют силы притяжения.

  • STATE_NOCOLLISION = 8

Объект находится в другом измерении, и не может ни с чем взаимодействовать. В него невозможно попасть снарядом. (Пример: корабли находятся в этом состоянии, когда телепортируются на поле боя).

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]