Содержание
Турнир программ даёт Вам возможность посоревноваться в несколько иных навыках, нежели требуются для классических олимпиад по программированию. Вам предстоит помериться силами с самой эволюцией. Только в отличие от неё у вас времени будет заметно меньше нескольких миллионов лет... Как Вы, наверное, уже догадались, Вам предстоит разработать программу, управляющую муравьём.
Все муравьи живут в небольшом квадратном мире заданных размеров, окружённом стеной. По углам игрового мира расположены муравейники - Ваш, и Ваших соперников. Ваша программа-муравей будет использована для управления каждым муравьём Вашего муравейника. С рассветом муравьи выходят из муравейника и отправляются на работу - искать еду. Их задача проста: Им необходимо до заката перенести как можно больше разбросанной по игровому полю еды в свой муравейник. Вот, собственно, и всё!
С момента получения данной памятки для вас начинается этап обсуждения и планирования. Во время этого этапа вы можете подробнее ознакомиться с правилами игры, придумать алгоритм для Ваших муравьёв и спланировать этап кодирования.
Во время этого этапа вы можете обсуждать алгоритм, устройство Вашей программы и правила игры с кем угодно: со своей командой, со своими тренерами, с другими командами и другими тренерами и вообще со всеми, кто не будет этому сопротивляться. :-)
В конце этапа обсуждения и планирования вы будете допущены в компьютерные классы, в которых будет установлено необходимое программное обеспечение для создания Вашей программы-муравья. Это и будет начало этапа кодирования. Длительность - 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-элементами (окнами, диалогами и т.д.);
работать с внешними устройствами (принтером, звуковой картой и т.д.);
доступ и модификация любых зарезервированных или системных областей памяти;
любые другие действия, которые могут нарушить работу программного обеспечения соревнования;