Как написать код текстовой игры: пошаговое руководство с примерами на Python для начинающих

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

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

Что такое текстовая игра и почему её код учит программировать

Текстовая игра (interactive fiction, «текстовый квест») — это игра, в которой мир описывается словами, а игрок взаимодействует с ним, выбирая варианты действий или вводя команды. Жанр существует с 1970-х годов и до сих пор живёт в форматах от классических Zork и Colossal Cave Adventure до современных визуальных новелл и ботов-игр.

С точки зрения обучения код текстовой игры — это концентрат базовых конструкций программирования:

if / else
Ветвления сюжета — каждый выбор игрока обрабатывается условными конструкциями
while
Главный игровой цикл (game loop) работает, пока игрок жив и не дошёл до финала
dict / list
Инвентарь, характеристики героя и карта локаций хранятся в структурах данных
def
Каждая комната, бой или событие оформляется отдельной функцией

Три подхода к коду текстовой игры

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

Подход Суть Подходит для Масштабируемость
Линейный (цепочка print + input) События идут друг за другом, выборы — через if Первый прототип за 30 минут ★☆☆☆☆
Функциональный (функции-сцены) Каждая локация — функция, которая возвращает следующую сцену Квест с ветвящимся сюжетом ★★★☆☆
Дата-дривен (словарь комнат) Карта мира описана данными, а движок их обходит Большие игры с десятками локаций ★★★★★

Шаг 1. Минимальный прототип за пять минут

Начните с самого простого: функция input() читает ответ игрока, а условия решают, что произойдёт дальше.

# Простейшая текстовая игра
print("Ты стоишь на развилке дорог. Налево — лес, направо — пещера.")
choise = input("Куда пойдёшь? (лес / пещера): ").strip().lower()

if choise == "лес":
    print("В лесу ты находишь старую хижину охотника. Ты спасён!")
elif choise == "пещера":
    print("В пещере спит дракон... и ты его разбудил. GAME OVER")
else:
    print("Нерешительность — тоже выбор. Ты остался на развилке.")

💡 Важная деталь: .strip().lower() делает ввод «нечувствительным» к лишним пробелам и регистру — игрок сможет написать «ЛЕС», « лес » или «Лес», и код отработает одинаково.

Шаг 2. Игровой цикл и состояние персонажа

Настоящая игра не заканчивается после одного выбора. Ей нужны состояние (здоровье, инвентарь) и цикл, который крутится, пока герой жив.

player = dict(hp=100, inventory=[], location="развилка")

while player["hp"] > 0:
    print(f"\n❤ Здоровье: {player['hp']} | 🎒 Инвентарь: {player['inventory']}")
    action = input("Что будешь делать? (идти / отдохнуть / выйти): ").strip().lower()

    if action == "идти":
        player["hp"] -= 15   # дорога утомляет
        print("Ты бредёшь по тропе и натыкаешься на волка!")
    elif action == "отдохнуть":
        player["hp"] = min(100, player["hp"] + 20)
        print("Привал восстанавливает силы.")
    elif action == "выйти":
        break
    else:
        print("Неизвестная команда.")

print("Игра окончена.")
Схема игрового цикла
Показать состояние
игрока
→
Получить команду
через input()
→
Обработать логику
(if / elif / else)
→
Проверить: hp > 0?
Нет — конец игры
↺

Шаг 3. Карта мира в словаре: самый профессиональный подход

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

ROOMS = {
    "развилка": {
        "text": "Развилка. Тропы ведут в лес (лево), пещеру (право) и на поляну (прямо).",
        "exit": {"лево": "лес", "право": "пещера", "прямо": "поляна"},
    },
    "лес": {
        "text": "Тёмный лес. Где-то воет волк. Назад — развилка.",
        "exit": {"назад": "развилка"},
        "danger": 25,  # урон от волка
    },
    "пещера": {
        "text": "Пещера сверкает: здесь спит дракон на сокровищах. Назад — развилка.",
        "exit": {"назад": "развилка"},
        "loot": "кристалл дракона",
    },
    "поляна": {
        "text": "Солнечная поляна. Здесь заканчивается тропа. ПОБЕДА!",
        "exit": {},
        "final": True,
    },
}

