Pull to refresh

CodeCraft – битвы программистов

Reading time 5 min
Views 10K



CodeCraft принадлежит к жанру Programming game. Многие из вас наверняка знают о проекте HabraWars или о других Programming games. То есть желание написать среду для битв программистов возникало у многих. Вот у меня, например, возникла эта идея.
Ее отличительные черты:
  • Игровой мир — баталия двух флотов космических кораблей.
  • Необходимость стратегического превосходства над соперником
  • Управление возможно как отдельными юнитами, так и группами
  • 3 типа юнитов
  • Тактический и стратегический вид
  • 2D
  • Игроки — плагины в виде библиотек
  • 2 уровня абстракции для взаимодействия с игрой. О них позже
  • Удобная отладка
  • Максимально упрощен процесс написания игроков
  • Есть документация, мануалы, примеры


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

Да просто я всегда представлял себе умственный поединок как соревнование стратегий, а не одиночных юнитов. Иначе программируется скорее не стратегия, а поведение, получается больше похоже на шутер.
Намного красочнее посмотреть за алгоритмом поведения армий: ровные ряды фаланг, которые методично вытесняют врага, стаи юнитов, которые несутся напролом, хитрые маневры быстрыми юнитами, неожиданные удары с тыла, классическая победа над более сильным соперником благодаря окружению и т.д. Во многом игра навеяна рисунками из учебников истории, где отмечены условные графические изображения разных родов войск и их перемещений. На скучнейших парах воображение приводило их в движение, создавая концепцию CodeCraft.






История



Идея создания игры пришла мне так: нужно было разнообразить свой день рождения, где обирались тогда исключительно программисты. Так началось создание проекта. Идею поддержал и вскоре присоединился к разработке Mad_Fish. Попервах управление юнитами было чем-то подобно управлению в HabraWars. Игрок мог повернуть юнит, полететь вперед и выстрелить, если заряжен. Отличие было в возможности тарана, который для одиночных баталий почти бессмыслен, да и в управлении ускорениями, а не скоростью. Всем приглашенным на ДР было дано задание: придти со своим игроком. То есть принести его на флэшке. Оказалось, что созданные игроки были ужасно глупы – побеждал тот, кто хотя бы не палил по своим и не таранил их. Потому не стреляющий и не двигающийся игрок иногда вполне уверенно побеждал. После праздника я понял, что избежание таранов, дружественного огня и подобных вещей есть вещи рутинные, не интересные для игры.

Простота



На практике стала понятна необходимость крайнего упрощения управлением юнитами. Поэтому сейчас доступна возможность писать только то, что интересно. Я создал стандартные реализации для поведения юнитов и групп юнитов – библиотеку EtalonAI.
Например, код

foreach (UnitPilot pilot in friends) <br>  pilot.AttackClosest();<br><br>* This source code was highlighted with Source Code Highlighter.


уже является адекватным алгоритмом ведения боя. Так же юниту можно приказать держать позицию, атаковать конкретного врага, лететь в указанные координаты, либо ждать приказов. Юнит имеет список близких к нему юнитов, юнитов, врагов, которые в него целятся. А так же все юниты доступны в списках friends и enemies.
Для контроля группы юнитов можно создать отряд. В примере создается отряд из десяти истребителей

DestroyersSquad1 = new SquadronColonel(friends[0], game);<br>for (int i=0;i<10;i++)<br>  DestroyersSquad1.AddUnit(friends[i]);<br>


Далее, весь отряд можно отправить в заданную точку

DestroyersSquad1.GoToOrder(new GameVector(-3000, -2000));<br>


Можно приказать передвигаться «через атаку»

DestroyersSquad1.AttackOrder(new GameVector(-3000, -2000));<br><br>


Можно задать тип строя – линия, прямоугольник, клин или стая(без строя).
DestroyersSquad1.SetFormationTypeLine(WidthBetweenUnits, AngleForward);<br>

Создание своей геометрии построения тоже возможно.
Также есть приказы для атаки ближайшего врага, тарана врагов (кстати, полезное дело — истребителями затаранить вражеский крейсер)

Так же просто можно исследовать противника – класс 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
Скачивать чужих и добавлять своих игроков можно здесь



Ссылки




Записи игр в CodeCraft. Учасники — примеры игроков


Приятной игры

Tags:
Hubs:
+106
Comments 69
Comments Comments 69

Articles