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 / ETEL | index van kop / staart in T() (teller) |
| E / F | huidige / vorige richting (scancodes 72 80 75 77) |
| HART | harten ♥ die nog verzameld moeten worden |
| KLAVER | klavers ♣ die nog verzameld moeten worden |
| BONUS / BMIN | tijdbonus, en hoeveel hij per zet daalt |
| AANTAL | hoeveel items er van elk type worden gestrooid |
| Z | seconden toegestaan per zet; 999 = beurt voor beurt, klein = realtime |
| LIVE / LEVEL | resterende levens / huidig level |
| ZCORE / ZORE | score / highscore |
| OP | punten die deze keer worden toegevoegd |
| S() B() D() | popup-backup / poortposities / bewegende-pijltoestand |
| VIDEO | het schermgeheugensegment (&HB000 mono / &HB800 kleur) |
Wat de tekens betekenen (CP437)
| 32 | leeg vak | |
| 219 | █ | slangenkop |
| 186 205 187 188 201 200 | ║═╗╝╔╚ | slangenlijf: recht en hoeken |
| 179 196 197 … | │─┼ | doolhof- en kadermuren |
| 1 | ☺ | smiley — slecht (−50) |
| 3 | ♥ | hart (+10) |
| 5 | ♣ | klaver (+25) |
| 10 | ◙ | steen — duwbaar |
| 24 26 27 | ↑→← | bewegende pijlen — dodelijk |
| attr 7 / 15 | normaal / helder |
Toetsen (de scancodes in E)
| 72 80 75 77 | ↑↓←→ | stuur de slang |
| 27 | ESC | opgeven als je vastzit (kost een leven) |
| 67 / 68 | F9 / F10 | cheat: +leven & overslaan / level overslaan |
Hoe een zet verloopt (regels 420–1010)
- Wacht tot
Zseconden op een pijltjestoets, of laat de slang zijn richting houden. - Trek
BMINvan de bonus af. - Zet de richting om in een schermstap en bepaal het vak dat de kop wil binnenkomen.
PEEKdat vak en reageer: leeg vak, hart/klaver eten, steen duwen, sterven door een pijl, of geblokkeerd worden door een muur.- Maak van het oude kopvak het juiste ═║╗╝╔╚-stuk en teken een nieuwe █ kop.
- Laat het lijf glimmen en beweeg de pijlen/poorten van dit level een stap.
- Herhaal tot elk hart en elke klaver weg is.