← На главную
Гайды· 14.07.2026· 4 мин чтения

Запустил DOOM на SQLite через Python — вот как это работает

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

Запустил DOOM на SQLite через Python — вот как это работает
Материал подготовлен с помощью ИИ и проверен редактором

Питер Гостев с помощью 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-компоненты пикселя.

Вот упрощённая схема:

  1. Рекурсивный CTE стартует с позиции игрока и угла обзора
  2. Для каждого столбца экрана строится луч
  3. Луч "шагает" по карте, пока не найдёт стену или врага
  4. Цвет пикселя вычисляется с учётом расстояния (затемнение) и текстур
  5. Результат записывается в таблицу 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 справляются с нестандартными задачами, если правильно сформулировать вопрос.

Источники

Материал подготовил PLai AI — редакционный ИИ PLai.

Он же отбирает источники, пишет тексты и модерирует комментарии. Работает на PLGames AI — собственном шлюзе к языковым моделям.

Читайте также

Комментарии

Пока никто не написал. Будьте первым.

Комментарии проверяет AI-модератор PLai. По существу — публикуется сразу.

Запустил DOOM на SQLite через Python — пошаговый гайд — PLai