Basic 10Liner Contest 2020

Ziel des titelgebenden Wettbewerbes ist es in maximal 10 Zeilen Basic Code ein Spiel oder eine Demo zu programmieren. In diesem Jahr habe ich mit einem Bietrag in Atari Basic daran teilgenommen. Die Heimseite des Wettbewerbes mit der Übersicht über alle Beiträge habe ich unter [1] verlinkt.

Das disk image des Spiels kann man sich dort herunterladen: Racer on GitHub.

Programmiert habe ich ein einfaches Rennspiel bei dem es ganz schlicht und einfach nur darum geht auf der Straße zu bleiben. Originell wie ich nun einmal bin, habe ich es Racer genannt.

Die Straße scrollt von unten nach oben und wird im Spielverlauf bis zu einer festgelegten, minimalen Breite, immer enger. Das Auto lässt sich mit dem Joystick nach links oder rechts steuern. Der zurückgelegte Weg wird gezählt und nach Verlust der Fahrzeuges auf dem Startbildschirm angezeigt. Zur Motivation es das nächste mal besser zu machen.

screenshot2

Nicht schlecht: 211 Meilen. Mein Rekord liegt bei >700 Meilen…. „Fire to start“, das „Press“ war ein Opfer der Zeichenbegrenzung auf 256 Zeichen pro Zeile. Man spart wo man kann!

Die Idee, die Geschichte dahinter
Im Historischen Kontext ist das Spiel nichts neues. Rennspiele gab es schon immer und wird es auch weiter geben. Sei es als Homebrew Variante – so etwas hat man früher als Basic- Listing in den diversen Zeitschriften veröffentlicht – , als professionell gemachte Kaufvariante oder in der Spielhalle.

Screen Shot 2020-03-28 at 4.00.10 PM

Car Racer, Computer Kontakt, unbekanntes Erscheinungsjahr. Atari Basic, Atari 400/800 und die XL/ XE Serie,

Auf die professionellen Varianten gehe ich hier nicht weiter ein. Wie bereits gesagt, ist Racer nichts neues. Vorbild für mich war das Spiel Car Racer. Es wurde in den 1980er Jahren in der beliebten Zeitschrift Computer Kontakt abgedruckt. Meiner Variante liegt die Selbe Technik zugrunde.

Technik

Wenn man auf dem Bildschirm Zeichen ausgibt und die erreichen den unteren Rand, dann wird die oberste Zeile nach oben geschoben. So entsteht – ohne Eingriff in den durch das Betriebssystem geregelten Bildschirmaufbau – ein einfaches Scrolling. Aus dem Grund ist die Bewegungsrichtung der Straße so wie sie ist, von unten nach Oben und nicht umgekehrt.

Im Gegensatz zu meinem Vorbild habe ich keinen geänderten Zeichensatz verwendet, das heist, aus dem Bildschirm werden nur die Zeichen ausgegeben, die im ROM des Computers enthalten sind. Für eine einigermaßen ansehliche Grafik habe ich in eine andere Trickkiste gegriffen. Den Textmodus in dem Atari- Basic standardmäßig läuft, Graphics 0, habe ich durch eine veränderte Display- List ersetzt. Ausser der ersten und der letzten Zeile habe ich den Bildschirm mit dem Modus 12 – das ist ebenfalls ein Textmodus, allerdings mit bis zu vier Farben (mit weiteren Tricks sind auch fünf Farben möglich) – gefüllt. Der Straßenrand ist mit einem Punkt – Zeichen gezeichnet. Wegen des gewählten Grafikmodi in zwei Farben, ohne dafür auch nur ein Zeichen mehr für den source code verwenden zu müssen. Die erste Zeile habe ich nicht geändert, weil die ausser der Information dass es sich um die Grafikstufe 0 handelt auch noch den Zeiger auf den Bildschirmspeicher enthält. Das Ändern wäre dafür etwas aufwendiger gewesen. Ich habe das also so gelassen und die letzte Zeile auch unverändert übernommen. Ich nahm das einfach als schönen Effekt mit.

