Текстовая игра — это идеальный первый проект для изучения программирования. Никакой графики, никаких сложных движков: только чистая логика, ветвления сюжета и код на Python, который можно написать за один вечер. В этом руководстве разобрано всё: от первой строки до инвентаря, системы боёв и сохранения прогресса.
Что такое текстовая игра и почему её код учит программировать
Текстовая игра (interactive fiction, «текстовый квест») — это игра, в которой мир описывается словами, а игрок взаимодействует с ним, выбирая варианты действий или вводя команды. Жанр существует с 1970-х годов и до сих пор живёт в форматах от классических Zork и Colossal Cave Adventure до современных визуальных новелл и ботов-игр.
С точки зрения обучения код текстовой игры — это концентрат базовых конструкций программирования:
Три подхода к коду текстовой игры
Прежде чем писать первую строку, стоит определиться с архитектурой. От этого зависит, насколько легко игра будет расширяться.
| Подход | Суть | Подходит для | Масштабируемость |
|---|---|---|---|
| Линейный (цепочка 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)
Нет — конец игры
Шаг 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
Пять типичных ошибок в коде текстовой игры
.strip().lower().dict.get(), чтобы игра не падала, а вежливо сообщала об ошибке.Что добавить в игру дальше
Итог
Код текстовой игры — это не хобби-проект «для галочки», а превосходный тренажёр, объединяющий условия, циклы, функции, структуры данных и случайные числа в одной увлекательной задаче.
Формула проста: минимальный прототип → игровой цикл → мир в словаре → боевая система. Каждый шаг добавляет всего несколько строк, а игра уже становится заметно глубже. Осталось только написать первую строку истории.
Надоели сериалы и однотипные игры? 🎬
Попробуйте текстовые ролевые игры с ИИ-персонажами — это как интерактивная книга, где главный герой вы сами. Никакого пассивного просмотра: вы говорите, действуете и влияете на сюжет. ИИ подыгрывает в роли персонажа и ведёт историю дальше — увлекает не хуже любимого сериала, только теперь главный — вы.
Попробовать новый формат 👉 https://clck.ru/3Ta8kQ

