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