0 GRAPHICS 2:PRINT #6;" RACER":? "LAST RUN:";M;" MILES":? "FIRE TO START":M=0:B=
20:SETCOLOR 0,9,9:SETCOLOR 4,0,13
1 POKE 755,0:SETCOLOR 2,0,13:P=PEEK(106)-16:A=PEEK(88)+256*PEEK(89):S=STRIG(1):P
OKE 53278,1:IF S=1 THEN GOTO 1
2 GRAPHICS 0:SETCOLOR 2,0,0:SETCOLOR 1,0,0:SETCOLOR 4,0,4:P1=256*P+512:FOR A=0 T
O 765:POKE P1+A,0:NEXT A
3 POKE 54279,P:POKE 559,46:POKE 704,55:SETCOLOR 0,0,196:P2=256*P+640:POKE 705,6:
P3=256*P+768:POKE 706,59
4 RESTORE 6:FOR A=0 TO 7:READ W:POKE P1+25+A,W:NEXT A:D=PEEK(560)+256*PEEK(561):
POKE 623,1
5 POKE 53277,3:POKE 53248,120:FOR A=6 TO 27:POKE D+A,4:NEXT A:POKE 53256,0
6 TRAP 6:POKE 53250,130+I:POKE 53249,130+I:IF Q>8 THEN Q=0:DATA 219,255,219,24,9
0,126,90,24
7 R=INT(RND(1)*14):X=X+((R<5)):X=X-((R>8)):X=X-((X>10)):X=X+((X<2)):POKE 85,10+X
:? ".":POKE 85,10+B+X:? "."
8 S=STICK(1):POKE 53248,130+I:M=M+1:I=I+((S=7)):I=I-((S=11)):IF PEEK(53252)>0 TH
EN POKE 53277,0:GOTO 0
9 POKE P3+24,24:POKE P3+34,24:POKE P3+33,255:B=B-((B>10))*0.05:POKE P2+27-Q,R*2:
Q=Q+1:GOTO 6

Racer, source code

Das Rennauto besteht aus drei Player- Objekten (Sprites). Wenn man das Spiel spielt, dann fällt das insbesondere dann auf wenn man das Fahrzeug bewegt. Die drei Objekte sind dann nicht synchron und es schaut aus, als ob das Fahrzeug schaukelt.

Mangel macht erfinderisch

Den Source Code dermaßen kompakt halten kann man nur dann, wenn man sich eingehend mit der Programmiersprache beschäftigt. So wäre mir beispielsweise gar nicht mehr eingefallen, dass man die Abfrage des Joysticks und die Bewegung der Spielfigur kombinieren kann. In den meisten zeitgenössischen Büchern zum Atari wurde das so gelehrt:

10 S=STICK(0)
20 IF S=7 THEN GOSUB 50
30 GOTO 10
40 REM UNTERPROGRAMM ZUM BEWEGEN DER FIGUR IN DIE GEWÜNSCHTE RICHTUNG
50 ....
60 RETURN

Platzsparender und eleganter geht das so:

10 S=STICK(1):I=I+((S=7)):I=I-((S=11)):IF PEEK(53252)>0 TH
EN POKE 53277,0:GOTO 0

