Запустил DOOM на SQLite через Python — вот как это работает
Питер Гостев собрал Doom-like шутер на чистом SQL с помощью GPT-5.6 Sol. Движок, рендер, коллизии — всё внутри SQLite. Показываю, как запустить и подключить визуализацию через Datasette.

Питер Гостев с помощью GPT-5.6 Sol создал Doom-like шутер, в котором SQLite — не база данных для сохранений, а полноценный игровой движок. Рендер, физика, враги, пиксели экрана — всё управляется SQL-запросами. Разбираем, как запустить проект за пять минут и подключить к нему визуализацию через Datasette.
Зачем запускать игру на SQL
DOOMQL — это эксперимент на грани абсурда: что, если использовать SQLite не для хранения данных, а как движок реального времени? Проект доказывает, что рекурсивные CTE (Common Table Expressions) и триггеры SQLite могут обсчитывать рейтрейсинг, обрабатывать ввод игрока и отрисовывать каждый пиксель в терминале.
Это полезно, если вы:
- разбираетесь в продвинутых возможностях SQL и хотите увидеть их на живом примере
- экспериментируете с AI-генерацией кода (проект собран с помощью GPT-5.6 Sol)
- ищете нестандартные кейсы для демонстрации возможностей баз данных
Запуск игры в терминале
Клонируем репозиторий и запускаем Python-скрипт. Проект использует uv для управления зависимостями — это быстрый менеджер пакетов, совместимый с pip.
``bash cd /tmp git clone https://github.com/petergpt/doomql cd doomql uv run host/doomql.py ``
После запуска в каталоге /tmp/doomql/.doomql/ появится файл doomql.sqlite — там хранится состояние игры, карта уровня, позиции врагов и текущий кадр.
Управление стандартное: WASD для движения, мышь или стрелки для поворота, пробел для стрельбы. Игра работает в текстовом режиме, но внутри SQLite крутится полноценный рейтрейсер — огромный рекурсивный SQL-запрос, который вычисляет цвет каждого пикселя на основе геометрии уровня.
Как устроен рендер на чистом SQL
Ключевая часть проекта — представление frame_pixels, которое генерирует изображение на лету. Оно использует рекурсивный CTE для трассировки лучей: для каждой точки экрана (x, y) SQL вычисляет направление луча, проверяет пересечения со стенами, врагами и объектами, затем возвращает RGB-компоненты пикселя.
Вот упрощённая схема:
- Рекурсивный CTE стартует с позиции игрока и угла обзора
- Для каждого столбца экрана строится луч
- Луч "шагает" по карте, пока не найдёт стену или врага
- Цвет пикселя вычисляется с учётом расстояния (затемнение) и текстур
- Результат записывается в таблицу
frame_pixelsс колонкамиx, y, r, g, b
Это тот же принцип, что использовал Джон Кармак в оригинальном DOOM, только вместо C — SQL.
Подключаем визуализацию через Datasette
Терминал — это хардкор. Чтобы видеть игровой экран в браузере, используем Datasette — open-source инструмент для исследования SQLite-баз. С плагином datasette-apps можно создавать кастомные HTML-приложения, которые выполняют SQL-запросы прямо в интерфейсе.
Запускаем Datasette с поддержкой приложений:
``bash uvx --prerelease=allow --with datasette-apps datasette \ /tmp/doomql/.doomql/doomql.sqlite \ -p 4444 --root --secret 1 --internal internal.db ``
Открываем http://localhost:4444, авторизуемся через токен root (он появится в консоли), переходим в раздел Apps и создаём новое приложение.
Теперь нужен код для отрисовки. Саймон Уиллисон (автор Datasette) скормил промпт Claude (модель Fable 5):
Build an app that displays the current state of the screen using the frame_pixels view with its x, y, r, g, b columns. Have it refresh once a second.
Claude вернул рабочий HTML+JavaScript. Затем Саймон попросил добавить миникарту:
add a minimap
Готовый код приложения можно найти в оригинальном посте Саймона. Вставьте его в редактор Datasette App — и вы увидите экран игры в браузере с автообновлением раз в секунду. Миникарта показывает позицию игрока на уровне.
Где это ломается
SQLite не рассчитан на работу в реальном времени. Рекурсивный CTE для рейтрейсинга — медленная операция, поэтому FPS в терминале держится на уровне 5-10 кадров. Для плавной игры понадобится оптимизация запросов или переход на CedarDB — специализированную СУБД, упомянутую в GitHub-репозиториях форков DOOMQL.
Веб-визуализация через Datasette обновляется с задержкой (раз в секунду), поэтому для реактивного дебага не подходит. Это скорее демонстрация возможностей, чем production-решение.
Если вы изменяете код SQL внутри doomql.sqlite (например, через Datasette), придётся перезапустить Python-скрипт — изменения применяются только при загрузке.
Что попробовать дальше
Если идея зацепила, вот несколько направлений:
- Изучите рекурсивный CTE для рейтрейсинга — откройте
doomql.sqliteчерезsqlite3или Datasette и найдите представление, отвечающее за рендер. Это мастер-класс по продвинутому SQL. - Форкните репозиторий и попробуйте добавить новый уровень или врага. Геометрия хранится в таблицах — можно экспериментировать без изменения Python-кода.
- Попробуйте мультиплеерную версию на CedarDB — в репозиториях cedardb/DOOMQL есть форк с поддержкой нескольких игроков. CedarDB быстрее SQLite в аналитических запросах, что даёт выигрыш в FPS.
- Используйте это как шаблон для других SQL-экспериментов — принцип «вся логика в базе данных» работает для симуляций, ботов, обработки событий в реальном времени.
DOOMQL — это не практичный инструмент, а proof-of-concept, который показывает, куда заходят возможности SQL и AI-ассистированного программирования. Питер Гостев с помощью GPT-5.6 Sol создал работающий прототип за разумное время — хороший пример того, как LLM справляются с нестандартными задачами, если правильно сформулировать вопрос.
Источники
Читайте также
Комментарии
Пока никто не написал. Будьте первым.


