Как устроен мир
Весь мир представляет собой матрицу из клеточек. Каждая клеточка имеет характеристику, "трение" - это время, которое требуется на ее прохождение.
На карте есть два элемента - "собачка" и "цель". Игра заканчивается когда собачка достигает цели. Выходить за приделы поля не разрешается.
Цель игры - вывести собачку к цели за минимальное игровое время. Иными словами надо выбрать путь с наименьшим трением.
Что будем делать
Ваша задача написать компонент "щенок" который будет реализовывать алгоритм поиска оптимального пути.
Фактически вы будете писать класс, который будет иметь два метода
1) Initialize - для "инициализации" щенка, в этом методе "щенок" получит указатель на класс-карту.
2) GoNext - эта функция возвращает одно из девяти значений:
- Код: Выделить всё
NW N NE
W NOP E
SW S SE
Это значение указывает, соответсвенно, куда должен пойти щенок на этом ходу.
Если ваш класс возвращает недопустимое значение(например если он прикажет двигаться влево, в то время, как щенок находится у левого края поля), игра заканчивается поражением.
Время, которое требуется классу для "раздумий" вообще говоря не ограничевается, важно лишь найти наиболее оптимальный алгоритм.
Где храняться карты?
Карты храняться в XML-файлах, лежащих в папке с программой. Схема для этих xml лежит в той же папке.
Как запустить программу?
Программа запускается с такими параметрами:
- Код: Выделить всё
project1.exe class_name map_name
где class_name - имя(ProgID) класса c вашим "щенком", map_name - имя карты, без пути и разширения.
Например, "тестовый щенок" на карте map1 запускается так:
- Код: Выделить всё
project1.exe SamplePuppy.puppy map1
В конце игры программа показывает "время", которое потребовалось щенку для достижения цели.
Что может и знает щенок?
Для щенка доступен класс Enviroment с классом Island, который предоставляет следующую информацию:
1) Положение цели(свойства TargetX и TargetY)
2) Текущее положение щенка(свойства CurrentX и CurrentY)
3) Размер карты(свойства SizeX и SizeY)
4) Объект ICell с координатами (X,Y)
Объект ICell хранит в себе информацию о клетке:
1) Ее трение (свойство Friction)
Наша программа вызывает функцию GoNext щенка, которая должна вернуть направление, в котором наша программа должна его передвинуть.
Как будут определяться победители?
Будет подготовлено 10 карт(заранее неизвестных), "время", потраченное на прохождение каждой карты будет сложено и места распределены в соответствии со значением этой суммы.
Если щенок заваливает хоть один тест, он снимается с конкурса.
Ограничения на ресурсы
Позже я определю, какие ограничения на потребляемые ресурсы следует наложить на программу. Но, скорее всего, это будут крайне мягкие условия, например не более 10 минут на моем компьютере(Athlon 2 Ггц) на одну карту и не более 50 Мбайт ОЗУ.
Возможно, позже я поменяю условия, но тем не менее дух конкурса в том что бы написать наиболее оптимальный алгоритм, по времени "преодоления препятствий" а не по времени выполнения на процессоре.
Как тестировать?
В момент тестирования будут периодически публиковаться карты для проверки вашего "робота". Из этих карт 8 карт будут более или менее похожи на финальные карты. Кроме того в финале будут еще две "абсурдные" карты призванные проверить, насколько рационально ведет себя ваш алгоритм в "необычных" условиях.
Так же вы можете написать свои карты, если хоть немного владеете XML. Для редактирования карт можно порекомендовать следующие программы:
1) Visual Studio 2005\2003
2) Atlova XMLSpy
3) Microsoft Word
4) любой другой редактор plain или xml текста
Пример
В файле-вложении есть папка SamplePuppy с примером программы которую вам предстоит написать, написанной на VB6. Запустить щенка можно легко, нажав F5 в среде разработки.
SamplePuppy представляет собой совершенно очевидную и "топорную" реализацию алгоритма, которая просто тупо движеться к цели, не обращая внимание на трение.
ВНИМАНИЕ. Перед тестированием запустите один раз project1.exe для его регистрации.
На каком языке я могу это написать?
На любом языке, который поддерживает COM и позволяет создавать COM-библиотеки. Например, VB6, VB2005, C++, C#, Delphi и многие другие.
Совершенно неважно, на каком языке вы будете писать, так как быстродействие самого языка роли в нашем конкурсе не играет.
Если вы хотите приянть участие
Обязательно отметьтесь в личке, что бы я знал, имеет ли смысл писать тестовые карты и вообще продолжать конкурс.
Если же у вас есть предложение, замечание или еще что-то
Иными словами если у вас есть что сказать кроме "я учавствую", пишите в топике.
Скачать пример, две маленькие карты и EXE-файл с программой можно здесь: (url)
P.S. Для запуска примера запустите один раз project1.exe для регистрации, затем откройте проект samplepuppy и нажмите f5