Памятка участника турнира программ "Муравьи"


Содержание

Что к чему?
Наши и Ваши планы
Правила игры
Правила проведения турнира
Создание программы-муравья
Тестирование и отладка
Отправка программы-муравья
Возможные проблемы и чего стоит избегать
Вопросы и ответы

Что к чему?

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

Все муравьи живут в небольшом квадратном мире заданных размеров, окружённом стеной. По углам игрового мира расположены муравейники - Ваш, и Ваших соперников. Ваша программа-муравей будет использована для управления каждым муравьём Вашего муравейника. С рассветом муравьи выходят из муравейника и отправляются на работу - искать еду. Их задача проста: Им необходимо до заката перенести как можно больше разбросанной по игровому полю еды в свой муравейник. Вот, собственно, и всё!

Наши и Ваши планы

Этап обсуждения и планирования

С момента получения данной памятки для вас начинается этап обсуждения и планирования. Во время этого этапа вы можете подробнее ознакомиться с правилами игры, придумать алгоритм для Ваших муравьёв и спланировать этап кодирования.

Во время этого этапа вы можете обсуждать алгоритм, устройство Вашей программы и правила игры с кем угодно: со своей командой, со своими тренерами, с другими командами и другими тренерами и вообще со всеми, кто не будет этому сопротивляться. :-)

Этап кодирования

В конце этапа обсуждения и планирования вы будете допущены в компьютерные классы, в которых будет установлено необходимое программное обеспечение для создания Вашей программы-муравья. Это и будет начало этапа кодирования. Длительность - 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.

Delphi: Шаблон проекта и API

Шаблон проекта состоит из двух файлов: Файла проекта 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;
        

С++: Шаблон проекта и АPI

В шаблонный проект включено три файла: основной код в файле 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-элементами (окнами, диалогами и т.д.);

  • работать с внешними устройствами (принтером, звуковой картой и т.д.);

  • доступ и модификация любых зарезервированных или системных областей памяти;

  • любые другие действия, которые могут нарушить работу программного обеспечения соревнования;

Вопросы и ответы

1. Можно ли использовать глобальные переменные в библиотеке?
2. Как уменьшить скорость работы визуализатора?
3. Верно ли, что когда муравей появляется, в его памяти хранятся нули?
4. Если муравью задать команду aaPut, когда у него нет еды, то он просто в этот ход ничего не будет делать?
5. Могут ли муравьи передвигаться друг по другу?
1.

Можно ли использовать глобальные переменные в библиотеке?

Формально можно. Можете попытаться использовать на свой страх и риск.

2.

Как уменьшить скорость работы визуализатора?

Через меню "Вид\Медленнее" либо нажатием кнопки "Left".

3.

Верно ли, что когда муравей появляется, в его памяти хранятся нули?

Да.

4.

Если муравью задать команду aaPut, когда у него нет еды, то он просто в этот ход ничего не будет делать?

Да, ничего не будет делать. Аналогично, если на клетке с муравьём нет еды, а муравей совершает команду aaGet, также ничего не происходит.

5.

Могут ли муравьи передвигаться друг по другу?

Да.