Sneekie

Sneekie, regel voor regel

Een Nederlandstalige rondleiding door de GW-BASIC-bron uit 1988 — 38 jaar later geannoteerd.

Dit is de originele SNEEKIE.BAS met het verhaal erbij. De code staat precies zoals hij geschreven is; de amberkleurige notities onder regels en de kaarten tussen secties zijn de nieuwe uitleg. Is een routine onduidelijk, zoek dan het regelnummer hieronder — alles is gegroepeerd zoals GW-BASIC het nummerde.

Het ene idee dat alles verklaart: het scherm is het spel

Er zijn geen sprites, geen game-objecten en eigenlijk geen aparte "slang"-datastructuur. De slang, muren, harten en pijlen zijn gewoon tekens in het tekstschermgeheugen van de PC, en het programma leest en schrijft dat geheugen rechtstreeks met PEEK en POKE.

Het tekstscherm is 80×25 cellen. Elke cel heeft twee bytes: eerst de tekencode, daarna de kleur ("attribute"). Het adres van een cel is dus

offset = (rij − 1) × 160 + (kolom − 1) × 2  — 160 omdat een rij 80 cellen × 2 bytes is.

De even byte bevat het teken; de oneven byte bevat het attribuut (7 = normaal, 15 = helder). Om te weten wat er voor de slang ligt, PEEKt de code alleen de tekenbyte van het doelvak en schakelt op dat getal. Die ene truc — beeld en toestand zijn dezelfde bytes — verklaart waarom zoveel programmawerk offset-rekenen is.

▶ Bekijk het live — stuur een slang en zie de echte bytes veranderen.

De variabelen

T()de slang — een lijst met schermoffsets, van staart T(ETEL) tot kop T(BTEL)
BTEL / ETELindex van kop / staart in T() (teller)
E / Fhuidige / vorige richting (scancodes 72 80 75 77)
HARTharten ♥ die nog verzameld moeten worden
KLAVERklavers ♣ die nog verzameld moeten worden
BONUS / BMINtijdbonus, en hoeveel hij per zet daalt
AANTALhoeveel items er van elk type worden gestrooid
Zseconden toegestaan per zet; 999 = beurt voor beurt, klein = realtime
LIVE / LEVELresterende levens / huidig level
ZCORE / ZOREscore / highscore
OPpunten die deze keer worden toegevoegd
S() B() D()popup-backup / poortposities / bewegende-pijltoestand
VIDEOhet schermgeheugensegment (&HB000 mono / &HB800 kleur)

Wat de tekens betekenen (CP437)

32 leeg vak
219slangenkop
186 205 187 188 201 200║═╗╝╔╚slangenlijf: recht en hoeken
179 196 197 …│─┼doolhof- en kadermuren
1smiley — slecht (−50)
3hart (+10)
5klaver (+25)
10steen — duwbaar
24 26 27↑→←bewegende pijlen — dodelijk
attr 7 / 15 normaal / helder

Toetsen (de scancodes in E)

72 80 75 77↑↓←→stuur de slang
27ESCopgeven als je vastzit (kost een leven)
67 / 68F9 / F10cheat: +leven & overslaan / level overslaan

Hoe een zet verloopt (regels 420–1010)

  1. Wacht tot Z seconden op een pijltjestoets, of laat de slang zijn richting houden.
  2. Trek BMIN van de bonus af.
  3. Zet de richting om in een schermstap en bepaal het vak dat de kop wil binnenkomen.
  4. PEEK dat vak en reageer: leeg vak, hart/klaver eten, steen duwen, sterven door een pijl, of geblokkeerd worden door een muur.
  5. Maak van het oude kopvak het juiste ═║╗╝╔╚-stuk en teken een nieuwe kop.
  6. Laat het lijf glimmen en beweeg de pijlen/poorten van dit level een stap.
  7. Herhaal tot elk hart en elke klaver weg is.