Содержание
Турнир программ даёт Вам возможность посоревноваться в несколько иных навыках, нежели требуются для классических олимпиад по программированию. Вам предстоит помериться силами с самой эволюцией. Только в отличие от неё у вас времени будет заметно меньше нескольких миллионов лет... Как Вы, наверное, уже догадались, Вам предстоит разработать программу, управляющую муравьём.
Все муравьи живут в небольшом квадратном мире заданных размеров, окружённом стеной. По углам игрового мира расположены муравейники - Ваш, и Ваших соперников. Ваша программа-муравей будет использована для управления каждым муравьём Вашего муравейника. С рассветом муравьи выходят из муравейника и отправляются на работу - искать еду. Их задача проста: Им необходимо до заката перенести как можно больше разбросанной по игровому полю еды в свой муравейник. Вот, собственно, и всё!
С момента получения данной памятки для вас начинается этап обсуждения и планирования. Во время этого этапа вы можете подробнее ознакомиться с правилами игры, придумать алгоритм для Ваших муравьёв и спланировать этап кодирования.
Во время этого этапа вы можете обсуждать алгоритм, устройство Вашей программы и правила игры с кем угодно: со своей командой, со своими тренерами, с другими командами и другими тренерами и вообще со всеми, кто не будет этому сопротивляться. :-)
В конце этапа обсуждения и планирования вы будете допущены в компьютерные классы, в которых будет установлено необходимое программное обеспечение для создания Вашей программы-муравья. Это и будет начало этапа кодирования. Длительность - 3 часа.
Во время этого этапа запрещается разговаривать с кем-либо, кроме членов Вашей команды и людей из группы технической поддержки. Запрещается приносить и использовать любые ресурсы в электронном виде: тексты, программы, библиотеки и т.п.
Ваша задача - разработать, протестировать и отправить жюри вашу программу-муравья. Это можно будет сделать с использованием одной из сред программирования: Delphi 6, 7 и Visual Studio 6.0, 7.0.
В результате предыдущего этапа Ваша команда должна будет отправить жюри готовую программу-муравья. Если Ваша команда отправит программу-муравья несколько раз, то в турнире будет участвовать последняя отправленная версия.
После окончания этапа кодирования, в указанное в расписании чемпионата время, будет проводиться собственно сам турнир программ. Все желающие смогут следить за ходом турнира, а участники - ещё и болеть за свои программы!
Игровой мир представляет собой квадратную сетку некоторого размера, окружённую стеной. В каждой клетке может находиться произвольное количество муравьёв, а также лежать несколько миллиграммов еды. В начале игры еда некоторым особым образом распределена по игровому полю.
В начале игры, муравьи один за другим появляются на клетке своего муравейника.
У муравья есть набор сенсоров, которые позволяют ему определять следующую информацию для ближайших к нему 9 клеток:
isMyHill: является ли клетка своим муравейником
isEnemyHill: является ли клетка чужим муравейником
isFood: есть ли на клетке еда
isFriend: есть ли в клетке свои муравьи (отличные от того, кому принадлежит сенсор)
isEnemy: есть ли чужие муравьи
isWall: является ли клетка стеной, которой огорожен игровой мир
оттенок (smell) и интенсивность (smellIntensity) запаха, оставленного на клетке.
У каждого муравья есть память размером 32 байта, которую он может использовать как угодно. Кроме того, муравей всегда знает, есть ли у него в лапах еда.
Муравей за каждую единицу времени может сделать одно из следующих действий:
Передвинуться на одну из четырёх соседних ячеек.
Укусить другого муравья, находящегося на одной из четырёх соседних ячеек.
Если у муравья нет еды, то он может поднять один миллиграмм еды с той ячейки, где находится он сам.
Если у муравья есть еда, то он может положить её на ту же ячейку, где находится он сам.
Одновременно с этим муравей может пометить клетку, на которой находится некоторым запахом с интенсивностью 100 единиц. Помечивание запахом происходит до передвижения муравья. Старый запах клетки полностью перекрывается новым. В начале игры все клетки имеют интенсивность запаха равную 0.
Муравей, кусая в одну из сторон, обездвиживает на 8 ходов одного из находящихся там чужих муравьёв. Муравей, на которого придётся укус, всегда выбирается по такому алгоритму:
Если в клетке есть муравей, способный двигаться, то укус приходится на него. Если таких несколько, то выбирается произвольный из них.
Если способных двигаться муравьёв нет, то укус приходится на того, к которому способность двигаться вернётся раньше других.
Если в клетке, куда направлен укус, вообще нет муравьёв, то ни один муравей не обездвиживается.
Если у укушенного муравья была с собой еда, она падает на ту клетку, где находится укушенный муравей. Обездвиженному в результате укуса муравью управление не передаётся до тех пор, пока, к нему не вернётся способность двигаться.
В процессе игры ход по очереди передаётся каждому муравью в следующем порядке:
всем муравьям первого игрока в порядке появления муравьёв на игровом поле;
всем муравьям второго игрока в порядке появления муравьёв на игровом поле;
и так далее.
Состояние игры обновлеяется после каждого хода каждого муравья. Как только все муравьи совершили ход, считается, что прошла одна единица игрового времени.
У каждой ячейки может быть некоторый запах.
Запах характеризуется двумя неотрицательными числами: оттенком запаха (smell) и интенсивностью (smellIntensity).
За единицу времени интенсивность запаха всех ячеек (с интенсивностью запаха отличной от нуля) уменьшается на единицу.
Турнир будет проводиться в четыре этапа: квалификация, отборочные игры, полуфинал и финал, каждый по своим правилам:
Квалификация. В ходе квалификации каждый игрок сыграет ровно одну игру, в которой будет единственным участником. По результатам квалификации участники упорядочиваются по количеству собранной еды и несколько лучших участников проходят на следующий этап турнира. Количество еды, собранное командой за игру - это количество еды, находящееся на клетке муравейника в момент окончания игры.
Количество игроков в игре: 1
Размер поля: 21 х 21
Количество муравьёв у одного игрока: 10
Длительность игры: 500
Отборочные игры. Этап отборочных игр - это серия игр на выбывание. В каждой игре участвует 4 игрока, двое лучших из которых проходят дальше, а двое худших выбывают из турнира.
В конце отборочных игр в турнире остаётся 4 игрока.
Количество игроков в игре: 4
Размер поля: 41 х 41
Количество муравьёв у одного игрока: 20
Длительность игры: 600
Полуфинал и финал. В двух полуфинальных играх и одной финальной игры определятся победители турнира.
Количество игроков в игре: 2
Размер поля: 41 х 41
Количество муравьёв у одного игрока: 20
Длительность игры: 2000
Алгоритм поведения одного муравья реализуется в программе-муравье. Эта программа используется для управления всеми муравьями одного муравейника.
Программа-муравей представляет собой dll-библиотеку, в которой содержатся две следующие функции:
GetName - возвращает имя игрока.
Эта функция должна всегда возвращать одно и то же значение.
GetAction - возвращает очередной ход муравья.
В качестве параметров в эту функцию передаётся информация с органов,
а также содержимое памяти муравья.
Алгоритм должен быть достаточно прост, так как на работу этой функции отводится ~0.01 секунды времени.
Жюри оставляет за собой право дисквалифицировать программы, нарушающие это ограничение.
Библиотека игрока загружается в память в начале игры и выгружается в конце игры.
На каждый ход каждого муравья вызывается функция GetAction, в которую передаётся информация
с органов чувств и содержимое памяти текущего муравья.
Для создания программы-муравья всем командам предоставляются шаблоны проектов, которые уже представляют собой корректные программы. Вам необходимо будет только подкорректировать код соответствующих функций, чтобы они работали в соответствии с Вашей задумкой.
Шаблоны находятся на диске X:\Ants\templates.
Шаблон проекта состоит из двух файлов: Файла проекта DelphiSample.dpr и модуля Ants.pas.
Все свои изменения нужно вносить исключительно в файл проекта.
Модуль Ants.pas менять не рекомендуется, потому что жюри со своей стороны будет компилировать
ваш проект с модулем Ants.pas в его первоначальном виде.
Чтобы создать программу-муравья Вам следует сделать два действия:
Изменить значение константы PLAYER_NAME на название вашей программы.
PLAYER_NAME = 'DelphiSample';
Написать тело процедуры GetAction так, чтобы она реализовывала вашу задумку.
procedure GetAction(sensors: TSensors; hasFood: Boolean; memory: PMemory; var result: TAntAction); stdcall;
Далее приводятся определения и описания всех необходимых типов.
const
MAX_MEMORY = 32; // Размер памяти вашего муравья
type
// Все возможные действия муравья
TAntActionType = (
aaMoveUp, aaMoveLeft, aaMoveDown, aaMoveRight, // передвижение
aaBiteUp, aaBiteLeft, aaBiteDown, aaBiteRight, // кусание
aaGet, aaPut); // манипуляция с едой
// Показания органа чувств муравья.
// Орган чувств возвращает информацию об одной клетке игрового поля
TAntSensor = record
smell: Integer; // оттенок запаха
smellIntensity: Integer; // интенсивность запаха
isFriend: Boolean; // наличие "своего" муравья
isEnemy: Boolean; // наличие "чужого" муравья
isMyHill: Boolean; // наличие "своего" муравейника
isEnemyHill: Boolean; // наличие "своего" муравейника
isFood: Boolean; // наличие еды
isWall: Boolean; // наличие стены
end;
// Действие муравья на текущем ходу
TAntAction = record
actionType: TAntActionType; // передвижение, кусание или манипуляция с едой
putSmell: Boolean; // оставить ли запах на клетке
smell: Integer; // оттенок оставляемого муравьём запаха
end;
// Показания всех сенсоров муравья для ближайших 9 клеток к муравью.
// sensors[-1, -1] - информация о левой верхней соседней клетке
// sensors[1, -1] - информация о правой верхней соседней клетке
// sensors[1, 1] - информация о правой нижней соседней клетке
// и т.д.
TSensors = array[-1..1, -1..1] of TAntSensor;
// Память муравья
PMemory = ^TMemory;
TMemory = array[0..MAX_MEMORY-1] of Byte;
В шаблонный проект включено три файла: основной код в файле main.cpp, заголовочный файл Ants.h и
файл описания модуля lib.def.
Все свои изменения нужно вносить исключительно в файл main.cpp.
Остальные файлы менять не рекомендуется, потому что жюри со своей стороны будет компилировать
ваш проект с этими файлами в их первоначальном виде.
Чтобы создать программу-муравья Вам следует сделать два действия:
Изменить значение константы PLAYER_NAME на название вашей программы.
#define PLAYER_NAME "CppSample"
Написать тело функции GetAntAction так, чтобы она реализовывала вашу задумку.
AntAction GetAntAction(AntSensor sensors[3][3], bool hasFood, char memory[MAX_MEMORY])
sensors - показания всех сенсоров муравья для ближайших 9 клеток к муравью.
sensors[0][0] - информация о левой верхней соседней клетке
sensors[2][0] - информация о правой верхней соседней клетке
sensors[2][2] - информация о правой нижней соседней клетке
sensors[1][1] - информация о клетке, в которой находится муравей
и т. д.
Далее приводятся определения и описания всех необходимых типов.
// Все возможные действия муравья
enum AntActionType{
// передвижение:
MOVE_UP = 0,
MOVE_LEFT = 1,
MOVE_DOWN = 2,
MOVE_RIGHT = 3,
// кусание:
BITE_UP = 4,
BITE_LEFT = 5,
BITE_DOWN = 6,
BITE_RIGHT = 7,
// манипуляция с едой:
GET = 8,
PUT = 9,
};
// Действие муравья на текущем ходу
struct AntAction
{
AntActionType actionType; // передвижение, кусание или манипуляция с едой
bool putSmell; // оставить ли запах на клетке
int smell; // оттенок оставляемого муравьём запаха
};
// Вспомогательная структура. Не использовать.
struct InteropAntAction ...
// Показания органа чувств муравья.
// Орган чувств возвращает информацию об одной клетке игрового поля
struct AntSensor{
int smell; // оттенок запаха
int smellIntensity; // интенсивность запаха
bool isFriend; // наличие "своего" муравья
bool isEnemy; // наличие "чужого" муравья
bool isMyHill; // наличие "своего" муравейника
bool isEnemyHill; // наличие "своего" муравейника
bool isFood; // наличие еды
bool isWall; // наличие стены
};
const int MAX_MEMORY = 32; // Размер памяти вашего муравья
// Вспомогательная функция. Не использовать.
void __stdcall GetAction(AntSensor sensors[3][3], bool hasFood, char memory[MAX_MEMORY], InteropAntAction* antAction) ...
В течение всего этапа кодирования у вас будет возможность протестировать и отладить свою программу.
На сетевом диске в директории X:\Ants\bin будет находиться оболочка игры TestRoom.exe,
с помощью которой можно устраивать игры с различными участниками.
Перед использованием необходимо скопировать всё содержимое директории X:\Ants\bin на свой локальный диск.
В поддиректории X:\Ants\bin\players находится несколько простых программ-муравьёв,
с которыми вы можете тестировать вашу собственную программу.
В конце этапа кодирования Вы должны будете отправить свою программу-муравья жюри. Для этого нужно использовать штатное программное обеспечение соревнования, где в качестве компилятора необходимо указывать один из двух вариантов, предназначенных для турнира программ.
Категорически не рекомендуется изменять файлы шаблонных проектов, кроме тех, о которых было написано выше.
При написании программы-игрока запрещено:любое использование сетевых средств;
любая работа с файловой системой;
любые попытки намеренно вывести из строя систему проведения турнира;
выполнение внешних программ и создание новых процессов;
изменение прав доступа файловой системы;
любая работа с консолью;
создавать и работать с любыми GUI-элементами (окнами, диалогами и т.д.);
работать с внешними устройствами (принтером, звуковой картой и т.д.);
доступ и модификация любых зарезервированных или системных областей памяти;
любые другие действия, которые могут нарушить работу программного обеспечения соревнования;