Labyrinth auf der Pong-Platine

von Piotr Platek  

Elektronik-Labor  Labortagebuch  ELO  Mikrocontroller



Links, rechts, gerade, wieder rechts und ... Sackgasse, die Ecke scheint bekannt zu sein. Wie lange bin ich schon unterwegs? Wer hat diese verdammten Stollen gebaut? Und wo ist die Bombe, die es zu entschärfen gilt? Die Zeit rennt und die Welt ist in der Gefahr. Ein Klassisches Szenario, oder?

 

Viele Computerspiele der unterschiedlichsten Genres, sogenannte „Retro"-Spiele von damals, als noch niemand überhaupt an 3D-Features dachte, gleichermaßen wie heutige Spiele mit 3D-Unterstüztung, nutzen immer wieder die gleiche elementare Komponente, nämlich eine Karte. Die Karte repräsentiert die "Welt" des Spiels, d.h. sie beschreibt die Wege, der Spielhelden und bestimmt das „Universum" des Spiels. In der Kategorie "Labyrinth-Spiele" ist die Karte quasi ausschließliches Hauptelement. Hier muss sich der Spieler durch einen Irrgarten bewegen, um Schätze zu finden, Feinde zu verfolgen oder zu umgehen, etc. Die berühmtesten Spiele dieser Kategorie sind „Pac-Man" und „Bulder-Dash".

 

Kann die Pong-Platine Labyrinth-Spiele unterstützen? Aber natürlich! Das Spielkonzept wurde ja schon im Vorwort umrissen. Dazu müssen allerdings noch ein paar Dinge näher bestimmt werden.
-- Das Spiel soll mehrere Labyrinthe in unterschiedlichen Spielniveaus anbieten.
-- Die Dimension des Labyrinths soll klar über die 10x12 Punkte der LED-Matrix (Pong-Platine) hinausgehen.
-- Ein neues Labyrinth soll relativ einfach zu definieren sein.

 

Die Steuerung des Spieles erfolgt über den Joystick des Wii-Nunchuks. Es wird aber auch noch eine vereinfachte Version des Spieles geben, welche die Standard-Pong-Platine mit ihren beiden Potentiometern nutzt, und sich damit an die „ungeduldigen" Tester richtet, die weder Wii-Nunchuk noch I2C Pegelwandler zur Verfügung haben.

 



 

Die Pong-Platine zeigt mit ihren 12x10 Punkten nur einen Ausschnitt des deutlich größeren Gesamtfelds des Labyrinths. Das Ausschnitts- bzw. Sichtfenster soll entsprechend den Bewegungen des Spielers über das gesamte Spielfeld (Labyrinth) wandern. Der Satz an verwendeten Labyrinthen wird in einer Tabelle ("gPrgBoard" im Programmspeicher/Flash) gespeichert, wobei jedes Labyrinth als eine Konstantenmenge abgelegt wird.

Code:

