C текстовая игра: пошаговое руководство по созданию собственной текстовой игры на языке программирования C с нуля

Играть в текстовые ролевые игры бесплатно

Практическое руководство

Как создать текстовую игру на языке 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

Играть в текстовые ролевые игры бесплатно