Wie hier eingeführt verfügt der C64 ebenfalls über eine Basic-Schnittstelle als ‚Interface‘ für den C64 wie auch um zu Programmieren. Es ist mehr oder weniger die erste eingebaute Anwendung.
BASIC entstand bekanntlich 1964 als einfach erlernbare Programmiersprache, der man bis heute ihren klassischen Sprachansatz ansieht. Es ist eine Art Shellerweiterung mit Zeilen.
Viele 8Bit-Computer kamen ebenso wie der C64 mit Basic daher. Einige waren einfacher gestrickt als der C64 für Games andere mehr (vgl. Atari 400) in Sachen Farbe, Sprites, Scrolling. Diese Features wurden natürlich damals bis heute genutzt in BASIC-Aptippspielen, die zusätzlich noch oft auch Assemblerpasagen enthielten. All diese mache recht komplexe Spiele in Basic möglich. Am besten sieht man das bis heute etwa an Super-Marble-Boy des Amiga Game Design Veteranen Roman Werner.
Minimales Actionspiel in Basic?
Turnbasierte Spiele in Basic gibt es selbstverständlich viele. Eines der Kursspiele in den 80er Jahren war etwa HangMan. Simple und einfach und doch gut zu zeigen, wie eine Spielmechanik programmiert werden kann.
Standardbasic
Aber ist es möglich (eine Recherche steht noch aus) ein Action-Spiel zu machen, das allein in BASIC programmiert ist und auf allen Systemen läuft? Was natürlich jede Art von Spezialfeatures per se ausschliesst und das ausgehend vom C64 Basic.
Ausgabe: Print
In Sachen Ausgaben ist BASIC nicht gerade der Hit. Die meisten Basics aber besitzen sicher PRINT. Und was auch interessant ist – es gibt meist PRINT String und PRINT String Return. Einen allgmeinen Standard zum Positionieren des Cursors existiert – soweit bekannt – in Basic nicht. Es gibt nur sehr viele Hacks für jedes System. Und damit sollte sich doch auch ein Actionspiel machen lassen. Zudem bringt PRINT mit RETURN die Möglichkeit mit den Bildschirm zu scrollen.
Gamekonzept?
Ist es möglich in einer Linie ein Gamekonzept zu erschaffen? Ein einfaches Shoot-Em-Up oder Sammlerspiel? Diese Frage hat vor einigen Jahren eigentlich Robin Baumgarten beantwortet mit seinem Line Whobbler. Es ist ein eindimensionales Rollenspiel mit einem LED-Lichtstreifen und einem Extrakontroller. Das Konzept ist beeindruckend einfach und funktioniert sehr gut.
Ausgehend aus diesem Konzept liess sich schnell etwas entwickeln, was an Line whobbler erinnert, aber visuelle einen anderen Weg ging.
Version 1: ein kontrollierbarer Punkt – Endpunkt
Ein simple kontrollierbarer Punkt. Er kann nach links und rechts gesteuert werden und zieht automatisch gescrollt einen Schweif hinter sich her.

Technisch wird zuerst die Position per Space geschrieben und danach der Avatar hingehängt. Das Ganze ist je weiter links umso schneller (weniger Spaces), als gegen rechts. Das Ergebnis ist interessant.

Allerdings bricht das Spiel schon die erste Regel: Es nutzt einen Peek, um die Tastatur auszulesen. Basic war 1964 in dem damaligen Paradigma natürlich als Input/Output-Sprache (ohne Keypressed-Abfragen – sondern mit Return als Abschluss einer Eingabe – Input) designed.
Version 2: Fange ein Zeitextra
Die zweite Version addierte einen Extra, das man holen musste, um weiterspielen zu können. Sobald es gefangen war, wurde es per Zufall wieder anderswo ‚gespawnt‘. Im gesamten eine minimale Gamemechanik. Idee: Läuft die Zeit aus, ist das Spiel zu Ende. Wie weit bist du gekommen?

Technisch wiederum gelöst wie bis anhin. Die Mechanik funktioniert und ist einigermassen interessant. Das visuelle Ergebnis funktionierte sehr gut, da es das Spielgeschehen in eine „Grafik“ verwandelt(e).
10 print "last line"
15 let c = 5
20 let e = 12
50 for i=0 to 20
51 if i=c then print "*";
52 if i=e then print "-";
60 print " ";
70 next i
71 print " "
90 a = peek(197)
91 if a=10 and c>1 then c = c - 1
92 if a=18 and c<19 then c = c + 1
100 goto 50
Das Problem: Es ist eher ein Stocken, denn ein flüssiges Spiel. Der Basic-Interpreter kam da schon an seine Grenzen.
Eine zweite Version mit String-Concat-‚Optimierung‘ war auch nicht viel besser.

