Практическое руководство
Как создать текстовую игру на языке C — шаг за шагом, от пустого файла до полноценного приключения
Текстовые игры — идеальный первый серьёзный проект программиста: никакой графики и сложных библиотек, только чистая логика, ветвления и работа со строками. Ниже — полный разбор архитектуры, работающие примеры кода и план развития проекта.
Почему именно C и именно текстовая игра
Язык C заставляет понимать, как программа работает «под капотом»: память, строки, указатели, потоки ввода-вывода. Текстовая игра использует все эти механизмы естественным образом — обучение превращается в увлекательный процесс, а не в зубрёжку синтаксиса.
⚙️
Ветвление логики
if / else, switch — сердце любого сюжета с выбором
🧵
Работа со строками
fgets, strcmp, strtok — ввод и разбор команд игрока
📦
Структуры данных
struct — описание игрока, комнат и предметов
🔄
Цикл игры
while (running) — классическая игровая петля
Архитектура: главный цикл игры
Любая текстовая игра — это бесконечный цикл из четырёх фаз. Он повторяется, пока игрок не победит или не погибнет:
📖
1. Описание
Игра показывает комнату и ситуацию
⌨️
2. Ввод
Игрок вводит команду: «идти север»
🧠
3. Обработка
Команда разбирается и меняет состояние
🎬
4. Результат
Игра сообщает, что произошло
Шаг 1. Минимальный каркас: «Угадай действие»
Начать стоит с самой простой версии — одного выбора и двух исходов. Уже здесь видна вся логика ветвления:
#include <stdio.h> #include <string.h> int main(void) { char choice[10]; printf("Вы стоите перед тёмной пещерой.\n"); printf("Войти или уйти? > "); fgets(choice, sizeof(choice), stdin); if (strncmp(choice, "войти", 5) == 0) { printf("Внутри мерцает свет факела...\n"); } else { printf("Вы возвращаетесь домой. Приключение отменяется.\n"); } return 0; }
💡 Важный нюанс: функция fgets сохраняет символ перевода строки \n в конец введённого текста. Чтобы сравнение строк срабатывало корректно, нужно либо обрезать его (choice[strcspn(choice, "\n")] = 0;), либо использовать strncmp с ограничением длины, как в примере выше.
Шаг 2. Структуры: игрок, комната, предмет
Когда появляется мир из нескольких локаций, держать данные в разрозненных переменных невозможно. На помощь приходят структуры:
typedef struct { char name[50]; int health; // здоровье int has_key; // есть ли ключ (0 или 1) } Player; typedef struct { const char *title; const char *description; int north, south; // номера соседних комнат, -1 = нет выхода } Room;
Мир как массив комнат
Весь игровой мир удобно хранить одним массивом: каждая комната знает индексы соседей. Пример карты из трёх локаций:
| Индекс | Комната | north | south |
|---|---|---|---|
| 0 | Поляна перед пещерой | 1 | −1 |
| 1 | Тёмный коридор | 2 | 0 |
| 2 | Сокровищница | −1 | 1 |
Шаг 3. Парсер команд: «идти север»
Классика жанра — команды из двух слов: глагол + направление. Функция strtok разбивает строку на токены:
static int current = 0; // текущая комната void parse(char *input, Room world[], Player *p) { input[strcspn(input, "\n")] = 0; // убрать \n char *verb = strtok(input, " "); char *noun = strtok(NULL, " "); if (verb && strcmp(verb, "идти") == 0) { int dest = -1; if (noun && strcmp(noun, "север") == 0) dest = world[current].north; else if (noun && strcmp(noun, "юг") == 0) dest = world[current].south; if (dest != -1) current = dest; else printf("Туда нет пути.\n"); } else if (verb && strcmp(verb, "осмотреться") == 0) { printf("%s\n", world[current].description); } else { printf("Неизвестная команда. Попробуйте: идти, осмотреться\n"); } }
Типичные ошибки новичков и их решения
| Проблема | Причина | Решение |
|---|---|---|
| Сравнение строк не срабатывает | В конце ввода остался символ \n | Обрезать через strcspn до сравнения |
| Программа падает при выходе за карту | Нет проверки значения −1 | Всегда валидировать индекс комнаты |
| Лишний ввод «съедает» следующую команду | Смешение scanf и fgets | Использовать только fgets по всему проекту |
| Ввод вместо команды ломает игру | Нет обработки неизвестных команд | Всегда добавлять ветку else с подсказкой |
Дорожная карта развития проекта
Проект растёт итерациями — каждая новая версия добавляет одну механику и остаётся работоспособной:
Версия 0.1 — «Скелет»
Одна комната, одна команда, запуск и выход из игры
Версия 0.3 — «Мир»
Массив комнат, перемещение, игровой цикл while
Версия 0.5 — «Инвентарь»
Предметы, команда «взять», условия (нужен ключ для двери)
Версия 0.8 — «Сюжет»
Несколько концовок, здоровье игрока, опасные события
Версия 1.0 — «Релиз»
Сохранение в файл, баланс, полировка текста
Идеи для усложнения игры
🎲 Случайные события
rand() и srand(time(NULL)) для встреч с монстрами с переменным исходом
💾 Сохранения
fprintf и fscanf — запись состояния игрока и комнаты в текстовый файл
⚔️ Боевая система
Здоровье, урон, защита — простые формулы на основе характеристик в struct
🧠 Умный парсер
Синонимы команд («север», «н», «идти на север») через таблицу соответствий
Главный секрет успешного проекта — маленькие работающие шаги
Текстовая игра на C — это одновременно обучение и творчество. Начав с трёх строк вывода текста, проект естественно вырастает в полноценный мир со структурами, файлами и собственным сюжетом. Правило одно: каждая версия должна компилироваться и играться. Тело пути — это уже само приключение.
Целое приключение — в одном телеграм-боте 🌍
Не нужно ничего скачивать, регистрироваться и разбираться в сложных интерфейсах. Открыли Telegram — и вы уже в текстовой ролевой игре с ИИ. Идеально на 10 минут в обеденный перерыв или на целый вечер: история подождёт и продолжится с того же места, где вы остановились.
Открыть бота 👉 https://clck.ru/3Ta8kQ

