Vier gewinnt mit der Ping-Pong-Platine

von  Michael Gaus

Elektronik-Labor  Labortagebuch  ELO  Mikrocontroller



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


Elektronik-Labor  Labortagebuch  ELO  Mikrocontroller