Игровой инвентарь на чистом Python: от словарей к датаклассам и JSON без БД

Игровой инвентарь на чистом Python: от словарей к датаклассам и JSON без БД. В разработке игр инвентарь — одна из самых частых задач. Многие новички сразу подключают SQLite, Redis или сложные ORM, даже не подозревая, что 90% проектов на старте можно реализовать тремя стандартными инструментами: словари, датаклассы и JSON. Никаких внешних хранилищ, никаких баз данных — только встроенные возможности Python.

В этой статье мы создадим игровой инвентарь с нуля. Сначала на простых словарях, затем рефакторинг до @dataclass, добавим вес предметов, типы, эффекты и, самое главное, научимся сохранять инвентарь между запусками через JSON. Вы увидите, как датаклассы заменяют десятки строк шаблонного кода и делают проект поддерживаемым.

Этап 1. Инвентарь на словарях

Самый простой способ хранить предметы — словарь, где ключ — название предмета, значение — количество.

Игровой инвентарь на чистом Python: от словарей к датаклассам и JSON без БД

Функция добавления предметов

Игровой инвентарь на чистом Python: от словарей к датаклассам и JSON без БД

Отображение инвентаря

Игровой инвентарь на чистом Python: от словарей к датаклассам и JSON без БД

Пример работы

Игровой инвентарь на чистом Python: от словарей к датаклассам и JSON без БД

Все просто и работает. Но что, если у предмета есть вес, тип (оружие, еда, зелье) или эффект? Словарь для этого плохо подходит — придется хранить вложенные структуры.

Проблема словарного подхода

Игровой инвентарь на чистом Python: от словарей к датаклассам и JSON без БД

Это быстро превращается в кошмар поддержки. Нет подсказок типов, легко ошибиться в ключах ("weigth" вместо "weight").

Этап 2. Датаклассы — элегантное решение

Датаклассы появились в Python 3.7 и решают ровно эту проблему: автоматически генерируют __init__, __repr__, __eq__ и другие методы.

Игровой инвентарь на чистом Python: от словарей к датаклассам и JSON без БД

Как датакласс заменяет boilerplate код

Без датакласса вам пришлось бы писать:

Игровой инвентарь на чистом Python: от словарей к датаклассам и JSON без БД

С датаклассом — одна строка @dataclass. Всё остальное автоматически.

Инвентарь на датаклассах

Теперь инвентарь — это словарь str > Item, где ключ — имя предмета (или можно использовать dict[str, Item])

Игровой инвентарь на чистом Python: от словарей к датаклассам и JSON без БД

Создание предметов:

Игровой инвентарь на чистом Python: от словарей к датаклассам и JSON без БД

Преимущества налицо: самодокументируемый код, автодополнение в IDE, проверка типов mypy.

Этап 3. Сериализация в JSON — сохраняем инвентарь

Самое интересное — инвентарь должен сохраняться между запусками игры. Без БД мы используем JSON.

Проблема: датакласс нельзя просто записать в json.dumps()

json.dumps(inventory) выдаст ошибку, потому что Item — не сериализуемый объект. Решение: написать конвертеры в dict и обратно.

Игровой инвентарь на чистом Python: от словарей к датаклассам и JSON без БД

первый запуск - инвентарь пуст.

Полный пример сохранения и загрузки

Игровой инвентарь на чистом Python: от словарей к датаклассам и JSON без БД

Примеры

Пример 1. Полный код игрового инвентаря (словарная версия)

Игровой инвентарь на чистом Python: от словарей к датаклассам и JSON без БД

Пример 2. Расширенный датакласс с методом использования

Игровой инвентарь на чистом Python: от словарей к датаклассам и JSON без БД

Пример 3. Сериализация с кастомным JSONEncoder для красоты

Игровой инвентарь на чистом Python: от словарей к датаклассам и JSON без БД

Заключение

Словари идеальны для прототипов и простых инвентарей без дополнительных атрибутов.

Датаклассы (@dataclass) убирают 70% шаблонного кода, добавляют читаемость и типобезопасность.

JSON — полноценная альтернатива БД для сохранения инвентаря в однопользовательских играх.

Переход от словарей к датаклассам — естественный рефакторинг по мере усложнения проекта.

Где применяется технология

Ролевые игры (RPG) — инвентарь, экипировка, квестовые предметы

Roguelike и survivalигры — управление ресурсами, весом, крафтом

Текстовые квесты и MUDигры

Прототипы любых игр с собираемыми предметами

Обучение Python: идеальный пример для демонстрации ООП и датаклассов

Преимущества описанного подхода

Словари: Простота, скорость написания

Нет типов, легко ошибиться в ключах

Датаклассы: Типизация, автодополнение, читаемость Чуть больше кода, чем словари

JSON: Не нужна БД, легко редактировать вручную Не подходит для многопользовательских игр

Итоговая рекомендация:

начинайте со словарей на прототипе, и как только появляется вес, тип, эффект или любой третий атрибут — переходите на датаклассы. А JSON используйте всегда для сохранений — это бесплатно, просто и надежно.

1
Начать дискуссию