Пошаговые действия в КОСМОСЕ!

Последний раз, когда мы видели A*, у меня была очень простая консольная программа, которая могла выводить позицию моего жетона, и управляемый компьютером жетон, который преследовал мой жетон по игровому полю (состоящий из списков Python). Я хотел расширить эту концепцию до более функциональной программы, которая начала напоминать базовую пошаговую стратегическую игру, мой любимый жанр.

Взяв за основу такие классические игры, как Homeworld или Sins of a Solar Empire (я знаю, что это RTS-игры, но они оказались двумя моими любимыми играми), я решил создать свою игру на космическую тематику. Таким образом, я с гордостью представляю вам Star Admiral V0.0!!!

Я создаю игру с помощью .Net Forms по двум причинам: во-первых, я хотел использовать язык, более подходящий для разработки настольных приложений, чем Python, .NET обеспечивает большую гибкость для создания пользовательских интерфейсов и их взаимодействия с основной логикой. Это также обеспечивает большую гибкость в объектно-ориентированном проектировании, поскольку язык C# структурирован, я не буду вдаваться в подробности, потому что это не является предметом данной статьи, но я предоставлю репозиторий GitHub, где полный код для него.

Сама программа не слишком отличается от первоначальной консольной программы для A*, которую я сделал на питоне, но у нее есть ключевое отличие: в исходной программе цель состояла в том, чтобы просто пересечь доску с одной стороны на другую, не будучи пойманным. враг. В Star Admiral есть поворот, теперь мы должны победить врага в пошаговом тактическом космическом бою, захватывающе!.

Основные правила

У каждого игрока (человека и компьютера) есть 3 очка действия или ап. Каждую из этих AP можно использовать для перемещения по доске или для атаки противоположного игрока. Когда у игрока заканчиваются AP, он должен передать свою очередь другому игроку. Игра заканчивается, когда один из игроков мертв.

Архитектура игры

Хотя искусственный интеллект в этой игре реализован почти так же, как и в предыдущей версии A*, добавление функций и графического интерфейса потребовало более обширной архитектуры классов, которая обеспечивала эффективный и отслеживаемый контроль над игровыми элементами. Имея это в виду, у нас есть 7 различных классов: Адмирал, Корабль, Доска, Вражеская очередь, Узел и Форма1.

Адмирал: содержит данные и поведение обоих игроков, размер флота, количество очков действия и реализует методы, необходимые для управления кораблями и атаки противоположного игрока.

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

Доска:классboard представляет собой структуру данных в виде массива узлов, который отслеживает позиции кораблей и предоставляет адмиралам информацию об относительном положении их кораблей. корабли внутри доски

Узел:класс узла является основным составным элементом в классе Board, он отслеживает координаты X, Y определенного узла в массиве Board, а также сохраняет ссылку на объект Ship. чтобы проверить, присутствует ли Корабль в определенном узле

Очередь. Стандартная структура очереди, используемая в реализации A*.

Враг: класс врага наследуется от Адмирала и обрабатывает логику ИИ игрока-врага.

Form1:Form 1 — это класс по умолчанию, созданный платформой .Net для обработки всех элементов интерфейса и их взаимодействия с базовой логикой.

Интересная функциональность

Итак, вы видели на главном экране, что мой интерфейс, я надеюсь, несколько интуитивен, если не стандарт ААА, отточенный и привлекательный. Этот макет, однако, не пришел ко мне интуитивно, а скорее является продуктом нескольких испытаний, которые позволили мне все больше совершенствовать способ ввода команд, которые вводятся в программу, также мне нужно было решить, как спрайты перемещаются по экрану в таких случаях. таким образом, чтобы он был одновременно связан с направлением, которое дал игрок или компьютер, и в то же время он был скоординирован со структурой данных Board и Node. В конечном итоге я решил, что спрайты должны двигаться в фиксированном количестве и только в одном направлении за раз, возможно, чтобы они двигались в любом направлении и даже пропускали узлы для «телепортации» по доске, но такие правила движения сортируются. сломать игру. Когда пользователь нажимает одну из кнопок движения, корабль движется в выбранном направлении, если у корабля заканчиваются ходы, то программа сообщает нам об этом и отключает все кнопки действий, кроме прохода

При нажатии pass вражеский корабль выполняет свой ход, призывая A* двигаться к нашему спрайту, если противник обнаруживает наш корабль, он начинает цикл атаки.

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

Игроки последовательно атакуют друг друга, пока не останется только один, сам метод атаки использует случайные вероятности, чтобы внести элемент случайности и сделать игру более интересной.

Заключительные мысли и следующие шаги

Проектирование и создание этого проекта заняло у меня около 3-4 недель, у меня было большое преимущество в том, что у меня уже была определена основа A*, и нужно было просто перевести ее с python на C#. Основные проблемы, с которыми мне пришлось столкнуться в этом проекте, в основном были связаны с потоком информации от интерфейса к логике узла/платы, а также с тем, как эффективно отображать действия как игрока, так и противника, но выясняя всю дело оказалось очень весело. Решение для простой передачи пользовательского интерфейса на поле битвы заключалось в использовании элемента Windows Form Picture Box, который позволял отображать спрайт и в то же время мог содержаться в качестве ссылки в объекте Ship, связанном с ним, что позволяло отдавать команды движения и отслеживать корабль по доске.

Куда я могу пойти от этого? Что ж, теперь, когда я смог создать работающую настольную игру, следующим шагом будет портирование ее на игровой движок (например, Unity MonoGame) и добавление более крутых функций, таких как музыка, анимация, более красивые спрайты и более забавный глядя пользовательский интерфейс . ИИ противника также может быть значительно улучшен, чтобы сделать его более привлекательным и сложным.

Еще один аспект, который можно улучшить с помощью программы, — это обработка исключений и тестирование вариантов использования игры; при определенных условиях игра прерывается (например, когда я пытаюсь двигаться без предварительного выбора корабля или когда появляется корабль), что приводит к сбою приложения.

Программирование игр представляет собой серьезную проблему, требуются значительные усилия и рабочие часы, чтобы запрограммировать даже игру с ограниченной функциональностью, такую ​​​​как Star Admiral, однако вы многое узнаете об объектно-ориентированном программировании, шаблонах проектирования и дизайне пользовательского интерфейса, плюс это действительно забавные проекты.

Ниже я оставил репозиторий GitHub для всего кода на случай, если вы захотите увидеть подробности или, может быть, повеселиться с ним самостоятельно.