def play():
    current_room = "развилка"
    hp = 100
    inventory = []

    while True:
        room = ROOMS[current_room]
        print(f"\n== {current_room.upper()} ==")
        print(room["text"])

        # Награда и урон в локации
        if "loot" in room and room["loot"] not in inventory:
            inventory.append(room["loot"])
            print(f"✨ Ты нашёл: {room['loot']}!")
        if "danger" in room:
            hp -= room["danger"]
            print(f"⚠ Ты ранен! HP: {hp}")

        if room.get("final"):
            print("🏆 Игра пройдена!")
            break
        if hp <= 0:
            print("💀 Ты пал в пути. GAME OVER")
            break

        move = input("Куда идём? ").strip().lower()
        if move in room["exit"]:
            current_room = room["exit"][move]
        else:
            print("Туда идти нельзя. Доступно:", ", ".join(room["exit"]))

play()

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

Ключ комнаты Тип Для чего
«text» строка Описание, которое видит игрок
«exit» словарь Команды перехода → название следующей комнаты
«loot» строка Предмет, попадающий в инвентарь
«danger» число Урон при входе в локацию
«final» логическое Признак финальной сцены

Шаг 4. Боевая система с элементом случайности

Модуль random превращает детерминированный квест в реиграбельную игру. Ниже — компактная функция боя, которую можно вставить в любую текстовую игру:

import random

def fight(hero_hp, enemy_name, enemy_hp):
    print(f"\n⚔ На тебя нападает {enemy_name}!")
    while enemy_hp > 0 and hero_hp > 0:
        # Герой бьёт
        damage_player = random.randint(5, 20)
        enemy_hp -= damage_player
        print(f"Ты бьёшь на {damage_player}. У врага {max(enemy_hp, 0)} HP.")

        if enemy_hp <= 0:
            print(f"✓ {enemy_name} повержен!")
            break

        # Враг бьёт в ответ
        damage_enemy = random.randint(3, 15)
        hero_hp -= damage_enemy
        print(f"{enemy_name} отвечает на {damage_enemy}. У тебя {max(hero_hp, 0)} HP.")
    return hero_hp

Пять типичных ошибок в коде текстовой игры

1. Сравнение ввода без приведения к нижнему регистру
Игрок пишет «ЛЕС» — игра не понимает. Всегда обрабатывайте ввод через .strip().lower().
2. Монолитный код из сотен if-ов
После пятой комнаты запутаться неминуемо. Выносите сцены в функции или данные.
3. Отсутствие выхода в тупике
Каждая локация должна откуда-то вести. Исключение — только финальная сцена.
4. Обращение к словарю без защиты от KeyError
Используйте dict.get(), чтобы игра не падала, а вежливо сообщала об ошибке.
5. Сюжет написан «на лету»
Сначала нарисуйте карту переходов на бумаге, потом переносите её в словарь ROOMS.

Что добавить в игру дальше

Сохранения (модуль json)
Сложность: ★
Классы и ООП (Player, Enemy)
Сложность: ★★
Парсер команд («возьми меч»)
Сложность: ★★★
Цветной вывод (модуль colorama)
Сложность: ★
Сюжет на данных из JSON-файла
Сложность: ★★★★

Итог

Код текстовой игры — это не хобби-проект «для галочки», а превосходный тренажёр, объединяющий условия, циклы, функции, структуры данных и случайные числа в одной увлекательной задаче.

Формула проста: минимальный прототип → игровой цикл → мир в словаре → боевая система. Каждый шаг добавляет всего несколько строк, а игра уже становится заметно глубже. Осталось только написать первую строку истории.

ИИ-персонаж, с которым хочется говорить 💬

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

Начать общение 👉 https://clck.ru/3Ta8kQ

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