Для тренировки навыков работы на Python можно попробовать написать простую RPG — собственную текстовую вселенную с героями, инвентарём и боевой системой. Это классический учебный проект: он компактный, но затрагивает классы, циклы и работу с состоянием — то, с чем реально сталкиваешься в боевом коде.
Ниже — пошаговый туториал: от базовых классов персонажа до инвентаря, критических ударов, системы уровней, сохранения прогресса и перемещения между локациями. Если нужна не учебная, а рабочая игра или бэкенд под проект — команда YuSMP Group берётся за разработку backend-части на заказ, а здесь разберём базовые механики на Python самостоятельно.
Это тренировочный вариант для тех, кто только начинает осваивать геймификацию и ООП — код специально упрощён, чтобы сфокусироваться на логике, а не на графике.
- Текстовая RPG на Python строится на трёх классах: персонаж, предмет и игровой мир.
- Игровой цикл — это
while True, который читает команду игрока и меняет состояние мира. - Инвентарь, критический удар, уровни и сохранение в JSON добавляются поверх базовой структуры без переписывания кода.
- Весь код использует только стандартную библиотеку Python — сторонние пакеты не нужны.
Что понадобится для старта
Прежде чем писать код, установите и проверьте окружение:
- Python 3.10 или новее — скачать можно с официального сайта python.org.
- Любой текстовый редактор или IDE — подойдут VS Code, PyCharm Community или встроенный IDLE.
- Терминал или консоль — весь код ниже запускается командой
python game.pyбез сторонних библиотек.
Как написать игру на питоне
Установите Python, если ещё не сделали этого раньше, — скачайте актуальную версию с официального сайта. После установки переходите к написанию кода игры на Python: ниже пять шагов от базовых классов до запуска.
Шаг 1: Создание классов для персонажей и предметов
Первым шагом опишите классы для героев и предметов. Метод __init__ — это конструктор: он вызывается автоматически при создании объекта и задаёт его начальные атрибуты через self — ссылку на сам объект.
class Character:
def __init__(self, name, health, damage):
self.name = name
self.health = health
self.damage = damage
def is_alive(self):
return self.health > 0
class Item:
def __init__(self, name, description):
self.name = name
self.description = description
Метод is_alive() ещё пригодится в игровом цикле и боевой системе ниже, чтобы не дублировать проверку health > 0 в разных местах кода. В виртуальном мире герои могут иметь разные наборы способностей — тест на класс в RPG как раз задаёт такой набор навыков: для каждого класса персонажа стоит прописать свой набор скиллов и особенностей.
Шаг 2: Создание игрового мира
Опишите класс, который объединит персонажей и предметы в одном игровом мире.
class World:
def __init__(self, characters, items):
self.characters = characters
self.items = items
На этом этапе World — просто контейнер. В следующих шагах мы дополним его инвентарём игрока и локациями, не трогая уже написанный код персонажей.
Шаг 3: Разработка игрового цикла
Игровой цикл — это while True, который на каждой итерации выводит состояние мира, считывает команду игрока и меняет игровое состояние в зависимости от неё.
def game_loop(world):
player = Character("Player", 100, 10)
print("Welcome to the game!")
while True:
# Вывод информации о мире
print("Characters:")
for character in world.characters:
print(f"- {character.name} ({character.health} HP)")
print("Items:")
for item in world.items:
print(f"- {item.name}: {item.description}")
# Ввод команды игрока
command = input("What do you want to do? ")
# Обработка команды игрока
if command == "quit":
print("Goodbye!")
break
elif command == "attack":
enemy = world.characters[0]
enemy.health -= player.damage
print(f"You attacked {enemy.name} for {player.damage} damage.")
if not enemy.is_alive():
print(f"{enemy.name} died!")
world.characters.remove(enemy)
else:
print("Unknown command.")
Три момента, на которые стоит обратить внимание: команду лучше сравнивать через command.lower(), чтобы не зависеть от регистра; цикл не завершается сам — выход только по команде quit; а список world.characters изменяется прямо во время перебора (remove), поэтому в более крупном проекте «мёртвых» персонажей лучше сначала собрать в отдельный список и удалить после итерации.
| Команда | Что делает |
|---|---|
attack | Атакует первого противника в списке world.characters |
quit | Завершает игровой цикл и выходит из игры |
| любая другая строка | Выводит «Unknown command.» — обработчик по умолчанию |
Дальше добавим команды take, inventory, use и go — они расширяют тот же if/elif, не меняя структуру цикла.
Шаг 4: Создание виртуальной вселенной
Создайте экземпляр класса World и наполните его персонажами и предметами.
world = World(
[
Character("Goblin", 50, 5),
Character("Troll", 100, 15),
],
[
Item("Sword", "A sharp sword."),
Item("Health Potion", "A healing potion."),
],
)
Шаг 5: Запуск игры
Запустите игровой цикл с созданным виртуальным миром.
game_loop(world)
Вот и всё — простая текстовая РПГ на Python готова и запускается из консоли. Это базовый шаблон: дальше добавим инвентарь, боевую систему, уровни, сохранение и перемещение между локациями — без переписывания того, что уже есть.
Как добавить инвентарь и подбор предметов
Сейчас предметы лежат в world.items, но игрок не может их подобрать. Добавьте инвентарь персонажу и метод для подбора вещей.
class Character:
def __init__(self, name, health, damage):
self.name = name
self.health = health
self.damage = damage
self.inventory = []
def is_alive(self):
return self.health > 0
def pick_up(self, item, world):
self.inventory.append(item)
world.items.remove(item)
print(f"You picked up {item.name}.")
В игровом цикле добавьте ветку elif command == "take":, которая вызывает player.pick_up(item, world) для первого предмета из world.items, и ветку elif command == "inventory":, которая печатает содержимое player.inventory. Так игрок сможет собирать вещи по пути, а не просто видеть список предметов в мире.
Боевая система: критический удар и зелья лечения
Базовая атака наносит фиксированный урон — добавьте элемент случайности и возможность использовать зелье здоровья, которое мы создали на шаге 4.
import random
class Character:
# ...остальные методы без изменений...
def attack(self, target):
is_critical = random.random() < 0.2
damage = self.damage * 2 if is_critical else self.damage
target.health -= damage
label = "критический удар" if is_critical else "удар"
print(f"{self.name} наносит {target.name} {label} на {damage} урона.")
def heal(self, item):
if item.name == "Health Potion":
self.health += 30
self.inventory.remove(item)
print(f"{self.name} восстанавливает здоровье зельем.")
else:
print(f"{item.name} нельзя использовать для лечения.")
Шанс критического удара — 20% (random.random() < 0.2), при попадании урон удваивается. Метод heal() ищет в инвентаре именно зелье здоровья и убирает его после использования — так игрок не может вылечиться одним и тем же зельем бесконечно.
Опыт, уровни и сохранение прогресса
Начисляйте опыт за победу и повышайте уровень персонажа, когда опыта накопилось достаточно.
class Character:
def __init__(self, name, health, damage):
self.name = name
self.health = health
self.damage = damage
self.inventory = []
self.level = 1
self.exp = 0
def gain_exp(self, amount):
self.exp += amount
if self.exp >= self.level * 100:
self.level += 1
self.exp = 0
self.damage += 5
self.health += 20
print(f"{self.name} достиг {self.level} уровня!")
Порог левел-апа — level * 100 опыта: чем выше уровень, тем больше нужно накопить. Прогресс стоит сохранять между запусками, иначе каждая сессия начинается с нуля:
import json
def save_game(player, path="save.json"):
with open(path, "w", encoding="utf-8") as f:
json.dump(player.__dict__, f, ensure_ascii=False)
def load_game(path="save.json"):
with open(path, encoding="utf-8") as f:
data = json.load(f)
player = Character(data["name"], data["health"], data["damage"])
player.__dict__.update(data)
return player
Формат JSON выбран не случайно: он человекочитаем, не требует внешних библиотек — модуль json входит в стандартную библиотеку Python — и его легко расширить новыми полями, если персонаж обрастёт новыми атрибутами.
Комнаты и перемещение между локациями
Пока весь мир — это один список персонажей и предметов. Чтобы получить полноценное исследование мира, разбейте его на комнаты, связанные переходами.
class Room:
def __init__(self, name, description, exits=None):
self.name = name
self.description = description
self.exits = exits or {} # {"north": другая_комната}
def describe(self):
print(f"\n{self.name}: {self.description}")
if self.exits:
print("Выходы:", ", ".join(self.exits.keys()))
hall = Room("Зал", "Пыльный тронный зал с трещиной в полу.")
dungeon = Room("Подземелье", "Сырое подземелье, пахнет плесенью.")
hall.exits["down"] = dungeon
dungeon.exits["up"] = hall
current_room = hall
current_room.describe()
В игровом цикле добавьте команду go <направление>, которая проверяет, есть ли такой выход в current_room.exits, и если есть — переключает current_room на соседнюю комнату и вызывает её describe(). Для запертых дверей можно добавить в комнату флаг locked и требовать конкретный предмет из инвентаря для прохода.
Что еще добавить
Часть идей из ранней версии этого туториала уже реализована выше — инвентарь, боевая система, уровни, сохранение и комнаты. Что можно доработать дальше:
- Систему квестов и заданий с условиями выполнения и наградами.
- NPC с диалогами и простым деревом решений.
- Более сложные команды атаки — выбор цели и использование навыков, а не только «attack».
- Графическую обёртку поверх текстовой логики — например, через Pygame или консольный UI на curses.
- Юнит-тесты для класса Character, чтобы не сломать баланс при добавлении новых механик.
Удачи с созданием вашей собственной игры на Python!
В блоге студии web-разработки YuSMP Group делимся полезными материалами для начинающих разработчиков, а также для тех, кто хочет заказать проект. Веб-услуги и разработка в YuSMP Group станет отличным решением для тех, кто хочет усилить свой бизнес программными продуктами. Проекты, которые мы создали помогают своим владельцам оптимизировать внутренние процессы, увеличить узнаваемость бренда и выходить на новый уровень дохода.
Часто задаваемые вопросы
С чего начать писать текстовую RPG на Python, если я новичок?
Начните с трёх классов — персонаж, предмет и мир — и простого игрового цикла на while True, как в шагах 1–5 выше. Не пытайтесь сразу добавить инвентарь, бои и сохранения — сначала добейтесь, чтобы игра запускалась и завершалась по команде quit.
Нужны ли внешние библиотеки для текстовой RPG на Python?
Нет — весь код в этом туториале, включая сохранение прогресса через модуль json, использует только стандартную библиотеку Python. Внешние библиотеки, например Pygame, нужны только для графической версии игры.
Как сделать так, чтобы противник наносил случайный урон?
Используйте модуль random: например, random.randint(min, max) для урона в диапазоне или random.random() < шанс для критического удара, как в разделе про боевую систему.
Как сохранить прогресс игрока между запусками игры?
Сериализуйте состояние персонажа в JSON-файл функцией save_game() и восстанавливайте его при следующем запуске через load_game() — пример кода приведён в разделе «Опыт, уровни и сохранение прогресса».
Чем текстовая RPG отличается от полноценной игры на Pygame?
Текстовая RPG работает только через консоль — ввод input(), вывод print() — и не требует графики. Логика игры (классы, циклы, состояние) остаётся такой же, как в игре с графикой, но без рендеринга и обработки событий.
Как добавить второго противника или несколько NPC в мир?
Добавьте больше объектов Character в список world.characters при создании мира — игровой цикл уже перебирает всех персонажей циклом for character in world.characters, так что новые враги появятся в выводе автоматически.
Обсудим ваш проект?
Соберём команду под вашу задачу и оценим проект за 2 дня — бесплатно.




