Разработка инди-игры одним человеком (история, советы)
Содержание:
Действия
Все действия определены в перечислении
public enum ActionTypes { Attack = 1, BuyWeapon = 2, BuyArmor = 3, Heal = 4 }
Для реализации механизма действий определим интерфейс
public interface IAction { /// <summary> /// Action Type /// </summary> ActionTypes Type { get; } /// <summary> /// Core process action /// </summary> /// <param name="state">State to change player info</param> /// <param name="config">Game config with settings</param> /// <returns>Result of action</returns> ActionResultBase Process(GameState state, GameConfiguration config); /// <summary> /// True if action can be processed by game /// </summary> bool CanApply(GameState state, GameConfiguration config); }
И абстрактный класс результата выполнения действия
/// <summary> /// Game action result /// </summary> public abstract class ActionResultBase { protected ActionResultBase() { IsSuccessful = true; } public bool IsSuccessful { get; set; } public bool IsDead { get; set; } }
Сами действия реализуются однотипно, поэтому подробно все их рассматрировать не будем, а посмотрим на примере одного (исходный код можно скачать) и особенности остальных. Рассмотрим на примере атаки.
Для результата выполнения действия определим класс
public sealed class AttackActionResult : ActionResultBase { public bool IsWin { get; set; } public int Level { get; set; } }
Основной код обработки действия ниже. Сначала по формуле вычисляем победил ли персонаж монстра или нет. В этом участке можно добавить уровень монстра и другие параметры в формулу. Считаем шанс на победу из 100 возможных. Если игрок победил, то увеличиваем уровень (эквивалент опыта, но за 1 монстра дается 1 уровень). В части определения результата, в случае победы заносится информация из секции настроек / победы, в противном случае для применения эффектов приравниваются настройки из секции поражения.
public ActionResultBase Process(GameState state, GameConfiguration config) { AttackActionResult result = new AttackActionResult(); int winProbability = Math.Min( config.Battle.MinWinProbability + state.CurrentPlayer.Power*config.Battle.IncreasePowerProbability, config.Battle.MaxWinProbability); int random = Generator.Next(1, 100); BattleResultConfiguration battleResult = null; //Win if (random <= winProbability) { battleResult = config.Battle.WinResult; result.IsWin = true; state.Attacks++; } //Loose else { battleResult = config.Battle.LooseResult; } state.CurrentPlayer.ApplyDamage(-GetDamage(state.CurrentPlayer.Health, battleResult)); state.CurrentPlayer.AddCoins(battleResult.CoinsChange); result.Level = state.Attacks; if (state.CurrentPlayer.Health <= 0) { result.IsDead = true; } return result; }
Для всех магазинов характерно определения значения эффекта.
internal abstract class ShopActionBase { protected int GetItemEffect(ShopConfiguration shop) { int delta = shop.EffectTo - shop.EffectFrom; if (delta == 0) return shop.EffectTo; return shop.EffectFrom + Generator.Next(0, delta); } }
Стоит остановиться подробнее на магазинах. Все магазины могут изменять соответствующие параметры персонажа. Значения эффекта получается случайным образом из промежутка , определенного в настройках игры. Реализован простейший потокобезопасный генератор псевдослучайных чисел, на основе стандартного .
private static readonly Random _generator = new Random(); private static readonly object locker = new object(); /// <summary> /// Thread safe generate /// </summary> public static int Next(int min, int maxValue) { lock (locker) { //https://msdn.microsoft.com/en-us/library/2dx6wyd4(v=vs.110).aspx return _generator.Next(min, maxValue + 1); } }
При покупке оружия увеличивается сила. При покупке брони увеличивается максимальное здоровье. А при покупке лечения увеличивается текущее здоровье на точное число (не промежуток), поэтому в настройках укажем в качестве промежутка два одинаковых числа. Результат применения магазина определяется одним числом . И обрабатывается в соответствующем действии. Например эффект лечения.
public ActionResultBase Process(GameState state, GameConfiguration config) { HealActionResult result = new HealActionResult(); if (!CanApply(state, config)) { result.IsSuccessful = false; return result; } state.CurrentPlayer.DecreaseCoins(config.Shops.Heal.Price); result.HealAction = state.CurrentPlayer.ApplyHeal(GetItemEffect(config.Shops.Heal)); return result; }
UNITY
Кроссплатформенный коммерческий игровой движок, разработанный Unity Technologies. Он использовался для таких игр, как Untitled Goose Game, Ori and Will of the Wisps и Hollow Knight.
Фото: epicgames.com
Для разработки: 2D- и 3D-игр.
Платформы: Windows, macOS и Linux.
Языки программирования: C#.
Стоимость: Бесплатно для личного пользования предоставляется студентам и любителям, а также небольшим компаниям, которые зарабатывают менее 100 000 долларов в год. Помимо этого, существуют годовые планы, начинающиеся с 399 долларов в год или 40 долларов в месяц.
Обучение: Unity предоставляет некоторые бесплатные ресурсы, чтобы помочь новичкам начать работу с движком. Но в рамках программы Unity Learn Premium она предоставляет гораздо больше возможностей, включая курсы, учебные пособия и даже сертификаты. Unity Learn Premium в настоящее время бесплатна до 10 июня 2020 года, но обычно стоит 15 долларов в месяц.
Начало работы: https://learn.unity.com/tutorial/create-your-first-unity-project
Amazon Lumberyard
На игровом движке lumberyard можно создавать высококачественные игры класса ААА для PC, Xbox One и PlayStation 4, в скором будущем анонсирована поддержка устройств iOS и Android, с глубокой интеграцией в Amazon Web Services и привлечением фанатов в сервисе Twitch, так же движок Lumberyard можно будет использовать и в создании мультиплатформенных игр, так как он теперь имеет собственный сетевой движок.
Lumberyard создан не «с нуля» он основан на коде движка CryEngine, в середине лета 2015 года компания Amazon приобрела широкую лицензию на движок CryEngine, но как утверждают разработчики в систему было заложено множество нововведений и возможностей такие как: инструмент для создания растений, инструмент для создания скелетной анимации, редактор частиц, шейдеры на основе физики, модульные геммы, облегчающие работу с природными эффектами и многое другое.
Совет №7. Работайте регулярно
Старая пословица гласит: «Быстро — это медленно, но без перерывов». То же правило действует в геймдизайне.
Избегайте больших пауз в работе. Старайтесь выкроить хотя бы час в день на разработку игры. Постепенно это превратится в привычку — и у вас не будет чувства, что вы топчетесь на месте.
Алексей Малороссиянов объясняет: «Изучать программирование непросто и требует определённого майндсета. Но когда начинает получаться, вы испытываете огромное удовольствие от результата… Не сдавайтесь и планомерно каждый день хотя бы немного времени уделяйте разработке и изучению движка. И всё у вас обязательно получится».
Мотивация
Зачем так делать?
Чтобы научиться программировать. А точнее — чтобы научиться переносить человеческие мысли в код. Обычные задания по программированию плохо тренируют этот навык потому что они скучные. Признаюсь честно, я намеренно готовил скучные задания для своих студентов. Нудные задания на превращение двух чисел в третье неизбежны, чтобы освоить базовые концепции. Такие задания помогут вам спуститься по горной реке, заполненной острыми камнями синтаксиса и водоворотами новых концепций. Проблема в том, что простые понятные задания однажды бросят вас в бескрайнем океане возможностей. Тогда вы обнаружите, что можете плыть куда угодно. Однако никто не подскажет вам верное направление. Ни одна платформа с автоматической проверкой решений не сможет проверить творческую работу и поставить оценку. Это может сделать либо живой преподаватель, либо живой напарник.
В статье ничего не будет про создание конкретной игры. Потому что конкретная игра — конкретные правила. А правила вы должны придумать сами. Дайте волю своему воображению, вспомните свою любимый жанр и сделайте хорошую попытку. Единственное ограничение — мы не будем рисовать красивую картинку. Потому что красивая картинка займет слишком много сил и будет только отвлекать нас от упоения кодом. Скажу по секрету, как только вы сделаете свою игру с помощью символов в черном окошечке, то сможете воплотить ваш замысел на любой другой платформе. Интересная игра будет интересна даже в консоли.
Почему C++?
Главная причина в том, что я сейчас веду индивидуальные занятия по C++ у одного талантливого студента. Его успехи вдохновили меня, а его вопросы показали о чем вообще нужно написать. C++ до сих пор рекомендуют как «язык для обучения». Это вселяет надежду, что статья будет полезна многим. Может быть когда-нибудь я напишу такую же статью и для других языков или для Linux, но не рассчитывайте на это. Если вы напишете сами подобный сборник советов для другого языка, то сообщите мне личным сообщением. Я добавлю ссылку на ваш труд.
Что нужно знать, чтобы понять статью?
Если вы понимаете концепцию циклов, массивов и функций, то вам должно быть достаточно. Предупреждаю сразу, в статье будут магические конструкции, которые я не буду объяснять. У меня нет цели сделать всеобъемлющий курс по C++. Цель — писать код и радоваться тому, как оно почти магически заработает. Когда закончите с основной целью или когда встретитесь с непреодолимыми проблемами, тогда и углубляйтесь.
Востребованность языка программирования Java
Для чего нужен язык программирования Java?
Язык очень популярен в сфере веб-разработки. В особенности для создания сайтов с большим трафиком, например, маркетплейсы, банковские серверы, сайты обслуживающих организаций. Также язык используется для frontend и backend разработки, что поможет выбрать вам более подходящий вариант, с какой стороной работать.
При помощи Java создаются игры, мобильные приложения для общего пользования и для применения внутри корпораций. Современность и мощность языка позволяют создавать продукты повышенной надежности, что открывает для разработчиков более узкие сферы, например, финансы, государственные проекты и так далее. Сюда также входят программы, которые участвуют в обмене информации между серверами.
В отдельных случаях Java может использоваться для создания визуальной части разработки. В случае создания сайтов – это frontend-разработка. При помощи этого языка написаны даже популярные игры, например, Assassin’s Creed и Minecraft.
Бесплатный онлайн-интенсив
Ваш Путь в IT начинается здесь
Подробнее
Java используется при создании облачных хранилищ для сайтов, приложений или игр, которые взаимодействуют с камерами, геолокацией, большими объемами данных и так далее. Примерами могут стать серверная часть игры Pokemon Go и IoT (Internet of Things, интернет вещей).
На языке Java написано широко известное приложение Hadoop. Оно является одним из самых популярных в Big Data фреймворков для раздельной обработки больших датасетов. Java позволяет хранить необходимые данные в безопасности. На рынке труда по всему миру спрос на специалистов со знанием Java растет изо дня в день.
Востребованность языка программирования Java
Благодаря Java было создано множество современных платформ:
- стриминговые сервисы Netflix, Spotify и Okko;
- серверная часть портала Госуслуг;
- соцсети Twitter и LinkedIn;
- архитектура крупных онлайн-магазинов Ebay и Amazon;
- Яндекс.Маркет и КиноПоиск;
- банковские приложения;
- сервисы доставки еды и продуктов.
Язык пользуется спросом не только среди разработчиков, но и:
- тестировщиков-автоматизаторов программного обеспечения;
- дата-сайентистов. У Java есть мультиплатформа JOONE Neural Engine, на которой можно создавать, обучать и тестировать нейронные сети;
- генетиков. Например, в библиотеке Jenetics можно создавать генетические и эволюционные алгоритмы;
- физикам. С помощью Java-апплетов (компьютерных анимаций) можно моделировать физические законы и процессы.
Для чего еще используется язык программирования Java:
- изучение космического пространства с NASA;
- дистанционное наблюдение за пациентами;
- создание программного обеспечения для анализа рынка;
- создание торговых автоматов;
- использование Twitter, который создан с помощью Java.
Скачущий мяч
Теперь я заставлю мяч перемещаться по полю. В случае JavaScript-кода я ссылался в HTML на файл ping.js точно так же, как делал это с CSS. Я добавлю этот код в новый файл с тем же именем. Я создам объекты для мяча и каждого из игроков, но буду использовать для объектов шаблон фабрики.
Это простая концепция. Функция Ball создает новый мяч, когда вы вызываете ее. Использовать ключевое слово new не требуется. Этот шаблон исключает некоторую путаницу вокруг переменной Ball, проясняя доступные свойства объекта. А поскольку у меня всего час на создание этой игры, нужно свести к минимуму любые запутанные концепции.
Структура этого шаблона, когда я создаю простой класс Ball, показана на рис. 6.
Рис. 6. Класс Ball
Чтобы создать новый мяч, я просто вызываю только что определенную функцию:
Теперь я хочу заставить мяч перемещаться и скакать по экрану. Сначала мне нужно через какой-то интервал вызывать функцию update, чтобы создать анимацию мяча. Современные браузеры предоставляют функцию, предназначенную для этой цели, — requestAnimationFrame. Она принимает функцию как аргумент и вызовет эту переданную функцию, когда она в следующий раз запустит свой цикл анимации. Это позволяет плавно перемещать мяч, когда браузер готов к обновлению. Вызывая переданную функцию, он дает ей время, измеряемое в секундах, так как страница должна загрузиться
Это крайне важно, чтобы анимация не потеряла целостность со временем. В игре requestAnimationFrame используется так:
Заметьте, что requestAnimationFrame снова вызывается в функции, когда обновление мяча закончено. Это гарантирует непрерывность анимации.
Хотя этот код работает, может возникнуть проблема, если скрипт начинает выполняться до полной загрузки страницы. Чтобы избежать этого, я запускаю код, когда страница загружена, и использую для этого jQuery:
Поскольку я знаю скорость мяча (velocity) и время с момента ее последнего обновления, я могу выполнить некоторые простые физические расчеты, чтобы перемещать мяч вперед:
Попробуйте запустить этот код и вы увидите, что мяч движется под углом, а потом вылетает за пределы экрана. Это забавно для первого раза, но, как только мяч пересекает край экрана, уже не до смеха. Поэтому следующий шаг — сделать так, чтобы мяч отскакивал от краев экрана, как реализовано на рис. 7. Добавьте этот код и запустите приложение: вы увидите постоянно скачущий мяч.
Рис. 7. Простая физика отскакивания мяча
Делаем игру немного умнее
Игра почти готова. Жаль, что играть вам не с кем. В качестве последнего этапа я покажу, как управлять оппонентом с помощью простой ИИ. Оппонент будет пытаться держаться параллельно мячу, когда тот летит в его сторону. Если оппонент ловит мяч, он перемещается случайным образом и бросает мяч в случайном направлении. Чтобы сделать ИИ чуточку человечнее, я добавлю задержки во все, что делается на поле. Это не особо умный ИИ, но все же против него будет можно играть.
При разработке системы такого рода хорошо мыслить состояниями. ИИ оппонента имеет три возможных состояния: following (следует), aiming/shooting (прицеливание/бросок) и waiting (ожидание). Начнем только с объекта AI:
В зависимости от состояния AI (ИИ) я хочу, чтобы он выполнял разные действия. По аналогии с мячом я создам функцию update, которую смогу вызывать в requestAnimationFrame, чтобы AI действовал в соответствии со своим состоянием:
Состояние FOLLOWING достаточно простое. Оппонент перемещается в вертикальном направлении мяча, и AI переходит в состояние WAITING, чтобы добавить некоторое замедление реакции. Эти два состояния показаны на рис. 15.
При разработке системы такого рода хорошо мыслить состояниями.
Рис. 15. Простое состояние FOLLOWING
Используя код с рис. 15, AI выбирает между следованием за мячом и ожиданием доли секунды. Теперь добавляем код в функцию update уровня всей игры:
Запустив игру, вы увидите, что оппонент следует за перемещениями мяча — не такой уж и плохой ИИ, состоящий менее чем из 30 строк кода. Конечно, если оппонент поймает мяч, он ничего делать не будет. Поэтому на излете отведенного мне часа пора заняться обработкой действий для состояния AIMING. Я хочу, чтобы ИИ заставлял вашего оппонента случайным образом перемещаться несколько раз, а затем кидать мяч в случайном направлении. На рис. 16 добавлена закрытая функция, которая именно это и делает. Добавление функции aimAndFire к выражению case с AIMING создает полнофункциональный ИИ, против которого интересно играть.
Рис. 16. ИИ прицеливается и бросает мяч
Solar 2D
Бесплатный фреймворк (набор готовых функций для использования), разработанный в 2009 году. Ранее движок распространялся под названием Corona SDK. Основная цель — создание мобильных и десктопных приложений на базе скриптов Lua. В мае 2020 года в связи с закрытием компании Corona Labs Inc. произошёл ребрендинг, и теперь, как и в случае с Godot, поддержка и развитие движка осуществляется через пожертвования. Есть активное русскоязычное сообщество. Исходный код можно скачать с GitHub.
Game of Sultans — игра созданная на Solar 2D
Достижения:
- за всё время существования движка на нём создано более 000 приложений на Android;
- игру Bubble Ball (2010), созданную 14-летним подростком на Solar 2D, скачали два миллиона раз за две недели после релиза на iOS;
- на Solar 2D также создана Game of Sultans, известная в России как «Великий Султан»: у неё более 10 миллионов загрузок, она лидер по продажам в 2019 году.
Преимущества:
- возможность быстро разработать проект (скрипты Lua просто освоить);
- небольшой объём приложений;
- кроссплатформенность (iOS, tvOS, Android, Android TV, macOS, Windows, Linux, HTML5);
- поддержка сторонних API и библиотек (C/C++/Obj-C/Java);
- большое разнообразие плагинов для расширения функциональности.
Недостатки:
- не поддерживает консоли;
- позволяет работать только с 2D;
- нет визуального редактора — только окно со строками кода;
- не подходит для крупных проектов.
Игры на движке: CarMaker, Game of Sultans, The Lords of the Earth Flame, Incursion Defense: Cards TD, Edorium, Beasts Battle.
«Сообщество Solar 2D хоть и небольшое, но активное. Благодаря открытому исходному коду любой толковый программист может написать плагин к движку и развивать его. Solar 2D подходит для создания небольших казуалок, но при желании можно сделать что-нибудь сложнее. Если сравнивать с движками, которые под силу освоить даже художнику или сценаристу, то у Solar 2D порог входа выше, так как требуются навыки программирования».
Сергей Поморин, инди-разработчик (Beasts Battle, Necromancer Returns, Magicians Legacy)
Necromancer Returns
Анимация взрыва астероида
При поражении ракетой астероида происходит анимация взрыва. Астероид разрывается на части и каждый осколок летит в своем направлении. Использовании случайных чисел в выборе направления движения осколков повышает разнообразие взрывов и повышает естественность визуализации поражения цели. В исходнике этой игры объект астероида состоит из 5-ти частей. При желании можно улучшить естественность взрыва, добавив ещё и анимацию огня при событии взрыва. Это также можно сделать с помощью спрайтовой анимации. Благо всю кропотливую работу низкоуровневого рендеринга берут на себя модули SFML.
Какие Ещё Навыки Вам Нужны?
Опять же, если вы всерьёз взялись за тему, как создать игру, то вам нужно освоить не только языки программирования. Полный набор разработчика игр может включать в себя целый спектр различных программ, инструментов, фреймворков и библиотек. Давайте рассмотрим несколько важных навыков для создания игры.
Заметка: Не забывайте, что разные типы игры требуют различных знаний и навыков.
Как Использовать Различные Программы
Вы уже знаете, что программы являются важной частью при создании сложных игр. Особенно это касается консольных игр
Одной из самых популярных и известных многим программ является Unity – кроссплатформенный игровой движок, который позволяет создавать различные типы игр.
Преимущества
- Огромное разнообразие курсов
- Простая навигация
- Нет технических проблем
Особенности
- Огромное разнообразие курсов
- Политика 30-дневного возврата средств
- Бесплатные сертификаты об окончании
Посмотреть На Все Купоны Лучших Платформ Для Онлайн Обучения Преимущества
- Простой в использовании
- Предлагает качественный контент
- Очень открытый в своих ценах
Особенности
- Бесплатные сертификаты об окончании
- Фокус на навыки науки о данных
- Гибкое расписание занятий
Посмотреть На Все Купоны Лучших Платформ Для Онлайн Обучения
Навыки Дизайна
Создание игр самому возможно, но тогда вам придётся овладеть ещё несколькими важными навыками. Дизайн игр один из таких навыков
Создание концепта и идеи игры настолько же важно, насколько программирование – можно сказать, что программирование даже не начнётся, пока вы не придумаете дизайн вашей игры! Однако вы бы не читали эту статью, если бы у вас не было своих идей, ведь так?
Заключение
Я вновь повторю, обучение тому, как создать игру может быть интересным, полезным и очень сложным. Однако, если у вас есть неугасаемый интерес и должная мотивация, оно явно того стоит. Начните с самых базовых процессов, которые необходимо для создания игры. Даже самые простые игры требуют определённого концепта и видения. Этот концепт должен быть воплощен в проектный документ, способный помочь вам вести организованную разработку.
Если вы ещё не имеете навыков программирования, то вам нужно будет потратить несколько месяцев, чтобы изучить хотя бы один язык программирования. Вам также скорее всего будет полезно получить опыт работы с игровыми движками, вроде Unity.
Кроме этого, не упускайте из виду общую картину. Начните с меньшего. Сделайте карточную игру, игру про слова или что-то очень простое для начала.
Запомните, обучение созданию игр это не простое занятие, оно может потребовать от вас много времени и сил, но в конце концов ваши усилия вознаградятся!
Перед началом работы
Вам потребуются базовые знания в таких разделах языка C++ как функции, рекурсия, классы и наследование классов. В качестве среды разработки была выбрана бесплатная версия Microsoft Visual Studio 2017 Community Edition в операционной системе Windows 7 (детально об установке IDE). Если версии вашей операционной системы или среды разработки не совпадают с вышеуказанными версиями, то некоторые детали или внешний вид отдельных компонентов могут отличаться от тех, которые вы будете видеть на скриншотах данного туториала. Также не советую использовать Express-версии пакета Visual Studiо, т.к. в них не входит компонент MFC.
Мотивация
Зачем так делать?
Чтобы научиться программировать. А точнее — чтобы научиться переносить человеческие мысли в код. Обычные задания по программированию плохо тренируют этот навык потому что они скучные. Признаюсь честно, я намеренно готовил скучные задания для своих студентов. Нудные задания на превращение двух чисел в третье неизбежны, чтобы освоить базовые концепции. Такие задания помогут вам спуститься по горной реке, заполненной острыми камнями синтаксиса и водоворотами новых концепций. Проблема в том, что простые понятные задания однажды бросят вас в бескрайнем океане возможностей. Тогда вы обнаружите, что можете плыть куда угодно. Однако никто не подскажет вам верное направление. Ни одна платформа с автоматической проверкой решений не сможет проверить творческую работу и поставить оценку. Это может сделать либо живой преподаватель, либо живой напарник.
В статье ничего не будет про создание конкретной игры. Потому что конкретная игра — конкретные правила. А правила вы должны придумать сами. Дайте волю своему воображению, вспомните свою любимый жанр и сделайте хорошую попытку. Единственное ограничение — мы не будем рисовать красивую картинку. Потому что красивая картинка займет слишком много сил и будет только отвлекать нас от упоения кодом. Скажу по секрету, как только вы сделаете свою игру с помощью символов в черном окошечке, то сможете воплотить ваш замысел на любой другой платформе. Интересная игра будет интересна даже в консоли.
Почему C++?
Главная причина в том, что я сейчас веду индивидуальные занятия по C++ у одного талантливого студента. Его успехи вдохновили меня, а его вопросы показали о чем вообще нужно написать. C++ до сих пор рекомендуют как «язык для обучения». Это вселяет надежду, что статья будет полезна многим. Может быть когда-нибудь я напишу такую же статью и для других языков или для Linux, но не рассчитывайте на это. Если вы напишете сами подобный сборник советов для другого языка, то сообщите мне личным сообщением. Я добавлю ссылку на ваш труд.
Что нужно знать, чтобы понять статью?
Если вы понимаете концепцию циклов, массивов и функций, то вам должно быть достаточно. Предупреждаю сразу, в статье будут магические конструкции, которые я не буду объяснять. У меня нет цели сделать всеобъемлющий курс по C++. Цель — писать код и радоваться тому, как оно почти магически заработает. Когда закончите с основной целью или когда встретитесь с непреодолимыми проблемами, тогда и углубляйтесь.
Расстановка и подсчет мин
Для расстановки мин на игровом поле воспользуемся генератором случайных чисел с заданным диапазоном значений от до . Если выпадает ноль, то ставим мину (), в противном случае — пустая клетка (). Индексы и совпадают с порядковыми номерами соответствующих изображений в текстуре:
Sprite s(t);
for (int i = 1; i <= 10; i++)
for (int j = 1; j <= 10; j++)
{
gridView = 10;
if (rand() % 5 == 0) gridLogic = 9;
else gridLogic = 0;
}
1 |
Sprites(t); for(inti=1;i<=10;i++) for(intj=1;j<=10;j++) { gridViewij=10; if(rand()%5==)gridLogicij=9; elsegridLogicij=; } |
Дальше реализуем подсчет мин, окружающих каждую клетку. Для этого в двойном цикле for поочередно пройдемся по каждой клетке. Если в текущей клетке уже стоит мина, то просто переходим к новому шагу итерации. Если же в текущей клетке мины нет, то с помощью девяти условий if поочередно проверяем все примыкающие к ней клетки. Если там есть мины, то на каждом сработавшем if увеличиваем счетчик количества мин на :
Sprite s(t);
for (int i = 1; i <= 10; i++)
for (int j = 1; j <= 10; j++)
{
…
…
}
// Подсчет мин вокруг каждой клетки
for (int i = 1; i <= 10; i++)
for (int j = 1; j <= 10; j++)
{
int n = 0;
if (gridLogic == 9) continue;
if (gridLogic == 9) n++;
if (gridLogic == 9) n++;
if (gridLogic == 9) n++;
if (gridLogic == 9) n++;
if (gridLogic == 9) n++;
if (gridLogic == 9) n++;
if (gridLogic == 9) n++;
if (gridLogic == 9) n++;
gridLogic = n;
}
1 |
Sprites(t); for(inti=1;i<=10;i++) for(intj=1;j<=10;j++) { … … } // Подсчет мин вокруг каждой клетки for(inti=1;i<=10;i++) for(intj=1;j<=10;j++) { intn=; if(gridLogicij==9)continue; if(gridLogici+1j==9)n++; if(gridLogicij+1==9)n++; if(gridLogici-1j==9)n++; if(gridLogicij-1==9)n++; if(gridLogici+1j+1==9)n++; if(gridLogici-1j-1==9)n++; if(gridLogici-1j+1==9)n++; if(gridLogici+1j-1==9)n++; gridLogicij=n; } |
Посмотрим, что у нас получилось. Для этого добавим строку , тем самым отобразив всё поле на экране:
while (app.isOpen())
{
…
for (int i = 1; i <= 10; i++)
for (int j = 1; j <= 10; j++)
{
gridView = gridLogic;
…
}
app.display();
}
return 0;
}
1 |
while(app.isOpen()) {
… for(inti=1;i<=10;i++) for(intj=1;j<=10;j++) { gridViewij=gridLogicij; … } app.display(); } return; } |
Результат выполнения программы:
Примечание: Учитывайте, что расстановка мин генерируется случайным образом. Поэтому ваш результат запуска программы наверняка будет отличаться от того, что изображено на вышеприведенной картинке.
Итог
В результате проделанной работы мы сделали первые шаги к тому, чтобы написать игру. А именно научились управлять объектом, то есть нашим героем-треугольником, с которым мы также поработаем в будущих уроках по написанию первой нашей игры.
В видеоуроке даны дополнительные комментарии и объяснения к проекту, а также продемонстрирована работа приложения.
Полный список статей данного цикла:
- Урок 1. Как написать игру на Qt. Управление объектом
- Урок 2. Как написать игру на Qt. Анимация героя игры (2D)
- Урок 3. Как написать игру на Qt. Взаимодействие с другими объектами
- Урок 4. Как написать игру на Qt. Враг — смысл в выживании
- Урок 5. Как написать игру на Qt. Добавляем звук с QMediaPlayer