гы я там свою игру нашел...
http://habrahabr.ru/blogs/sport_programming/74582/
CodeCraft принадлежит к жанру Programming game. Многие из вас наверняка знают о проекте HabraWars или о других Programming games. То есть желание написать среду для битв программистов возникало у многих. Вот у меня, например, возникла эта идея.
Ее отличительные черты:
- Игровой мир — баталия двух флотов космических кораблей.
- Необходимость стратегического превосходства над соперником
- Управление возможно как отдельными юнитами, так и группами
- 3 типа юнитов
- Тактический и стратегический вид
- 2D
- Игроки — плагины в виде библиотек
- 2 уровня абстракции для взаимодействия с игрой. О них позже
- Удобная отладка
- Максимально упрощен процесс написания игроков
- Есть документация, мануалы, примеры
Почему же я решил, что среда для битв программистов должна быть именно такой?
Да просто я всегда представлял себе умственный поединок как соревнование стратегий, а не одиночных юнитов. Иначе программируется скорее не стратегия, а поведение, получается больше похоже на шутер.
Намного красочнее посмотреть за алгоритмом поведения армий: ровные ряды фаланг, которые методично вытесняют врага, стаи юнитов, которые несутся напролом, хитрые маневры быстрыми юнитами, неожиданные удары с тыла, классическая победа над более сильным соперником благодаря окружению и т.д. Во многом игра навеяна рисунками из учебников истории, где отмечены условные графические изображения разных родов войск и их перемещений. На скучнейших парах воображение приводило их в движение, создавая концепцию CodeCraft.
История
Идея создания игры пришла мне так: нужно было разнообразить свой день рождения, где обирались тогда исключительно программисты. Так началось создание проекта. Идею поддержал и вскоре присоединился к разработке Mad_Fish. Попервах управление юнитами было чем-то подобно управлению в HabraWars. Игрок мог повернуть юнит, полететь вперед и выстрелить, если заряжен. Отличие было в возможности тарана, который для одиночных баталий почти бессмыслен, да и в управлении ускорениями, а не скоростью. Всем приглашенным на ДР было дано задание: придти со своим игроком. То есть принести его на флэшке. Оказалось, что созданные игроки были ужасно глупы – побеждал тот, кто хотя бы не палил по своим и не таранил их. Потому не стреляющий и не двигающийся игрок иногда вполне уверенно побеждал. После праздника я понял, что избежание таранов, дружественного огня и подобных вещей есть вещи рутинные, не интересные для игры.
Простота
На практике стала понятна необходимость крайнего упрощения управлением юнитами. Поэтому сейчас доступна возможность писать только то, что интересно. Я создал стандартные реализации для поведения юнитов и групп юнитов – библиотеку EtalonAI.
Например, кодforeach (UnitPilot pilot in friends)уже является адекватным алгоритмом ведения боя. Так же юниту можно приказать держать позицию, атаковать конкретного врага, лететь в указанные координаты, либо ждать приказов. Юнит имеет список близких к нему юнитов, юнитов, врагов, которые в него целятся. А так же все юниты доступны в списках friends и enemies.
pilot.AttackClosest();
* This source code was highlighted with Source Code Highlighter.
Для контроля группы юнитов можно создать отряд. В примере создается отряд из десяти истребителейDestroyersSquad1 = new SquadronColonel(friends[0], game);Далее, весь отряд можно отправить в заданную точку
for (int i=0;i<10;i++)
DestroyersSquad1.AddUnit(friends[i]);
DestroyersSquad1.GoToOrder(new GameVector(-3000, -2000));Можно приказать передвигаться «через атаку»
DestroyersSquad1.AttackOrder(new GameVector(-3000, -2000));Можно задать тип строя – линия, прямоугольник, клин или стая(без строя).
DestroyersSquad1.SetFormationTypeLine(WidthBetweenUnits, AngleForward);Создание своей геометрии построения тоже возможно.
Также есть приказы для атаки ближайшего врага, тарана врагов (кстати, полезное дело — истребителями затаранить вражеский крейсер)
Так же просто можно исследовать противника – класс EnemyAnalyzing периодически проводит кластеризацию врагов – то есть вы можете легко узнать, на какие отряды соперник разделил флот
Работа с геометрией так же учтена – класс вектора GameVector содержит методы для поворота, операторы векторной математики перегружены. Есть класс Angle, который позволяет складывать углы, не опасаясь получить тыщу градусов, находить разность, расстояние между углами и т.д. подробнее – см. документацию.
Конечно, стандартизация до такой степени исключает возможность создания уникального поведения юнита, особо крутого джедайско-чакнорриского истребителя, но ведь игра по идеологии стратегическая. К тому же, как сказано выше, есть два уровня абстракции взаимодействия с игрой: первый – высокоуровневый, где игрок указывает, кого атаковать или место, куда лететь отряду и каким строем; на втором уровне игрок указывает непосредственно линейное ускорение, ускорение поворота юнита и момент выстрела. Так юниты и контролировались до дня рождения. Получается, возможность помаяться и сделать Чака Норриса остается.
Отладка
Для отладки предусмотрено несколько способов
- Вывод текста от имени игрока. У класса игры есть метод SetText(string text). Можно использовать перенос строки \n
- Вывод текста от имени юнита. У юнита есть поле Text, содержимое которого будет выведено на экран. Также можно использовать перенос строки.
- Вывод геометрии. У класса игры есть поле GeometryViewer, класс которого имеет методы для рисования прямоугольника, круга, линии и точки. Задается цвет (прозрачность допускается) и сама фигура. Кстати, структуры фигур тоже собственные, имеют методы расчета пересечений.
Файл настроек позволяет
- Включить или отключить вывод отладочной информации
- Запускать программу в полноэкранном или оконном режиме
- Изменять количество юнитов каждого типа для каждой стороны отдельно (например, так я узнал, что 100 истребителей «стоят» 13-15 корветов)
Как написать игрока
Написание «Hello world» и адекватного алгоритма занимает всего пару минут. Игрока можно написать на любом .NET языке.
Для этого нужно:
- Подключить библиотеку MiniGameInterfaces.dll и, по желанию, EtalonAI.dll для приятного написания.
- Наследовать класс AI, в нем перегрузить метод Init и Update.
Вот и все.Это почти полное руководство
Подробности
Игра была написана на С# с использованием XNA, так что, пардон, Windows-only. Писал ведь не рассчитывая кому-нибудь кроме друзей показать, а все-таки C# — это сплошные удобства. Mad Fish сейчас занимается портированием игры для Linux.
Клавиши управления
- Page up и page down – увеличение, уменьшение скорости симуляции
- Home и end – отдаление и приближение камеры.
- Стрелки – перемещение камеры
- Пауза – пауза
- Esc – выход
Заключение
Надеюсь развивать проект и далее. Например графику по-человечески сделать и все такое.Mad_Fish в настоящее время портирует CodeCraft на OpenGL, и говорит, что надо от Microsoft не зависеть)
Но самое интересное — это конечно же загрузить игрока, написанного кем-то из вас; посмотреть на его тактику; придумать как его победить; загрузить своего игрока, побеждающего его и ждать ответа соперника.0
Скачивать чужих и добавлять своих игроков можно здесь
Ссылки
- Репозиторий на GoogleCode
- Документация в формате CHM для «простого» и «сложного» варианта игры.
- Бинарники игры. Примеры игроков прилагаются
- Исходники игры. Исходники примеров игроков прилагаются
- Сайт игры — место для обмена игроками
Записи игр в CodeCraft. Учасники — примеры игроков
- «Истребители камикадзе» против «Атаки влоб»
- «Истребители камикадзе» против «Защитной тактики»
- «Истребители камикадзе» против «Атаки Крейсер-корвет-истребитель»
- «Защитная тактика» против «Атаки влоб»
- «Защитная тактика» против «Атаки Крейсер-корвет-истребитель»
- «Атака Крейсер-корвет-истребитель» против «Атаки влоб»
- «Атака Корвет-крейсер-истребитель» против «Атаки влоб»
- «Атака Корвет-крейсер-истребитель» против «Защитной тактики»
- «Истребители Чаки Норрисы» против «Атаки влоб»
- «Истребители Чаки Норрисы» против «Защитной тактики»
- «Сбалансированные отряды» против «Защитной тактики»
- «Все подстроено» против «Атаки влоб». Заглавное видео
Приятной игры
http://habrahabr.ru/blogs/sport_programming/75998
Єдина Країна! Единая Страна!
Бандерівець це така чупакабра: ніхто його не бачив, але всі страшенно бояться.
http://oldengremlin.blogspot.com/
гы я там свою игру нашел...
http://habrahabr.ru/blogs/sport_programming/74582/
Єдина Країна! Единая Страна!
Бандерівець це така чупакабра: ніхто його не бачив, але всі страшенно бояться.
http://oldengremlin.blogspot.com/
"I look forward to plucking the sun from your universe and watching the cold of time
and the void of space, slowly dissolve the existence that was you , soon . .