- PVSM.RU - https://www.pvsm.ru -
Привет.
При выборе темы диплома учитывалось желание накодить что-то практическое, что и повлияло на выбор темы. Было принято решение разработать платформу для проведения соревнований по программированию ИИ танка. В целом идея не нова и такие вещи уже делались (http://robocode.sourceforge.net [1], например). Но существует несколько причин, по которым были выбраны именно танчики:
Про эволюционное программирование я рассказывать не буду, потому что это уже много раз здесь обсуждалось, и, к тому же, описывать это еще раз после написание диплома не доставляет удовольствия.
В отличие от других реализаций, мои танчики в 3D. Они ездят по ландшафту, который считывается из внешнего файла с картой высот [3]. Также, в планах была хоть сколько-то реалистическая физика, но на это не хватило сил и времени.
Для общение используется двоичных протокол поверх UDP. Почему UDP? Он сохраняет границы сообщений, потому что это message-based протокол. Это значит, что данные приходят точно такими же порциями, какими они отправлялись, что значительно упрощает сетевую часть. В условиях нехватки времени это, по моему мнению, — разумное решение. Вместо UDP можно было бы использовать SCTP, например. Но он не реализован под Windows, а разработка велась под этой ОС.
Протокол состоит из пакетов, каждый из которых начинается с id. Поэтому, размер пакетов зачастую известен наперед — по первому байту. Для пакетов переменной длины в теле пакета предусмотрена статическая часть, которая позволяет определить размер всего пакета.
В коде пакеты описываются C-структурами с отключенными выравниваниями.
Танчики состоят из сетевого сервера, тестового и «генетического» клиентов и программы-просмотрщика.
Сервер обрабатывает запросы, шлет notifications и ведет все расчеты.
Тестовый клиент предназначен для отладки. Он считывает команды управления танком со стандартного ввода и отправляет на сервер. Например,pi (power increase) — увеличить мощность двигателя, s (shoot) выстрелить, ll (look left) — немного повернуть пушку влево.
«генетический» клиент — запускает генетическую программу управления танком на языке Slash/A [4]. Это специально разработанный для ГП язык и ВМ для его исполнения. Набор команд ВМ был расширен специфическими для управления танком командами.
Пример программы на Slash/A:
input/ # gets an input from user and saves it to register F
0/ # sets register I = 0
save/ # saves content of F into data vector D[I] (i.e. D[0] := F)
input/ # gets another input, saves to F
add/ # adds to F current data pointed to by I (i.e. D[0] := F)
output/. # outputs result from F
Программа-просмотрщик предназначена для наблюдения за боем. Можно парить над картой используя WASD, F, V и крутить камеру мышью.
Во время разработки пара тестовых клиентов (для танка-жертвы и танка-победителя) и просмотрщик были одними из основных инструментов отладки.
Скрин:

В C11 добавили много разных фич. Мне были полезны такие:
Также, были полезны Variable Length Arrays и Designated Initializers из C99. Ну и возможность объявлять переменные не только в начале scope тоже была очень полезна.
Для сборки C части использовался отличный компилятор pellesc.de/ [5] с отличной справкой по библиотекам, языку и среде.
Для сборки C++ части использовался GCC (MinGW).
Ссылка на исходники: http://code.google.com/p/morrigan [6]. К сожалению, я плохо разбираюсь в лицензиях, поэтому уже для второго своего проекта выбираю «Other Open Source». Как-нибудь обязательно прочту какой-то ликбез.
В принципе, из непортабельная зависимость только одна — Winsock. Почему morrigan — вики [7]. С самого начала я решил назвать проект женским именем, а потом пришла идея про богиню войны.
Сам диплом я сверстал в LaTex, о чем ни разу не жалею и всем советую. Это совсем не так страшно, как может показаться, особенно после года подготовки протоколов к лабораторным в LaTex. При возникновении трудностей меня спасал google (который приводил в основном на tex.stackexchange.com [8]) и хорошая документация к пакетам. Глядя на своих друзей, которые мучительно вручную расставляют номера страниц в рамке, подписи к рисункам и таблицам и ссылки на них, я еще раз убедился в правильности принятого решения.
В целом, я доволен. Удалось немного отвлечься от вездесущего ООП и попрограммировать в свое удовольствие.
Автор: aquirel
Источник [14]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/game-development/38763
Ссылки в тексте:
[1] http://robocode.sourceforge.net: http://robocode.sourceforge.net
[2] C11: http://en.wikipedia.org/wiki/C11_%28C_standard_revision%29
[3] картой высот: http://www.gamedev.ru/articles/?id=30015
[4] Slash/A: https://github.com/arturadib/slash-a
[5] pellesc.de/: http://pellesc.de/
[6] http://code.google.com/p/morrigan: http://code.google.com/p/morrigan
[7] вики: http://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D1%80%D1%80%D0%B8%D0%B3%D0%B0%D0%BD
[8] tex.stackexchange.com: http://tex.stackexchange.com
[9] www.gamedev.ru: http://www.gamedev.ru
[10] Collision Detection in Interactive 3D Environments: http://sharebookfree.com/gino-van-den-bergen-collision-detection-in-interactive-3d-environments/
[11] www.libsdl.org: http://www.libsdl.org
[12] Стандарт: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
[13] c.learncodethehardway.org: http://c.learncodethehardway.org
[14] Источник: http://habrahabr.ru/post/186670/
Нажмите здесь для печати.