Hopp til hovedinnhold

Onsdag 7. oktober

 Tilbake Koding 3 min 02.40

DOOMQL kjører en Doom-klone der SQL tegner hver eneste piksel

tirsdag 14. juli · KI-generert · Kilde: Simon Willison's Weblog

Innholdet er KI-generert og kan inneholde feil. Sjekk originalkilden.

Kjør et Doom-lignende spill der SQLite driver alt: bevegelse, kollisjon, fiender og hver eneste piksel på skjermen.

«DOOMQL startet med et bevisst urimelig spørsmål: hva om SQLite var spillmotoren, og ikke bare stedet der et spill lagrer data?» — Peter Gostev, DOOMQL-dokumentasjonen

Gostev publiserte svaret som kjørbar kode. DOOMQL er et førstepersons skytespill der SQL eier bevegelse, kollisjon, fiender, kamp, progresjon og hver RGB-piksel på skjermen. Simon Willison omtalte prosjektet på bloggen sin 13. juli og skriver at det ble bygget med GPT-5.6 Sol. Det finnes ingen nettleser, ingen Canvas og ingen SVG i prosjektet, og ifølge dokumentasjonen inneholder den spillbare runtimen ingen grafikk-kode i Python.

Mekanikken er enklere enn den høres ut. For hver frame leser SQL spiller- og kart-tabellene og produserer én rad per piksel, med kolonnene x, y, r, g og b. Et andre SQL-view gjør RGB-radene om til fargede terminalblokker. Python-verten sender inn rå tastetrykk, tid og terminalstørrelse, og skriver ut resultatet uendret. Hele det synlige bildet kommer fra én spørring: SELECT scanline FROM render_frame ORDER BY y;. Raytraceren bak er en rekursiv CTE.

Willison tok det et steg videre. Spillet skriver tilstanden sin til en helt vanlig SQLite-fil, så han åpnet den i Datasette mens han spilte, og ba Claude bygge et grensesnitt oppå:

«Bygg en app som viser gjeldende skjermtilstand med frame_pixels-viewet og kolonnene x, y, r, g, b. La den oppdatere seg én gang i sekundet.» — Simon Willison, om den nye Datasette Apps-pluginen

Resultatet ble en HTML- og JavaScript-app inne i Datasette som speilet terminalbildet live. Én setning til, «add a minimap», ga ham et minikart.

Poenget for deg som bygger ligger i inspiserbarheten. DOOMQL har en make inspect-modus som åpner den samme databasen skrivebeskyttet med PRAGMA query_only=ON og viser tick, oppløsning, den faktiske render-spørringen og reelle før- og etterverdier for bevegelse, skudd og skade. Audit-hendelsene skrives inne i samme transaksjon som selve spillendringen, og rulles tilbake sammen med den. Når tilstanden bor i en database framfor i minnet, blir den lesbar for verktøy du allerede har. Det er samme grep som strukturert logging i en agent-pipeline, bare demonstrert med et spill.

Hva bør du gjøre?

  1. Klon repoet og kjør make run fra rota. Du trenger Python 3.11 eller nyere, SQLite 3.45 eller nyere med matematikk-funksjoner, og en terminal med 24-bits farge. Ingen tredjeparts Python-avhengigheter.
  2. Åpne et andre vindu med make inspect mens du spiller, og les SQL-en som faktisk kjørte for hver handling. Det er her læringen ligger.
  3. Pek Datasette mot .doomql/doomql.sqlite hvis du vil bygge din egen visning oppå spilltilstanden.

Pulsen · norske KI-nyheter for deg som bygger. Sakene er KI-generert fra originalkilden, som alltid lenkes.