Разработка прототипа компьютерной игры жанра Roguelike

История появления жанра roguelike. Применение текстового редактора Google Docs и графического редактора Draw.io. Среда разработки Visual Studio. Описание общего алгоритма игры. Генерация случайных локаций. Основное назначение пользовательского интерфейса.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 07.08.2018
Размер файла 4,4 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

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

3.6 Структура программы

На начальной стадии разработки написание прототипа происходит в Visual Studio на языке C# с применением Windows Forms, что обуславливает изначальную структуру программы: Среда разработки создает первоначальный класс Program [14, 15], содержащий точку входа в программу Main(), в котором инициализируется класс Form1, где уже и происходит непосредственное написание программы разработчиком. Все дальнейшие схемы по умолчанию опускают существование этих классов, как не имеющих прямого отношения к функционированию программы.

3.6.1 Игровая сцена

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

Для того чтобы отрисовывать игроку нужную часть экрана с приемлемой производительностью желательно чтобы в памяти программы находилось полное изображение игровой локации, от которого уже можно достаточно просто и быстро вырезать нужный фрагмент [16].

Для этих целей мы создадим класс Scene, в котором будет храниться текущая локация, список находящихся на ней объектов, пользовательский интерфейс, а также камера, которая и будет отрисовывать требуемую часть сцены (Рис 3.6).

Рис. 3.6 - Схема класса Сцена.

Поле Scene.Map содержит один из уровней, сгенерированных алгоритмом после запуска игры. Уровень изначально содержит список всех игровых объектов, который передается в поле GameObjects сцены, где они обрабатываются в игровом цикле. Далее отдельные элементы пользовательского интерфейса определяют свои параметры в соответствии с пользовательским вводом и состоянием игровых объектов [17]. После того как игровой цикл закончен в область, заданную камерой по порядку отрисовываются все указанные выше объекты чтобы игрок мог увидеть результаты своих действий.

3.6.2 Графический пользовательский интерфейс (GUI)

Основное назначение пользовательского интерфейса (Рис. 3.7) - предоставление пользователю всей необходимой информации для взаимодействия с программой.

Рис. 3.7 - Схема пользовательского интерфейса

В первую очередь игроку для взаимодействия требуется описание управляющих элементов. За них отвечают:

Поле ActionsBar (Панель действий), которая дает доступ к общим меню управления игрой, например, завершением игры, запуском меню настроек, открытием инвентаря или листа персонажа - всех действий, не являющихся непосредственно действием персонажа.

Поле SkillsBar (Панель способностей), где отображаются управляющие элементы для всех действий, которые может совершить персонаж игрока - изначально это движение в четырех направлениях по осям Ox и Oy, включающее в себя рукопашную атаку, если на целевой клетке находится оппонент. Побеждая врагов и получая экипировку, игрок будет открывать соответствующие способности, например, “Обезвреживание ловушек” при использовании набора инструментов, или “Оглушающий удар” при экипировке персонажа булавой.

Чтобы совершать действия осмысленно игроку требуется больше информации о ситуации, которую ему предоставляют информационные элементы GUI:

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

StatsPanel - панель характеристик игрока, большую часть которой занимают ключевые ресурсы (например, здоровье), а в оставшемся пространстве располагаются вторичные параметры, которые могут использоваться игроком для выявления оптимального следующего действия, но не несущие ключевой нагрузки (атакующие характеристики, защитные характеристики, активные статус эффекты и прочее)

Hints - всплывающие подсказки, в которых отображаются произошедшие за ход события, описания для встреченных существ и предметов, а также действия некоторых эффектов. Например, “Яд наносит игроку две единицы урона”, “Вы попали в засаду орков” или “Плита под вашей ногой продавилась, активировав замаскированный в стене механизм”

3.6.3 Игровые объекты

За исключением препятствий, координаты которых участвуют в проверке передвижения персонажей все объекты, с которыми можно взаимодействовать в игре относятся к Scene.GameObjects (Рис. 3.8).

Рис. 3.8 - Схема игровых объектов

Их можно разделить на три большие группы:

Characters - персонажи игрока и его оппонентов.

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

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

Ловушки

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

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

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

Игрок успешно обнаруживший ловушку становится перед дилеммой как именно он предпочитает ее использовать - заманить в нее оппонента или разминировать ради сокровищ.

Персонажи

