Vier gewinnt mit der Ping-Pong-Platine
von Michael Gaus
Das
Spiel "4 gewinnt" gehört zu den Spieleklassikern und wird fast jedem
bekannt sein. Dieses Spiel wurde hier elektronisch zur Verwendung auf
der Ping-Pong-Platine umgesetzt.
4 gewinnt wird auf einem
senkrecht stehenden hohlen Spielfeld gespielt, in das die Spieler
abwechselnd ihre Spielsteine fallen lassen. Wenn ein Spieler einen
Spielstein in eine Spalte fallen lässt, besetzt dieser den untersten
freien Platz der Spalte. Gewinner ist der Spieler, der es als erster
schafft, vier oder mehr seiner Spielsteine waagerecht, senkrecht oder
diagonal in eine Linie zu bringen. Das Spiel endet unentschieden, wenn
das Spielbrett komplett gefüllt ist, ohne dass ein Spieler eine
Viererlinie bilden konnte.
Siehe auch Beschreibung auf Wikipedia unter http://de.wikipedia.org/wiki/Vier_gewinnt
Die
120 LEDs der Ping-Platine symbolisieren das Spielfeld bestehend aus 12
Spalten und 10 Reihen. Da die LEDs leider nur einfarbig sind, wird zur
Unterscheidung der Spielsteine der beiden Spieler unterschiedliche
LED-Helligkeit verwendet: die Steine mit der vollen Helligkeit gehören
Spieler 1 und die diejenigen mit verminderter Helligkeit Spieler 2. Zur
Bedienung hat jeder Spieler sein eigenes Potentiometer: Spieler 1 hat
das linke Poti overhalb des Münzschlitzes, Spieler 2 das rechte Poti.
Außerdem wird zum Einwerfen des Spielsteins in die selektierte Spalte
ein zusätzlicher Taster benötigt, den sich beide Spieler teilen.
Es
wird ein Taster (1-poliger Schließer) benötigt, der zwischen PortD.3
(also Lötpad D3) und GND angeschlossen wird. Der benötigte
Pullup-Widerstand kann im Controller intern hinzugeschaltet werden.
Verwendet
werden kann z.B. ein Modell dieser Art:
http://www.reichelt.de/?;ACTION=3;LA=444;GROUP=C221;GROUPID=3277;ARTICLE=19983;START=0;SORT=artnr;OFFSET=16
Solch ein Taster kann leicht in das Ping-Pong-Gehäuse eingebaut
werden, indem vorsichtig ein Loch in den Deckel gebohrt wird, dann der
Taster hindurchgesteckt und per Mutter festgeschraubt wird. Mit 2
Stückchen Drahtlitze werden dann die beiden Anschlüsse mit D3 und GND
verlötet.
Das linke Poti oberhalb des Münzschlitzes gehört
Spieler 1, das rechte Spieler 2. Der Taster wird von beiden Spielern
gemeinsam genutzt. Die Spielsteine mit voller LED-Helligkeit gehören
Spieler 1, diejenigen mit verminderter Helligkeit Spieler 2. Die
Spieler sollten sich nicht gegenüber sitzen, sondern nebeneinander vor
dem Spielfeld.
Gestartet wird das Spiel durch Einwerfen
einer Münze in den Münzschlitz. Es erscheint zunächst eine kleine
Animation mit einer "4" als Begrüßungsbildschirm. Anschließend
erscheint ein blinkender Pfeil auf der rechten oder linken Seite des
Displays, der den gerade angwählten Spieler symbolisiert. Durch Drehen
des linken Potis kann ausgewählt werden, welcher Spieler beginnen soll.
Durch Drehen nach rechts (im Uhrzeigersinn) wird Spieler 2 gewählt,
durch Drehen nach links (gegen den Uhrzeigersinn) wird Spieler 1
gewählt. Diese Auswahl muss durch einen Tastendruck bestätigt werden.
Nun
erscheint in der obersten LED-Reihe eine blinkende LED, die je nach
gerade aktivem Spieler entweder mit voller Helligkeit blinkt (Spieler
1) oder mit verminderter Helligkeit (Spieler 2). Der beginnende Spieler
darf nun den ersten Stein einwerfen. Hierzu wählt er mit seinem Poti
die gewünschte Spalte aus und bestätigt durch einen Tastendruck. Der
Spielstein "fällt" nun in diese Spalte hinunter, grafisch dargestellt
durch eine kleine Animation. Anschließend erscheint wieder in der
obersten LED-Reihe eine blinkende LED, diesmal für den anderen Spieler.
Dieser wählt wiederum mit seinem Poti die gewünschte Spalte aus und
bestätigt per Tastendruck.
Dies wiederholt sich nun solange, bis
entweder einer der Spieler gewonnen hat, indem er 4 eigene Spielsteine
waggrecht, senkrecht oder diagonal in eine Linie gebracht hat oder das
Spielfeld komplett voll ist. Falls ein Spieler gewonnen hat, wird dies
durch Blinken seiner in eine Linie gebrachten Spielsteine symbolisiert.
Nach einigen Sekunden wird dann das Spiel automatisch beendet und der
Controller geht in den Standbymodus. Alternativ kann durch Tastendruck
während des Blinkens ein neues Spiel gestartet werden, das wieder durch
Darstellung der animierten "4" beginnt. Falls es keinen Sieger gab,
wird dies durch Blinken des gesamten Spielfelds dargestellt. Auch hier
wird nach einigen Sekunden der Standbymodus aktiv oder es kann durch
Tastendruck während des Blinkens ein neues Spiel gestartet werden.
Wenn
während des Spiels eine Spalte voll ist, dann wird diese bei der
Poti-Auswahl automatisch übersprungen. Es können generell nur freie
Spalten angewählt werden.
Der Code wurde mit dem C-Compiler
CodeVisionAVR (Version 2.04.6 Evaluation) erstellt. Diese
Evaluation-Version kann für den privaten nicht-kommerziellen Gebrauch
kostenlos verwendet werden und ist auf eine Codegröße von 3 kB
beschränkt, was für diese Anwendung ausreicht. Das komplette Projekt
ist in der ZIP-Datei enthalten. Die erforderliche Projektdatei, um die
Software in CodeVisonAVR zu öffnen ist pong.prj, der eigentliche
Quellcode ist in pong.c enthalten.
Im Array ledState[] wird für
jede LED der gerade aktive Zustand gespeichert: freies Feld, belegtes
Feld von Spieler 1 oder belegtes Feld von Spieler 2, wobei jeder
Zustand noch als "blinkend" markiert werden kann. In der
Interruptroutine des Timers2 wird dieses Array ausgewertet und die LEDs
entsprechend angesteuert. In jedem Durchlauf wird nacheinander eine der
12 Spalten angesteuert, nach 12 Durchläufen wurde also ein komplettes
Bild (Frame) angezeigt. Bei "verminderter Helligkeit" (Spieler 2) wird
eine LED nur bei jedem achten Frame angesteuert und leuchtet somit nur
schwach.
Beim Einwurf eines Spielsteins wird zunächst ermittelt,
wie "tief" dieser fallen kann, indem im Array schrittweise geprüft
wird, ob das darunterliegende Feld bereits belegt ist. Anschließend
wird der Spielstein schrittweise eine Position nach unten geschoben mit
anschließender kurzer Wartezeit, um eine Animation eines fallenden
Spielsteines zu erzeugen. Abschließend wird noch geprüft, ob 4
Spielsteine in einer Linie sind. Hierzu werden von der
Spielsteinposition aus die benachbarten Felder horizontal, vertikal und
2x diagonal im Array überprüft, ob diese vom aktuellen Spieler belegt
sind und entsprechend aufsummiert. Bei mindestens 4 Spielsteinen in
einer Reihe wird dann der Gewinn des Spiels erkannt.
Quellen/Links:
Video: http://www.youtube.com/watch?v=-wjuiiA60fE
Wikipedia: http://de.wikipedia.org/wiki/Vier_gewinnt
C-Compiler CodeVision AVR: http://www.hpinfotech.ro/html/download.htm
Download: 1003VierGewinnt.zip