prog_uint16_t gPrgBoard[SizeY*BOARDN][SizeX]=
{
{0x3FF,0x200,0x2FB,0x282,0x2AE,0x2AA,0x2A2,0x2B8,0x2AF,0x202,0x2FE,0x228,
0x2A2,0x2EE,0x282,0x2BA,0x2AA,0x388,0x2AB,0x23A,0x292,0x2F6,0x254,0x210,
0x2DF,0x388,0x23A,0x2AA,0x28A,0x2AB,0x2BA,0x288,0x2FA,0x282,0x22A,0x3FF}, ...

Jede „Zelle“ der Tabelle repräsentiert einen zehnstelligen Binärwert und beschreibt damit eine Spalte (10 LEDs) des Sichtfensters (Pong-Platine). Die „Wände“ des Labyrinths (kein Durchgang) sind mit dem Bitwert „1“ (LED=ein) kodiert, die „Wege“ (Durchgang) mit dem Bitwert „0“ (LED=aus). Die Tabelle beinhaltet mehre Labyrinthe, und die Konstante „BOARDN“ enthält die Anzahl der Labyrinthe.

Die Position des „Sichtfensters“ (sichtbarer Teil des Labyrinths repräsentiert durch die 12x10 LEDs) bzw. die Position seiner linken, unteren Ecke wird über die beiden Koordinaten „sx“ und „sy“ („s“ wie Screen) relativ zur linken, unteren Ecke des Gesamtspielfelds angegeben.

Die Scroll-Funktion verschiebt die Fläche des Sichtfensters immer dann, wenn der Spieler in die Nähe der Begrenzung (links, rechts, oben und unten) des Sichtfensters (LED-Platine) kommt. Die Entfernung zum Rand, ab der eine Verschiebung ausgelöst wird, ist in der „GAP-Konstante“ in der Präprozessoranweisung definiert.

Mit einfarbigen LEDs können (pro LED) an sich nur 2 Zustände abgebildet werden, nämlich „an“ bzw. „aus“. Beide Zustände werden zur Darstellung von „Wand“ bzw. „Weg“ genutzt. Um die Position (px, py – p wie Player) des Spielers (dritter Zustand) abgesetzt darzustellen, blinkt die entsprechende LED. Das Gleiche gilt für die Position (hx, hy – h wie Hatz) der Bombe bzw. des Ziels.

Die Bewegung der Spieler und damit auch die Verschiebung des Sichtfensters wird über den Analogjoystick bzw. in der Version ohne Wii-Nunchuk über die zwei Potentiometer der Platine gesteuert.




Die manuelle Erarbeitung eines Labyrinths bzw. die Erstellung der zugehörigen Daten kann sehr aufwendig sein. Natürlich kann ein individuelles Tool für die Entwicklung eines Labyrinths programmiert werden, allerdings ist dies gar nicht nötig. Wir bedienen uns einfach eines Arbeitsblatts einer Standard-Tabellenkalkulation. Die Wände werden mittels Einsen („1“) markiert bzw. „gemalt“ und die Werte in entsprechenden Hex-Daten konvertiert. Die farbige Darstellung der Wände wird mittels „bedingter Formatierung“ erreicht. Das zum Download beigefügte Arbeitsblatt beinhaltet den Aufbau von drei Labyrinthen in verschiedenen Schwierigkeitsstufen. Anschließend müssen die Daten noch im CSV-Format exportiert und wieder in die „main.h“-Datei importiert werden. Die fehlenden Klammern für eine adäquate „C“-Tabellendefinition sollte keine Herausforderung darstellen.

Bei der ersten Version des Programms, habe ich festgestellt, dass die Testanwender gerne mehrere Spielniveaus hätten, und glücklicherweise ist der Flash-Speicher groß genug, um mehrere Spielniveaus zu fassen. Das Spiel wurde dann entsprechend angepasst. Jetzt enthält die Tabelle Labyrinthdaten für 3 verschiedenen Labyrinthe. Die Anzahl der Labyrinthe wird mit der Konstante BOARDN bestimmt und kann jeder Zeit geändert werden. Selbstverständlich müssen die fehlenden Labyrinthe zusätzlich definiert werden.

Das Spiel fängt immer in der linken, unteren Ecke am Punkt mit den Koordinaten (1,1) an. Sowohl die Koordinaten des Zieles (die Bombe) wie auch die Zeit (in Sekunden) für jedes Spielniveau sind in der „main.h“-Datei in der Tabelle „gPrgHunt“ definiert.

Die entsprechenden Programme liegen in „C“ als AVR-Studio-Projekte und als MS Excel bzw. Open Office Calc zum Download vor.

Dieses Spiel kann durchaus Grundlage für weitere Entwicklungen sein. Eine echte Herausforderung wäre eine Anwendung im Bereich der Künstlichen Intelligenz, wie z.B. die Steuerung eines Roboters. Das könnte ein Staubsauger sein, der die Karte der eigenen Wohnung im seinem Speicher intus hat und alle Ecken bei der Reinigung „besuchen“ bzw. abfahren muss.

Wer also programmiert nun den nächsten Algorithmus für eine maschinelle Labyrinthanwendung unter Nutzung der Pong-Platine?




Download:  1003pong-lab-hex.zip  1003pong-lab-source.zip


Elektronik-Labor  Labortagebuch  ELO  Mikrocontroller