Konsten att skriva smått

© 2002,2003 Peter Karlsson. Publicerad i ABC-Klubbens medlemstidning ABC-Bladet nummer 4/2002.

Om ni tror att den här artikeln skulle handla om handstil, så tror ni fel, det här är ju trots allt en datorförening. Nej, den här artikeln handlar om att skriva små program, program är så små att man funderar på hur de egentligen klarar av att göra något alls.

De av er som verkligen lusläste ABC-Bladet 3/2002, eller som läser i ABC-KOM i ”Heta WWW kontakter” (sic!), kanske lade märke till en länk till en tävling som kallas för ”2002 Minigame Compo”.

Tävlingen

Bidrag per maskin
Commodore 6421
Sinclair Spectrum10
Commodore VIC 206
Commodore Plus/44
Commodore Basic3
Gameboy Color3
Amstrad CPC3
Sinclair ZX812
Commodore 1282
Atari Lynx2
Laser2102
NES (Nintendo)2
Oric1
TI99/4A1

Tävlingen gick ut på att skriva ett spel för en veterandator som inte tog upp mer än en kilobyte (alltså 1024 byte). Omöjligt? Inte alls. Tävlingen, som ägde rum på Internet och arrangerades av Per Olofsson i Göteborg, lockade 39 författare från hela världen. Totalt 62 bidrag lämnades in, till 14 olika maskiner (se tabell 1). Allt från plattformsspel och shoot’em up till strategispel, skrivna antingen i assembler (maskinkod) eller i högnivåspråk som BASIC (som mina egna bidrag). En del spel kom med nya spelidéer, men många var varianter på existerande teman eller rent utav kopior av andra spel.

Tävlingen gjorde till exempel att Commodore VIC 20 fick sin, mig veterligt, första version av Tetris. Tävlingen var bara öppen för veterandatorer, alltså datorer från 1980-talets början, och system med motsvarande specifikationer (till exempel handhållna dataspel). Dock inkom inga bidrag för någon ABC-datorerna; kanske kan det bli bättring nästa år?

Omröstning

Resultat i omröstningen (medelpoäng):
1. Splatform (Robin Harbron, Commodore 64) 8,25
– studsa omkring på plattformar
2. Astrostorm (Vanja Utne, Commodore 64) 6,96
– skjut dig genom asteroidbältet
3. Kiloroid (Richard Wilson, Amstrad CPC) 6,89
– en variant av Asteroids
4. Csabo’s 1k Tetris (Csabo, Commodore Plus/4) 6,86
– en variant av det klassiska Tetris
5. 1Kanoid (Paolo Ferrarris, Sinclair Spectrum) 6,84
– en Breakoutvariant

För att avgöra vilket spel som var bäst hölls en omröstning efter att alla bidrag lämnats in, även den helt över Internet. Eftersom alla inte har tillgång till alla maskiner så gjordes den mesta speltestningen i emulatorer, röstningspaketet innehöll information för hur man fick igång emulatorer på de vanligaste plattformarna, men naturligtvis rekommenderades testning på de verkliga maskinerna om man ägde en. Man kunde ge varje spel 1–10 poäng eller rösta blankt. Om spelet inte fungerade fanns det ett sådant val, som inte räknades in i slutpoängen. Detta var speciellt viktigt för de som använde emulatorer, då emulatorer inte alltid kan klara av alla knep som användes i spelen. Och har man bara en kilobyte att röra sig med får man ta till en del knep...

De allra flesta verkar ha begränsat sig till att rösta på de vanligaste plattformarna, men alla bidrag fick tillräckligt många röster för att placera sig. Vinnare blev, med stor marginal, spelet Splatform till Commodore 64 (se tabell 2), som kan beskrivas som en blandning av plattform och pusselspel.

Det går ut på att styra ett studsande ”huvud” genom nio olika nivåer av plattformar. Ett vanebildande spel i all sin enkelhet, som till och med lyckats klämma in musik på sin kilobyte.

Hur gjorde de?

Hur gör man då för att få plats med ett spel på bara 1024 byte? Det viktigaste är nog att planera vad man vill ha in, och undvika att ta med sådant som inte är nödvändigt.

På den här typen av maskiner, med systemrutiner i ROM, är det också ofta bra att använda de rutinerna för att spara kod. Till exempel har de flesta datorer en rutin för att skriva ut ett tal på skärmen, något som inte är helt enkelt om man vill skriva ett vanligt decimaltal, och kan man använda den sparar man in några tiotal byte. Att använda data som redan finns tillgänglig, till exempel som ett av plattformsspelen som använder datorns teckenuppsättning som grafik, så sparar man ännu mer utrymme till själva spelrutinerna.

Komprimering av olika slag är också vanligt. Antingen kan man komprimera hela spelet (som alltså i sig kanske är större än en kilobyte) och expandera det när det körs (det var filstorleken som gällde som storlek), eller så kan man använda mer eller mindre smarta sätt att packa data. Till exempel förekom det i de olika Tetrisvarianterna olika sätt att lagra bitarna, och ett av spelen använde sig av en BASIC-slinga för att rita grafik utifrån vektordata så att punktgrafikbilderna inte behövde lagras.

Segrare

Personligen deltog jag med tre enkla program, alla skrivna i BASIC då mina försök att skriva spel i maskinkod fatalt misslyckades, och inget av dem speciellt bra. Jag är nöjd med att ha klarat mig från sistaplatsen. Eftersom jag var den ende som ställde upp med program för Commodore 128 utnämner jag mig dock som segrare för den kategorin...

Kryptisk kod

Eftersom tätpackad BASIC-kod kan vara oläslig har jag lagt upp en webbsida där jag kommenterar koden, för den som känner sig hugad. Att koden är såpass kryptisk som den är beror självklart på försöken att få in dem på bara en kilobyte.

En liknande tävling hölls 2001 som hade två olika kategorier, 512 byte och två kilobyte (2048 byte). Arrangörerna av den tävlingen ansåg dock att detta inte var så bra, 512 byte var för lite för att göra ett riktigt bra spel, men att två kilobyte var för mycket och inte utnyttjades ordentligt. Huruvida det blir någon tävling 2003 är ännu inte bestämt, det hela hänger på om någon vill ta på sig uppdraget att arrangera det. Någon av er som läser kanske undrar vad man vinner? Ära och beundran, några andra priser finns inte. Men det hindrar inte folk från att delta.

Peter Karlsson <9944>

Skärmbilder

[Skärmbild från Splatform]
Splatform
[Skärmbild från Astrostorm]
Astrostorm
[Skärmbild från Kiloroid]
Kiloroid
[Skärmbild från 1Kanoid]
1Kanoid
[Skärmbild från Csabo’s 1k Tetris]
Csabo’s 1k Tetris

Denna artikel på English (engelska).

Åter till artikelindexet