Игровой инвентарь на чистом Python: от словарей к датаклассам и JSON без БД
Игровой инвентарь на чистом Python: от словарей к датаклассам и JSON без БД. В разработке игр инвентарь — одна из самых частых задач. Многие новички сразу подключают SQLite, Redis или сложные ORM, даже не подозревая, что 90% проектов на старте можно реализовать тремя стандартными инструментами: словари, датаклассы и JSON. Никаких внешних хранилищ, никаких баз данных — только встроенные возможности Python.
В этой статье мы создадим игровой инвентарь с нуля. Сначала на простых словарях, затем рефакторинг до @dataclass, добавим вес предметов, типы, эффекты и, самое главное, научимся сохранять инвентарь между запусками через JSON. Вы увидите, как датаклассы заменяют десятки строк шаблонного кода и делают проект поддерживаемым.
Этап 1. Инвентарь на словарях
Самый простой способ хранить предметы — словарь, где ключ — название предмета, значение — количество.
Функция добавления предметов
Отображение инвентаря
Пример работы
Все просто и работает. Но что, если у предмета есть вес, тип (оружие, еда, зелье) или эффект? Словарь для этого плохо подходит — придется хранить вложенные структуры.
Проблема словарного подхода
Это быстро превращается в кошмар поддержки. Нет подсказок типов, легко ошибиться в ключах ("weigth" вместо "weight").
Этап 2. Датаклассы — элегантное решение
Датаклассы появились в Python 3.7 и решают ровно эту проблему: автоматически генерируют __init__, __repr__, __eq__ и другие методы.
Как датакласс заменяет boilerplate код
Без датакласса вам пришлось бы писать:
С датаклассом — одна строка @dataclass. Всё остальное автоматически.
Инвентарь на датаклассах
Теперь инвентарь — это словарь str > Item, где ключ — имя предмета (или можно использовать dict[str, Item])
Создание предметов:
Преимущества налицо: самодокументируемый код, автодополнение в IDE, проверка типов mypy.
Этап 3. Сериализация в JSON — сохраняем инвентарь
Самое интересное — инвентарь должен сохраняться между запусками игры. Без БД мы используем JSON.
Проблема: датакласс нельзя просто записать в json.dumps()
json.dumps(inventory) выдаст ошибку, потому что Item — не сериализуемый объект. Решение: написать конвертеры в dict и обратно.
первый запуск - инвентарь пуст.
Полный пример сохранения и загрузки
Примеры
Пример 1. Полный код игрового инвентаря (словарная версия)
Пример 2. Расширенный датакласс с методом использования
Пример 3. Сериализация с кастомным JSONEncoder для красоты
Заключение
Словари идеальны для прототипов и простых инвентарей без дополнительных атрибутов.
Датаклассы (@dataclass) убирают 70% шаблонного кода, добавляют читаемость и типобезопасность.
JSON — полноценная альтернатива БД для сохранения инвентаря в однопользовательских играх.
Переход от словарей к датаклассам — естественный рефакторинг по мере усложнения проекта.
Где применяется технология
Ролевые игры (RPG) — инвентарь, экипировка, квестовые предметы
Roguelike и survivalигры — управление ресурсами, весом, крафтом
Текстовые квесты и MUDигры
Прототипы любых игр с собираемыми предметами
Обучение Python: идеальный пример для демонстрации ООП и датаклассов
Преимущества описанного подхода
Словари: Простота, скорость написания
Нет типов, легко ошибиться в ключах
Датаклассы: Типизация, автодополнение, читаемость Чуть больше кода, чем словари
JSON: Не нужна БД, легко редактировать вручную Не подходит для многопользовательских игр
Итоговая рекомендация:
начинайте со словарей на прототипе, и как только появляется вес, тип, эффект или любой третий атрибут — переходите на датаклассы. А JSON используйте всегда для сохранений — это бесплатно, просто и надежно.