Retro-Klassiker sterben nie! In diesem Projekt kannst du das legendäre „4 Gewinnt“ auf einen Arduino Uno zocken. Die Herausforderung dabei: Ein großes 4" SPI-Display hat eine recht langsame Bildwiederholrate. Doch mit ein paar Programmiertricks läuft das Spiel butterweich und sieht auf dem großen Screen richtig schick aus.
Spiel 179 aus der 200 Arduino Spiele Sammlung.
So funktioniert das Spiel
Gesteuert wird nicht über Touch oder langweilige Tasten, sondern stilecht über einen Rotary Encoder (Drehimpulsgeber).
- Auswählen: Durch Drehen des Encoders bewegst du den Auswahl-Cursor über die Spalten.
- Setzen: Ein kurzer Druck auf den Taster des Encoders lässt deinen Spielstein in die gewählte Spalte fallen.
- Ziel: Wer zuerst vier Steine seiner Farbe (Rot oder Blau) in eine Reihe bringt egal ob waagerecht, senkrecht oder diagonal gewinnt die Runde.
- Reset: Du willst das ganze Turnier neu starten? Halte den Taster einfach 3 Sekunden lang gedrückt, um alle Punkte auf Null zu setzen.
Die Verdrahtung
Der Aufbau ist dank SPI-Anbindung des Displays recht übersichtlich. Hier siehst du, wie das Display und der Encoder mit dem Arduino Uno verbunden werden:
- Display: CS an Pin 10, DC an Pin 8, Reset an Pin 9 (SPI-Bus).
- Encoder: CLK und DT an Pin 2 und 3 (für die Interrupts), SW (Taster) an Pin 4.
Ein Blick in den Code: Die 3 wichtigsten Stellen
Damit das Spiel flüssig läuft und die Logik stimmt, stecken im Sketch ein paar interessante Kniffe:
1. Die Gewinn-Prüfung (Matrix-Check)
Das Herzstück des Spiels. Nach jedem Zug muss der Arduino prüfen, ob eine Viererkette entstanden ist. Hier als Beispiel der horizontale Check
// Horizontaler Check
for (int r = 0; r < 6; r++) {
for (int c = 0; c < 4; c++) {
if (board[c][r] == p && board[c+1][r] == p && board[c+2][r] == p && board[c+3][r] == p) {
return true;
}}}}
Erklärung: Da das Spielfeld ein 2D-Array (also eine Matrix) ist, kannst du Schleifen laufen, die immer vier benachbarte Felder vergleichen. Sobald vier gleiche Spieler-IDs gefunden werden, wird die Gewinnlinie gezeichnet.
2. Performance-Trick: Gezieltes Zeichnen
Anstatt bei jeder Bewegung des Encoders den ganzen Bildschirm neu zu zeichnen (tft.fillScreen), was Sekunden dauern würde, wird nur der Teil neu gezeichnet der auch verändert wurde "Dirty Rectangles".
tft.fillRect(90, 8, 300, 24, COLOR_BG); // Nur den Cursor-Bereich löschen
int x = startX + cursorCol * slotSize + slotSize / 2;
tft.fillCircle(x, 20, 8, activeColor);
}
Erklärung: So kannst musste du nur löschen mit fillRect wo sich der Cursor bewegt. Das Gitter und die Texte bleiben stehen. Dadurch reagiert das Display blitzschnell auf deine Drehungen.
3. Die Zeitmessung für den Reset
Um zwischen einem Stein-Wurf (kurz klicken) und einem Total-Reset (lang halten) zu unterscheiden, wird die Zeit gemessen.
unsigned long pressStart = millis();
while (digitalRead(button) == LOW) {
if (millis() - pressStart >= 3000) { // 3 Sekunden erreicht?
scoreP1 = 0; scoreP2 = 0; // Highscore löschen
resetBoard();
}
}
}
Erklärung: Die Funktion millis() gibt dir die Millisekunden seit dem Start des Arduinos "zurück". So kannst du den Startwert des Klicks mit der aktuellen Zeit verglkeichen. Ist die Differenz größer als 3000ms, wird der Turnierstand gelöscht.
Zwei Versionen für dein Projekt
Es gibt zwei Varianten des Codes, je nachdem, wie du spielen möchtest:
- Turnier-Modus (mit Punkten): Diese Version zeigt links und rechts riesige Zahlen für den Punktestand an. Ideal für Duelle „Best of 9“. Wer zuerst 5 Siege hat, ist der Champion.
- Klassik-Modus (ohne Punkte): Ein puristisches Design mit einem schlichten schwarzen Rand um das Gitter ohne dass jemand über die gewonnen Spiele Buch führt.
Viel Spaß beim Nachbauen und Zocken!
Der Arduino Code für das 4 Gewinnt Spiel mit Punktestand
Der Arduino Code für das 4 Gewinnt Spiel ohne Punktestand