Die Variable I ist die horizontale Position des Fahrzeuges auf dem Bildschirm. Der Ausdruck I=I+((S=7)) – äquivalent zu I=I+((STICK(1)) – funktioniert deshalb, weil das Ergebnis des Ausdruckes in der Klammer als wahr=1 oder falsch=0 ausgewertet wird.

Die Selbe Technik habe ich in anderen Teilen des Codes angewandt:

B=B-((B>10))*0.05

DieVariable B regelt die Breite der Straße. Solange nun B größer als 10 ist, ist der Ausdruck in der Klammer wahr und deshalb=1. Damit ist das Produkt die Breite der Straße, die sich um den Faktor 0.05 steht verringert. Wenn der Ausdruck als falsch ausgewertet wird, dann ist das Produkt eben null und die Breite bleibt konstant.

Die Idee das so zu machen habe ich aus der deutschen Variante des Benutzerhandbuchs, das mit den Atari Computern der XL- Reihe ausgeliefert wurde. Das dort veröffentlichte Basic Listing Ping/ Pong macht das genau so wie ich es beschrieben habe.

Screen Shot 2020-03-28 at 4.49.59 PM

Ping/ Pong, deutsches Benutzerhandbuch für die Atari Computer der XL- Reihe, Mitte der 1980er Jahre.

Racer ist ein Strategiespiel!

Eigentlich kommt es bei Rennspielen auf schnelle Reaktionen an. Reagiert man langsam, dann fliegt man von der Strecke. Jetzt ist es aber so, dass die Programmiersprache Basic und der Begriff Schnell, nicht unbedingt zusammenpassen. Im Falle von Racer hat sich deswegen eine ganz Spezielle Art ergeben wie man sich dem Spiel nährt und welche Taktik zu Erfolg führt.

Die Geschwindigkeit der Bewegung der Rennstrecke und die des Fahrzeuges ist langsam und ausserdem nicht voneinander entkoppelt. Normalerweise würde man so vorgehen, dass sich der Rennwagen bei jedem Durchlauf der Hauptschleife [2] bewegen lässt, und die Rennstrecke bewegt sich bei jedem Zweiten Durchlauf weiter. Dann liese sich der Wagen schneller bewegen als die Straße weiterläuft und der Spieler hat die die Möglichkeit durch schnelles reagieren dem Straßenrand auszuweichen. Wenn man in Assembler programmiert wirkt sich das tatsächlich fühlbar auf ein guten Balancing aus, im langsamen Basic gibt man dem armen Computer so überhaupt keine Chance das Spiel für sich zu entscheiden. Es liefe ewig und die Motivation bliebe für den Spieler buchstäblich auf der Strecke.

Wenn man beim Spielen den Blick auf das Fahrzeug und den näheren Bereich davor richtet, so wie man das bei einem schnellen Rennspiel machen würde, dann wird man wenig Erfolg haben. Durch die langsame Bewegung des Fahrzeuges muss man möglichst weit vorausschauen und den Trend erkennen wohin die Straße sich bewegen wird. Dementsprechend muss man nun frühzeitig sein Fahrzeug möglichst weit nach links oder rechts lenken.

Wenn man Racer öfter spielt, dann wird man merken, dass man die Entscheidung wohin man das Rennauto lenkt, im Vergleich zu einem schnellen Rennspiel, relativ viel Zeit hat. Das Fühlt sich dann eher nach einem Strategiespiel als nach einem Reaktionsspiel an.

Nachtrag

Racer hat in der Kategorie PUR-120 den 23. Platz erreicht. Insgesamt wurden 31 Beiträge in dieser Kategorie bewertet. Da ist noch Luft nach oben, freuen tut es mich aber auf jeden Fall. Ansporn im nächsten Jahr wieder Teilzunehmen ist es allemal. Die Nuancen des originalen Atari Basic (eine Auftragsarbeit von Shepardson Microsystems) faszinieren mich und ich bleibe da sicher ab und an noch am Ball, nur um zu sehen was man noch so alles aus diesem 8 kB großen Sahnestück der Ingenieurs- Kunst herausholen kann.

Fazit

Racer kein neues Spielprinzip. Es ist die Entdeckung der Langsamkeit für Rennspiele als Strategieelement. Schöne Erinnerungen an eine kreative Zeit am Homecomputer und die Erkenntnis mit dem Spielen am Computer eben nicht seine Jugend verschwendet zu habe.

In diesem Sinne, weiter Happy Coding, ganz gleich ob es der Toaster, Osziloskope oder Eure alten Heimcomputer sind!

[1] Homeputerium, Basic10 Liner Contest, alle Beiträge für 2020.

[2] Retrozock, Computerspiele Analysiert. Die Hauptschleife eines Computerspieles.


Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google Foto

Du kommentierst mit Deinem Google-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s

%d Bloggern gefällt das: