Esoterische Programmiersprachen als Inspiration für ein Game
Im Rahmen meines Praktikums bei Studio Fluffy war es meine Aufgabe, die Idee eines Mini-Spiels für Meta Racer weiter zu denken und zu einem Prototypen zu entwickeln. Meta Racer ist ein Konzept für ein Rennspiel von Studio Fluffy, das auch bereits in Form eines Prototypen existiert.
Die grundlegende Idee dieses Rennspiels ist, dass man als Spieler Einfluss auf viele verschiedene Parameter des Rennens hat. Die Spieler sollen durch eine Art Programmiersprache oder ein Rätsel den Verlauf des Rennens verändern können. Sozusagen ein Hack-Mechanismus, mit dem die Spieler sich einen Vorteil im Rennen verschaffen können.
Das Meta Puzzle
Das Mini-Spiel besteht aus einem zweidimensionalen Gitterfeld. Von der linken Seite können Lichtstrahlen als Input in das Feld strömen. Auf der rechten Seite strömen die Lichtstrahlen wieder aus dem Feld als Output heraus. Nun kann man das Feld durch funktionale Blöcke verändern und somit auch die Lichtstrahlen. Es gibt Spiegel, die einen Lichtstrahl umlenken, es gibt Teiler, die einen Lichtstrahl in zwei teilen und es gibt Prismen, die weißes Licht in farbiges aufspalten. Treffen Lichtstrahlen aufeinander, werden ihre Farben addiert und es entsteht eine neue Farbe. So ist es also möglich mit einem kleinen Programm das eintreffende Farbmuster umzuwandeln in ein neues.
Hier können vier Level des Meta Puzzles gespielt werden:
https://fluffydev.de/MetaPuzzle/Level1
https://fluffydev.de/MetaPuzzle/Level2
https://fluffydev.de/MetaPuzzle/Level3
https://fluffydev.de/MetaPuzzle/Level4
Esoterische Programmiersprachen
Als Inspiration für das Mini-Spiel habe ich mir verschiedene esoterische Programmiersprachen (Esolangs) angeschaut. Sie bieten in den meisten Fällen die gleiche Komplexität und Variabilität wie normale Programmiersprachen. Sie sind aber nicht darauf ausgelegt in bestimmten Bereichen besondern praktisch zu sein. Meist wurden sie als Experiment oder Kunstwerk erfunden oder einfach nur aus Spaß.
Chicken
Viele dieser Esolangs gleichen in ihrem Kern immer noch einer normalen Programmiersprache, nur verwenden sie eine andere Syntax. Dies gilt vor Allem für aus Spaß oder als Experiment entworfene Sprachen. Da gibt es zB. „Chicken“, eine Sprache die als einzige Symbole das Wort „chicken“, Leerzeichen und Zeilenumbrüche enthält. Wenn man sich also Programmcode dieser Sprache anschaut, sieht man als einziges Wort „chicken“. Dementsprechend ist solch eine Sprache natürlich nicht sehr gut lesbar und deshalb nicht gerade praktisch.
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken
chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken
(Anfang „Hello World“ Programm in Chicken)
Interessant wird es bei den kreativen Esolangs. Sie haben als Grundgedanken die Vorstellung, dass schon der Code allein ein Kunstwerk darstellt. Zum Teil geht es also gar nicht unbedingt um das Resultat des Codes, sondern viel mehr um den Code selbst. Oder das Endergebnis kann eine Mischung aus beidem sein, Code und Resultat.
Piet
Ein schönes Beispiel ist die Sprache „Piet“, benannt nach dem Künstler Piet Mondrian. Der Programmcode dieser Sprache sieht aus wie ein abstraktes Bild. Das schöne dabei ist die Variabilität. Ein Programm, dass den selben Output erzeugt, kann als ganz unterschiedliche abstrakte Bilder dargestellt werden. Wenn man aber die Regeln genau kennt, kann man theoretisch sehen, dass all diese unterschiedlichen Bilder das selbe Ergebnis erzeugen. Entscheidend für die Befehle sind nicht die absoluten Farben, sondern die Farbübergänge. Ein Pointer läuft durch das Bild, registriert diese Farbübergänge und führt dementsprechend Befehle aus.
https://www.dangermouse.net/esoteric/piet/samples.html: Ein Rätsel mit Licht und FarbenAlligator Eggs
„Alligator Eggs“ wird als einfaches Puzzle-Spiel beschrieben, jedoch repräsentiert es den untypisierten Lambda-Kalkül und kann somit ebenfalls als Programmiersprache verwendet werden. Mit den Bausteinen dieses Puzzle-Spiels lassen sich Lambda-Funktionen erstellen, die dann Funktionen in einer Programmiersprache darstellen können. Das Spiel ist für Kinder konzipiert. Es gibt Alligatoren mit Eiern in verschiedenen Farben, die sich gegenseitig auffressen können. Der Esser stirbt und aus seinen Eiern schlüpfen genau die Alligatoren und Eier, die er gefressen hat. Somit ist es ein Konzept, das auch Kinder verstehen können und gleichzeitig können Lambda-Therme vollständig dargestellt werden mit allen Eigenschaften wie Variablen, Klammern und Beta-Reduktion.
http://metatoys.org/alligator/#!/x: Ein Rätsel mit Licht und FarbenOrca
Eine esoterische Programmiersprache, die für Live-Coding verwendet werden kann, ist „Orca“. Statt Text in einen Texteditor zu schreiben, hat man hier ein zwei dimensionales Feld vor sich. Jeder Befehl und jede Zahl ist nur ein Zeichen lang, somit kann man an jeder beliebigen Stelle im Feld ein Zeichen reinschreiben. Jeder Buchstabe des Alphabets ist ein Befehl. Großbuchstaben werden jeden Frame und Kleinbuchstaben bei jedem Bang ausgeführt. Links und rechts eines Buchstaben sind seine Input-Felder und (normalerweise) unter dem Buchstaben das Output-Feld. Mit Orca kann man in Echtzeit Midi- und OSC-Signale an ein Audio-Interface schicken.
https://100r.co/site/orca.html: Ein Rätsel mit Licht und FarbenAus diesen drei Beispielen lassen sich interessante Konzepte und Ideen herausziehen. Bei Piet kann man sehen, wie einfacher Programmcode als kreatives Bild dargestellt werden kann und somit der Code selbst zur Kunst wird. Außerdem wird die Variabilität der Darstellung sehr schnell deutlich, da ein Programm, das den gleichen Output liefert, von unterschiedlichen Programmierern immer anders aussehen wird. Alligator Eggs ist ein schönes Beispiel dafür, wie man aus Programmcode ein selbst für Kinder verständliches Rätselspiel machen kann. Es zeigt, wie man ein theoretisches Konzept in die reale Welt holen kann, indem man es zum Beispiel als das Leben von Alligatoren darstellen kann. An Orca kann man sehen, dass ein Programm nicht immer in Textform sein muss. Gerade ein zwei dimensionales Gitterfeld bietet sich gut an für ein kleines Mini-Spiel. Außerdem passt die Eigenschaft der Echtzeit zu einem Rennspiel, da hier auch alles ständig in Bewegung ist.
Sprache und Komplexität
Ist das Meta Puzzle nun ein kleines Rätselspiel oder kann man es auch als esoterische Programmiersprache betrachten? Ist man als Spieler beschränkt auf wenige Möglichkeiten oder kann man die Rätsel auf viele verschiedenen Weisen lösen? Wie hoch ist die Komplexität dieser „Programmiersprache“?
Nicht nur Programmiersprachen, auch natürliche Sprachen zeichnen sich durch eine hohe Komplexität und eine sehr variable Anwendung aus. Sie bestehen aus Lauten, denen bestimmte Bedeutungen zugewiesen sind. Diese Bedeutungen sind in einer Gesellschaft erstmal relativ fest, da nur so sichergestellt werden kann, dass zwei Menschen sich gegenseitig verstehen können, wenn sie die gleichen Laute verwenden. Zudem lassen sich in jeder Sprache gewisse Regeln erkennen, wie diese Laute kombiniert werden müssen, damit sich für den Hörer ein logischer Sinn daraus ergibt. Es gibt also eine sogenannte Grammatik, die man korrekt benutzen muss. Außerdem kann man die Sprache in einzelne Worte unterteilen, es gibt ein Vokabular.
Natürliche Sprachen dienen primär der zwischenmenschlichen Kommunikation, also dem Austausch von Informationen zwischen Personen. Programmiersprachen hingegen haben schon von vornherein einen anderen Zweck. Sie dienen dazu, menschliche Gedanken und Ideen in Maschinensprache (Nullen und Einsen) zu übersetzen, damit ein Computer das tut, was wir von ihm wollen. Wir haben es hier nicht mir Lauten zu tun, sondern mit Symbolen, denen aber auch, wie bei natürlichen Sprachen, bestimmte Bedeutungen zugewiesen sind. Man kann also durchaus Ähnlichkeiten zwischen diesen zwei Spracharten feststellen. Analog zur Grammatik menschlicher Sprachen gibt es auch bei Programmiersprachen bestimmte Regeln, die man einhalten muss, sonst kann das Programm gar nicht erst laufen oder es stürzt während der Laufzeit ab. Einfach gesagt, wenn man die Grammatik nicht einhält, versteht der Computer nicht, was wir ihm sagen wollen. Die einzelnen Symbole einer Programmiersprache kann man als Vokabular verstehen.
Eine bedeutende Eigenschaft beider Spracharten ist die Vielseitigkeit, wie sich etwas ausdrücken lässt. Alle natürlichen Sprachen sind sehr flexibel und lassen zu, dass man viele verschieden Sätze bilden kann, die aber alle dieselbe Bedeutung haben können. Ähnlich verhält es sich auch mit Programmiersprachen. Ein Problem lässt sich auf viele verschiedene Weisen lösen. Und an dieser Stelle scheint der kreative Aspekt ins Spiel zu kommen. Diese Art der Vielseitigkeit öffnet einen Freiraum für individuelle Entscheidungen. Wenn es nur einen Weg gäbe, ans Ziel zu kommen, so muss ich diesen Weg gehen. Wenn ich aber viele Möglichkeiten habe, so kann ich kreativ werden und meinen eigenen Weg gehen. Und das ist ein Grundkonzept, das wir im Mini-Spiel für Meta Racer verwirklichen wollen.
Das Meta Puzzle als Sprache
Wichtige Faktoren einer Sprache scheinen also unter anderem eine Grammatik, ein Vokabular und eine gewissen Flexibilität zu sein. Es scheint im Meta Puzzle erst einmal keine Regeln zu geben, die man brechen könnte. Es kann nur passieren, dass man die Lichtstrahlen so lenkt, dass keiner auf die rechte Seite zum Output kommt. Dann hätte der Autokristall auch keinen Output und keinen Befehl, der umgesetzt werden könnte. In so einem Fall könnte man definieren, dass das Auto dann keine Antriebskraft mehr hat und stehen bleibt. Somit könnte man schon sagen, dass es eine Regel gibt, die man verletzen kann: „Es muss immer mindestens ein Lichtstrahl am Output ankommen“. Als Vokabular kann man die einzelnen Funktionsblöcke sehen. Mit ihnen kann man arbeiten, um den sonst unveränderten Lichtmustern eine Bedeutung zu geben, sodass sie einen Befehl auslösen können. Flexibel ist es auch, da man einen Output auf verschiedene Weisen erzeugen kann. Es gibt nicht nur einen Lösungsweg.
Man kann in diesem Mini-Spiel die Lichtstrahlen als Daten oder Variablen betrachten und die Spiegel, Teiler und Prismen als Funktionen. Somit ist es auch durchaus vergleichbar mit einer Programmiersprache. Sie ist natürlich noch sehr einfach, kann aber mit ein paar Erweiterungen komplexer werden. Der Input und Output beschränkt sich hierbei dann natürlich auf Licht und Farbe, aber diesen Farben und Farbmustern kann man Bedeutungen und Befehle zuweisen. Dann kann man mit dieser Programmiersprache Auswirkungen auf das Rennen haben, indem man zB. den Kurvenverlauf, die Straßenoberfläche oder die Geschwindigkeit ändert.
Fazit
Mit dem Prototypen haben wir nun ein kleines Mini-Spiel, bei dem man verschiedene Lichtmuster in neue umwandeln kann. Dies kann auf kreative und unterschiedliche Weise getan werden. Das Meta Puzzle kann in das Meta Racer Rennspiel integriert werden. Als kleines Spiel oder Rätsel baut man sich einen Kristall, der dann auf der Rennstrecke zum Einsatz kommen kann.
Man kann diese Idee noch weiter führen und die Komplexität kann natürlich noch gesteigert werden. Zum Beispiel könnte man in der Werkstatt mehrere Kristalle programmieren, die man dann während der Fahrt beliebig wechseln kann, je nach Bedarf. Des weiteren könnte man Kristalle bauen, die man dann wieder in neuen Kristallen einsetzt. So kann man mehrere Kristalle ineinander verschachteln und erreicht eine noch höhere Komplexität, was den Programmier-Aspekt angeht.
Tim Offenhäußer studiert Musikinformatik an der Hochschule für Musik in Karlsruhe und war Praktikant bei Studio Fluffy. Inzwischen ist er als Werksstudent bei Studio Fluffy tätig.