Персонажи -- это игровые объекты, занимающие в один момент времени одну клетку локации, имеющие набор параметров, а также способные перемещаться, использовать навыки и экипировку (Рис. 3.9). В игре присутствует два вида персонажей: PC (Player Character) - персонаж игрока и NPC (Non-Player Character) - персонаж под управлением компьютера. Между собой они различаются лишь наличием у PC интерфейса управления игроком, наличием у NPC скриптов поведения и результатом выполнения функции вызываемой при смерти персонажа: окончание игры при смерти персонажа игрока, и выдача награды игроку с удаление персонажа из списка объектов для монстра соответственно.

Рис. 3.9 - Схема класса Персонаж

Класс персонажей состоит из методов, отвечающих за действия этих персонажей, и полей, отображающих свойства и параметры.

Поля условно можно разделить на три подгруппы - характеристики, параметры и списки.

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

Параметры - поля, использующиеся игрой для идентификации того или иного аспекта юнита: координаты в игровом пространстве, отображаемое имя, отрисовываемый спрайт, id (идентификационный номер)

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

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

ItemList - список предметов проверяется только при открытии игроком панели инвентаря, в которой по очереди отображаются все содержимое соответствующего списка (Рис. 3.10).

Рис. 3.10 -Схема списка предметов.

У предметов есть характеристики, а также методы, позволяющие экипировать (активировать) и снять предмет. При экипировке характеристики предмета прибавляются к характеристикам игрока, в список эффектов добавляется соответствующий эффект, а если предмет содержит способность - она добавляется в список способностей персонажа. При снятии предмета характеристики соответственно вычитаются, а способность удаляется из списка. Обычно предмет содержит либо характеристики, либо эффект, либо способность, хотя могут быть и исключения. (Например, использование зелья здоровья не даст характеристик, но наложит эффект постепенного восстановления здоровья, а зачарованный двуручный меч может увеличить атакующие характеристики и дать способность “Раскалывающий удар”)

SkillsList - список способней (рис. 3.11) проверяется каждый раз при отрисовке пользовательского интерфейса, отображая полный список способностей, которые игрок может применить в данный момент - для каждой способности выводится ее иконка, краткое описание, а также команда, для ее активации.

Рис. 3.11 - Схема списка способностей

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

3.7 Программная реализация прототипа

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

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

Так как мы используем шаблон Windows Forms часть работы среда разработки делает самостоятельно, в частности задаст точку входа для нашей программы:

using System;

using System.Windows.Forms;

namespace WindowsFormsApplication4

{

static class Program

{

/// <summary>

/// Главная точка входа для приложения.

/// </summary>

[STAThread]

static void Main()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.Run(new Form1());

}

}

}

Вывод изображения сцены на экран.

При помощи редактора формы мы вывели на экран фоновое изображение, предполагающее возможный вид сгенерированного подземелья, а также спрайт персонажа игрока (рыцарь в центре экрана), враждебного монстра (зеленой гигантской крысы) а также окно вывода текста, предоставляющее обратную связь с игроком (Рис 3.12).

Рис. 3.12 - Начальный экран Сцены

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

(Character Player = new Character

Player.Position )

Рис. 3.13 - Передвижение игрока

Код отвечающий за передвижение игрока:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyValue)
{

case 37:

x=x - 32;

if (enemy_check(x,y) == true && enemy_life(enemy_hitpoint) == true)

{

x = x + 32;

enemy_hitpoint= attack(gg_hitpoint, gg_damage, enemy_hitpoint, enemy_damage);
}

else

{

pictureBox1.Location = new System.Drawing.Point(x, y);

}

;
break;

case 38:

y = y - 32;
if (enemy_check(x, y) == true && enemy_life(enemy_hitpoint) == true)
{
enemy_hitpoint = attack(gg_hitpoint, gg_damage, enemy_hitpoint, enemy_damage);
y = y + 32;
}
else
{
pictureBox1.Location = new System.Drawing.Point(x, y);
}
;
break;

case 39:

x = x + 32;

if (enemy_check(x, y) == true && enemy_life(enemy_hitpoint) == true)

{
enemy_hitpoint = attack(gg_hitpoint, gg_damage, enemy_hitpoint, enemy_damage);
x = x - 32;
}
else
{
pictureBox1.Location = new System.Drawing.Point(x, y);
}

break;

case 40:

y = y + 32;
if (enemy_check(x, y) == true && enemy_life(enemy_hitpoint) == true)
{
enemy_hitpoint = attack(gg_hitpoint, gg_damage, enemy_hitpoint, enemy_damage);
y = y - 32;
}
else
{
pictureBox1.Location = new System.Drawing.Point(x, y);
}
;
break;
}

Идет считывание следующего нажатия клавиши, и если это одна из четырех кнопок передвижения, то вызывается соответствующий метод [18]. Документированный код одного из них приведен ниже:

case 40: //если нажата кнопка вниз

y = y + 32;

/* Изменим координату спрайта на один шаг вниз */

if (enemy_check(x, y) == true && enemy_life(enemy_hitpoint) == true)

/*если на клетке обнаружен враг И его здоровье больше единицы */

{

enemy_hitpoint = attack(gg_hitpoint, gg_damage, enemy_hitpoint, enemy_damage);

/* вызываем метод атаки, передавая ему требуемые характеристики (здоровье героя и врага, а также атаку героя и врага) */

y = y - 32;

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

}

else

/* если враг нам не встретился или на этой клетке лишь его мертвое тело */

{

pictureBox1.Location = new System.Drawing.Point(x, y);

/* перемещаем изображение игрока на одну клетку вниз */

}

;

break;

}

При движении необходимо отслеживать свободна или нет клетка для передвижения и если она занята - вызывается метод сражения:

public int attack(int gg_hitpoint, int gg_damage, int enemy_hitpoint, int enemy_damage)

//В метод передаются параметры cражающихся юнитов

{

enemy_hitpoint = enemy_hitpoint - gg_damage;

//из вражеского здоровья вычитается атака игрока

if (enemy_hitpoint <= 0)

/*Если оппонент погиб - выводится сообщение о

победе и метод прерывается */

label1.Text = "Герой наносит смертельный удар!";

return (enemy_hitpoint);

}

// Если оппонент выжил - он наносит ответный удар

gg_hitpoint = gg_hitpoint - enemy_damage;

if (gg_hitpoint <= 0)

{

// При смерти игрока игра заканчивается

Application.Exit();

}

return (enemy_hitpoint);

}

При этом программа выводит каждый раз новое сообщение, соответствующее игровой ситуации (рис. 3. 14)

Рис. 3.14 - Сообщение об убийстве оппонента в бою.

При перемещении на клетку занятую врагом, если он не погиб от атаки выводится сообщение о его состоянии (см. рис. 3.15).

public Boolean enemy_life(int enemy_hitpoint)

{

if (enemy_hitpoint > 0) //Если враг пережил атаку

{

label1.Text = "Этот еще живой, добей его!";

return (true);

}

else //И если атаки не было так как враг уже погиб

{

label1.Text = "Мертвое тело. Интересно, что у него в карманах?";

return (false);

}

}

Рис. 3.15 - Сообщение о ничейном исходе боя.

Причем в последнем случае передвижение происходит как обычно, так как проверка передвижения успешно пройдена. Результат - на рис 3.16.

Рис. 3.16 - Сообщение об обнаружении погибшего оппонента.

Ниже приведен метод, проверяющий занята ли клетка оппонентом.

public Boolean enemy_check (int x, int y)

{

if(x==512 && y== 224 && enemy_life(enemy_hitpoint)==true)

{

return (true);

}

else

{

return (false);

}

}

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

Заключение

В результате выполнения ВКР была исследована история и ключевые особенности жанра roguelike, были определены степени важности тех или иных факторов. При работе были проработаны литературные и электронные ресурсы для более глубокого изучения и практического использования выбранного языка программирования. Кроме того, для построения блок - схем использовались сетевые технологии и графический редактор Draw.io.

Сама работа была написана в текстовом редакторе доступном в сети интернет - Google Docs.

До написания программы реализации была обозначена схема законченной игры, определены основные элементы прототипа, необходимые для дальнейшей разработки полноценной игры на его базе.

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

Был выбран язык реализации прототипа игры, учитывая то, что игра должна быть доступна через интернет.

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

· Персонажи, обладающие характеристиками.

· Передвижение персонажей.

· Взаимодействие между персонажами.

· Изменение характеристик персонажей при взаимодействии.

· Обратная связь в виде текстовых сообщений, выводящихся на экран.

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

Список использованных источников

1. Rogue Temple [Электронный ресурс]

2. Rogue Basin [Электронный ресурс]

3. Roguelike игры на ПК [Электронный ресурс]

4. Universal Rogue-like tileset v1.81

5. Рихтер, Дж. CLR via C#. Программирование на платформе Microsoft.NET Framework 4.5 на языке C# [Текст] / Дж. Рихтер - 4-е изд. - СПб.: Питер, 2013. - 929 с.

6. Язык программирования C#. Классика Computers Science. [Текст] / А. Хейлсберг [и др.] - 4-е изд. - СПб.: Питер, 2012. - 784 с.

7. Грин, Дж. Изучаем C#. [Текст] / Э. Стиллмен, Дж. Грин - 3-е изд. - СПб.: Питер, 2015. - 816 с.

8. Полное руководство по языку программирования С# 6.0 и платформе.NET 4.6

9. Интерактивный учебник по Visual Studio - MSDN - Microsoft

10. C#. Язык программирования

11. The Key Design Elements of Roguelikes

12. Generate Random Cave Levels Using Cellular Automata

13. Пишем свою игру в жанре Roguelike [Электронный ресурс]: Режим доступа: https://tproger.ru/translations/making-first-roguelike/, свободный - Загл. С экрана.

14. Троелсен, Э. Язык программирования C# 5.0 и платформа.NET 4.5. [Текст] / Эндрю Троелсен - 6-е изд. - М.: Вильямс - 2015. - 1312 с.

15. Албахари, ДЖ. C# 6.0. Справочник. Полное описание языка. [Текст] / Джозеф Албахари, Бен Албахари пер. Ю. Артеменко - М.: Вильямс - 2015. - 1040 с.

16. Алгоритмы генерации лабиринтов

17. Maze Creation Algorithms

18. Фримен, А. ASP.NET 4.5 с примерами на C# 5.0 для профессионалов [Текст] /Адам Фримен - М.: Вильямс - 2014. - 1120 с.

графический редактор алгоритм интерфейс

Приложение

Презентационный материал

Размещено на Allbest.ru


Подобные документы

  • Особенности создания ряда игровых приложений, логической игры. Программное обеспечение простейшего калькулятора, генератора функций. Разработка элементов интерфейса простейшего графического редактора, электронной записной книжки, текстового редактора.

    методичка [788,7 K], добавлен 24.10.2012

  • Изучение особенностей растровых и векторных графических редакторов. Создание графического редактора: выбор языка программирования, разработка структуры программы и алгоритма работы. Описание интерфейса программы. Руководство программиста и пользователя.

    курсовая работа [1,3 M], добавлен 28.07.2013

  • Дизайн интерфейса приложения как связь человека и персонального компьютера. Adobe Photoshop и его возможности, анализ функциональности и содержание главных операций. Используемые инструменты для разработки дизайна интерфейса текстового редактора.

    контрольная работа [407,5 K], добавлен 12.10.2015

  • Алгоритмическое представление и описание правил игры "Эволюция". Построение диаграммы прецедентов. Разработка графического интерфейса пользователя. Реализация интерфейса в среде Unity. Структура файла сохранения игры. Проектирование поведения компьютера.

    дипломная работа [3,3 M], добавлен 18.02.2017

  • Изучение основных алгоритмов генерации различных видов фракталов. Выбор языка и среды программирования. Характеристика структурных элементов растрового графического редактора фракталов. Описание интерфейса приложения, порядок редактирования изображений.

    курсовая работа [1,2 M], добавлен 04.04.2014

  • Особенности разработки компьютерной игры, в которой проводится чемпионат по волейболу. Список переменных и типов данных. Разработка текстового и графического алгоритма. Разбор основных этапов игры на примере. Основные положения руководства пользователя.

    курсовая работа [976,9 K], добавлен 09.06.2016

  • Типы, основные функции, элементы и принцип работы текстового редактора (компьютерной программы). Методы вставки внешних объектов в текст. Особенности текстового процессора Microsoft Word, его специальные возможности. Типовая структура интерфейса.

    реферат [15,8 K], добавлен 07.12.2010

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

    курсовая работа [85,9 K], добавлен 31.10.2014

  • Проектирование игры "Жизнь" и ее реализация в среде разработки Visual Studio 2010, версия .Net Framework 4.0. Особенности языка программирования C#, основных принципов ООП на языке C#. Проектирование пользовательского интерфейса. Описание алгоритмов.

    курсовая работа [990,0 K], добавлен 18.04.2013

  • Исследование базовых концепций программирования приложений под операционную систему Windows. Изучение истории создания универсального языка программирования Си. Разработка графического пользовательского интерфейса. Обзор правил игры и алгоритма работы.

    курсовая работа [58,2 K], добавлен 09.11.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.