Eine Begrenzung des Spiels etwa auf 20 Zeichenbreite brachte auch nicht den erhofften Geschwindigkeitszuwachs.
Basic Fazit
Das Spielkonzept scheint zu funktionieren und bedient sich dabei der Endlosrunners und der Idee von Line whobbler. Die hier ausprobierten Implementationen sind aber zu langsam (selbst die If-Statements verlangsamen das Spiel ungemein) und ein Grundproblem nutzen einen Peek. Dies scheint aber einfach nicht anders lösbar zu sein.
Todo: Ausprobieren des Codes in anderen Basics dieser Zeit etwa des ZX81 oder des Atari-Basic etc.
Todo: Inkey$ nutzen – weil eine Art Standard
Next Step: 16/32Bit Atari ST/Amiga
Interessant ist die Frage, wie sah es bei der nächsten Generation von Computern aus, dem Atari ST oder dem Amiga. Läuft das Spiel hier merklich schneller?
Atari ST Basic
Fürs folgende Experiment wurde eine Atari ST online Emulator benutzt, der im Laufwerk A auch ein Basic enthält: pce-emulator >
Das Atari ST Basic orientiert sich in seiner Bedienung noch stark an der Idee einer Shell. Hier kann man tippen oder man clickt das Menu an, dann löst es in der Shell den Befehl aus. Der Background mal im Vordergrund.

Der Editor ist ’schwierig‘ er arbeitet zwar wie ein Edit-Fenster, nur kann man mit der Maus nicht reinklicken sondern muss per Cursor hinfahren. Das Ende der Zeile wird auch nicht verwaltet. Mit Cursor-Links zum Ende der Zeile etc. Es ist mehr eine Art grosser Array aus Zeichen das Textfeld/window. Nicht mit Return bestätigte Zeilen bleiben ausgebleicht und werden nicht ausgeführt. Überall können neue Zeilen eröffnet werden mit einer neuen Zeilenzahl. Diese werden anschliessend geordnet. Zudem scheinen fehlerhafte Zeilen auch ausgegraut zu werden. Editieren kann man nur per Befehl EDIT.

Eine erste Demo erstellt man relativ schnell (Für Mac Chrome-User: Esc – Fullscreen / = : ‚ / “ : shift ä / ; option ö / $: shift 4 / * : shift 8 / + : shift ^). Die Demo ist deutlich schneller als die C64 Version. Fraglich noch, ob hier ein echter Atari ST im Speed abgebildet ist.
Leider funktioniert hier der Input noch überhaupt nicht wie gewünscht. Inkey$ geht anscheinend überhaupt nicht. Und Inp(x) ist auch keine Keypressed-Funktion.
Mögliche Lösung: inp(-2) gibt 0 oder 1 zurück für anstehende Keys, dann alle auslesen mit inp(2). Kommt Zeit kommt Rat.

Todo: Vervollständigung des Beispiels…
Heutige: Moderne Basics
Ein weiterer Interessanter Approach wäre natürlich sich moderne Basics anzusehen. Also Visual Basics und Co, um es dort auch zum implementieren und zu schauen, wie performant das Ganze wäre. Allerdings ist hier klar, moderne Basics kommen alle ohne Zeilennummern daher.
Heute: Fantasy-Console Pico8
In den letzten Jahren sind sogenannte Fantasy-consolen wie Pico8 entstanden. Diese propagieren eine Art Programmieren wie damals 8bit Farbtiefe, 8bit Sound mit der Power eines modernen Rechners. Wie sieht eine Realisierung hier aus?

Das Spiel wird genau gleich in implementiert allerdings in LUA. Hier aber compiliert und läuft einwandfrei.
p = 4
e = 5
t = 100
function _draw()
str = ""
for i=0,24 do
str = str .. chr(20+t%10)
if (p==i) str = str .. "⬅️"
if (e==i) str = str .. "❎"
end
if (p==e) then
e=flr(rnd(25))
t=t+30
end
if (btn(0) and p>0) p=p-1
if (btn(1) and p<25) p=p+1
str = str .. " " .. t
t=t-1
print (str)
end
Mit ein bisschen Demoscene-EyeCandy sieht das dann so aus:

Der Code dazu arbeitet mit viel String-inline-Farben und Chars abhängig von hochzählenden und modelierten Zahlen.
p = 4
e = 5
t = 100
s = 0
function _draw()
str = ""
s = s+1
c = ""
for i=0,24 do
c = (0+s%5)
if (p==e) c = 8
str = str .. "\f"..c
str = str .. chr(20+t%10+s%4)
if (p==i) str = str .. "\f"..(6+s%3).."⬅️\f"..c
if (e==i) str = str .. "\f"..(8+s%2)..chr(30+s%23).."\f"..c
end
if (p==e) then
e=flr(rnd(25))
t=t+30
end
if (btn(0) and p>0) p=p-1
if (btn(1) and p<25) p=p+1
str = str .. " \f9" .. t
t=t-1
print (str)
end
ToDo: Mit Gegner
Das Spiel macht grundsätzlich Spass und lässt sich auch einfach aufbohren. Ein bewegendes Extra und ein Gegner wäre natürlich lustig, sowie die Möglichkeit über den Gegner* zu springen.
Nachtrag
Der Micro BBC ermöglicht auch als 8Bit eine fast perfekte BASIC Variante mit genug Speed. Siehe diese Variante hier: