Основы C++: создание первой консольной игры с нуля

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

1. Введение в C++ и базовый ввод-вывод

Введение в C++ и базовый ввод-вывод

Создание игр — это искусство управления ресурсами компьютера для создания интерактивных миров. Язык программирования C++ является индустриальным стандартом в разработке игр. На нём написаны крупнейшие игровые движки, такие как Unreal Engine, и созданы культовые проекты от The Witcher до Counter-Strike.

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

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

Анатомия первой программы

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

Рассмотрим минимальный каркас кода, который необходим для запуска любого приложения:

Этот небольшой фрагмент текста — полноценная, хотя и пустая, программа. Разберем её элементы:

  • #include <iostream> — это директива препроцессора. Представьте, что вы собираетесь строить дом, и вам нужен ящик с инструментами. Эта строка говорит компьютеру: «Подключи библиотеку Input/Output Stream (поток ввода-вывода)». Без неё программа будет «слепой и немой» — она не сможет ни читать нажатия клавиш, ни выводить текст на экран.
  • int main() — это главная функция. Точка входа в программу. Когда вы запускаете игру, компьютер ищет именно слово main и начинает выполнять команды строго внутри неё.
  • { и } — фигурные скобки обозначают границы функции. Всё, что находится между ними, называется телом функции. Это арена, на которой разворачиваются события игры.
  • return 0; — команда успешного завершения. Она сообщает операционной системе, что игра закрылась без ошибок (вернула код 0).
  • !Структура базовой программы на C++

    Вывод данных: заставляем игру говорить

    Игра должна уметь сообщать игроку о том, что происходит: описывать локации, выводить диалоги NPC или показывать количество очков здоровья. Для этого используется инструмент std::cout (от английского Character Output — символьный вывод).

    Добавим в наш каркас приветственное сообщение для игрока:

    > Синтаксис — это набор строгих правил написания кода. Если в русском языке мы ставим точку в конце предложения, то в C++ в конце каждой команды ставится точка с запятой ;.

    Инструмент std::cout работает в паре с оператором <<. Этот оператор похож на стрелку, которая показывает направление движения данных: мы берем текст "Добро пожаловать в Темное Подземелье!" и отправляем его в консоль.

    Обратите внимание на приставку std::. Она означает принадлежность к стандартному пространству имен (Standard Namespace). Это своеобразная «фамилия» инструмента, чтобы компьютер точно знал, какой именно cout мы хотим использовать.

    Символы \n внутри кавычек — это специальная команда перехода на новую строку. Без неё оба предложения слиплись бы в один длинный текст.

    Переменные: инвентарь для данных

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

    Переменную можно представить как коробку с наклейкой. На наклейке написано имя коробки, а внутри лежит значение. В C++ коробки бывают разных типов, и в коробку для чисел нельзя положить текст.

    Для старта нам понадобятся два базовых типа:

  • int (integer) — для хранения целых чисел (например, 100 очков здоровья, 5 зелий).
  • std::string — для хранения текста (например, имя персонажа, название меча).
  • Создадим несколько переменных для нашего героя:

    В этом примере мы объединяем обычный текст в кавычках и значения переменных с помощью нескольких операторов << в одной строке. Компьютер аккуратно склеит их при выводе на экран.

    Переменные называются так именно потому, что их значения могут меняться в процессе игры. Если герой получит урон, мы можем изменить значение переменной с помощью математической операции.

    В геймдизайне расчет нового здоровья после получения урона описывается простой формулой:

    Где — новое значение здоровья, — текущее здоровье, а — полученный урон. В коде это будет выглядеть так: heroHealth = heroHealth - 15;.

    Ввод данных: слушаем команды игрока

    Игра без участия игрока — это просто кино. Чтобы персонаж реагировал на наши действия, программа должна уметь считывать нажатия клавиш. Для этого применяется поток ввода std::cin (Character Input).

    Когда программа доходит до команды std::cin, она буквально ставит игру на паузу и ждет, пока игрок напечатает что-нибудь на клавиатуре и нажмет клавишу Enter.

    | Инструмент | Оператор | Направление данных | Назначение в игре | | :--- | :--- | :--- | :--- | | std::cout | << | Из программы на экран | Вывод сюжета, характеристик, меню | | std::cin | >> | С клавиатуры в программу | Ввод имени, выбор действия, ответы |

    Напишем сцену, где стражник у ворот спрашивает имя игрока и его возраст:

    Обратите внимание на направление стрелок >> при использовании std::cin. Они показывают, что данные текут с клавиатуры прямо внутрь переменной playerName.

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

    Объединение концепций: первый шаг к игре

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

    Представьте классическую ролевую игру. В самом начале вам всегда предлагают создать персонажа. Вы вводите имя, выбираете класс, и система генерирует ваши начальные характеристики. Используя только std::cout, std::cin и переменные, вы уже можете написать генератор профиля персонажа, который будет приветствовать игрока по имени и отображать его стартовый инвентарь.

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