Mühle ist eines der ältesten und beliebtesten Taktikspiele der Welt einfach zu lernen, aber voller strategischer und taktischer Tiefe. Ein ESP 32 und ein P3 LED-Modul LED-Matrix-Panel mit 192X192mm und 64x64 RGB SMD Pixel eignen sich hervorragt um dieses Spiel zu digitalisieren.
Das Prinzip ist simpel: Du trittst gegen deinen Mitspieler an und versuchst, drei eigene Steine in eine Reihe zu bringen, das ist dann eine „Mühle“. Gelingt dir das, darfst du einen gegnerischen Stein vom Brett werfen. Hast du nur noch drei Steine übrig, darfst du mit deinen Steinen auf jedes freie Feld springen. Verloren hat, wer noch 2 Steine besitzt oder sich nicht mehr bewegen kann.
Ablauf des digitalen Mühle Spieles:
- Phase 1: SETZEN (PHASE_SETZEN)
- Aktiver Spieler: Rot beginnt, danach abwechselnd Blau (jeder hat 9 Steine am Rand).
- Feld ansteuern: Joystick bewegt den Cursor über die 24 Punkte.
- Stein platzieren: Druck auf Button 1 (KEY1) auf einem freien Feld.
- Stein wird gesetzt (Randstein erlischt).
- Prüfung auf Mühle:
- Keine Mühle geschlossen: Wechsel zum anderen Spieler.
- Mühle geschlossen (3er-Reihe): Wechsel zu Phase: KLAUEN (PHASE_MUEHLE).
- Ende der Setzphase: Sobald alle 18 Steine auf dem Feld liegen (unplacedRed == 0 und unplacedBlue == 0), prüft das System vor dem ersten Zug:
- Ist der aktive Spieler blockiert? Ja → Der andere Spieler gewinnt sofort (Phase: GEWONNEN).
- Nicht blockiert: Wechsel zu Phase 2 (WÄHLEN).
- Phase 2: ZIEHEN & SPRINGEN
- 2.1 Stein auswählen (PHASE_WAEHLEN)
- Display zeigt ROT WAEHLT bzw. BLAU WAEHLT.
- Spieler steuert einen eigenen Stein an.
- Druck auf Button 1 nimmt den Stein auf → Stein beginnt gelb zu blinken.
- Status wechselt zu PHASE_BEWEGEN.
- 2.2 Stein bewegen (PHASE_BEWEGEN)
- Display zeigt ROT ZIEHT bzw. BLAU ZIEHT.
- Spieler steuert das Zielfeld an.
- Aktion A (Abbrechen): Klick erneut auf denselben gelben Stein → Stein wird abgelegt, zurück zu PHASE_WAEHLEN.
- Aktion B (Setzen auf freies Feld):
- Regelprüfung Normalzug (> 3 Steine): Zielfeld muss ein direkt verbundener Nachbar auf der Linie sein.
- Regelprüfung Springen (≤ 3 Steine): Zielfeld darf jedes beliebige freie Feld auf dem gesamten Brett sein.
- Ungültiger Zug: Nichts passiert.
- Gültiger Zug: Stein wechselt die Position.
- Prüfung nach dem Zug:
- Mühle geschlossen: Wechsel zu Phase: KLAUEN (PHASE_MUEHLE).
- Keine Mühle: Spielerwechsel → Blockade-Prüfung.
- 2.3 Blockade-Prüfung (Vor jedem Zugwechsel)
- Hat der jetzt ankommende Spieler mindestens einen gültigen Zug?
- Nein (vollständig eingesperrt und ≤ 3 Steine nicht erfüllt): Der andere Spieler gewinnt sofort (Phase: GEWONNEN).
- Ja: Wechsel zu PHASE_WAEHLEN für den nächsten Spieler.
- 2.1 Stein auswählen (PHASE_WAEHLEN)
- Sonderzustand: KLAUEN (PHASE_MUEHLE)
- Display zeigt ROT KLAUT bzw. BLAU KLAUT. Cursor blinkt magenta.
- Aktiver Spieler steuert einen gegnerischen Stein an.
- Druck auf Button 1 prüft die Klau-Regel:
- Stein steckt in geschlossener gegnerischer Mühle: Ungültig (darf nicht geschlagen werden).
- Ausnahme: Hat der Gegner ausschließlich Steine in Mühlen, darf jeder Stein geschlagen werden.
- Bei gültiger Wahl: Gegnerischer Stein wird vom Brett gelöscht.
- Siegprüfung nach Klauen:
- Hat der Gegner jetzt weniger als 3 Steine auf dem Feld?
- Ja (nur noch 2 Steine): Aktiver Spieler gewinnt → Wechsel zu Phase: GEWONNEN.
- Nein: Spielerwechsel → Blockade-Prüfung → zurück zu PHASE_WAEHLEN (oder weiter PHASE_SETZEN, falls noch in Phase 1).
- Hat der Gegner jetzt weniger als 3 Steine auf dem Feld?
- Phase 3: SPIELENDE (PHASE_GEWONNEN)
- Textanzeige: ROT SIEGT oder BLAU SIEGT.
- Alle Spielereingaben und Cursorelemente auf dem Feld werden gesperrt.
- Neustart: Druck auf Button 1 (KEY1) setzt alle Variablen, Arrays und Steine auf den Anfangszustand zurück (Phase 1: SETZEN).
- Globaler Interrupt: HARD-RESET (Jederzeit aktiv)
- Taste 2 (btn2) wird gedrückt gehalten.
- Nach 2 Sekunden Dauerbetätigung: Sofortiger Abbruch des laufenden Spiels und Rückkehr zu Phase 1: SETZEN.
Der Mühle ESP32 Code für den Empfänger
Der ESP32 DevKit liest die analogen X/Y-Werte des Joysticks sowie die beiden Tasterzustände zyklisch über die GPIOs ein. Durch die internen Pull-up-Widerstände werden keine externen Widerstände benötigt, während die Pegel im Code direkt für eine saubere Tastenlogik invertiert werden. Ein kompaktes Daten-Struct bündelt Achsen- und Tasterdaten speichereffizient in einem einzigen fest definierten Übertragungspaket. Das vorab genullte peerInfo-Struct (memset) verhindert Initialisierungsfehler und sorgt für eine saubere Kopplung im ESP-NOW-Stack. Die Steuerdaten werden alle 50 ms ohne Router direkt per ESP-NOW an das Matrix-Panel übertragen – latenzfrei und mit minimaler Funklast.
Anschluss des Senders für die Eingabe
+-----------------------+ +-----------------------+ | OPEN-SMART Joystick | | ESP32 DevKit | | Control Board | | | | | | | | GND +--------------+ GND | | VCC +--------------+ 3V3 | | OUTX +--------------+ GPIO 32 (ADC1_CH4) | | OUTY +--------------+ GPIO 33 (ADC1_CH5) | | OUTZ | (nicht belegt) | | KEY1 +--------------+ GPIO 25 (Aktion) | | KEY2 +--------------+ GPIO 26 (Reset 2s) | | KEY3 | (nicht belegt) | | KEY4 | (nicht belegt) | +-----------------------+ +-----------------------+
Der Arduino Code für das Spiel
Der Empfänger-ESP steuert die 64x64 Matrix über DMA an und empfängt die Joystick- und Tastensignale latenzfrei über ESP-NOW. Alle 24 Spielfeldpunkte sind als fester Graph hinterlegt, sodass der Cursor sauber an den Linien entlang von Knoten zu Knoten springt. Ein zentraler Zustandsautomat regelt den Spielablauf vom Setzen über das Ziehen und Springen bis zum Klauen bei geschlossener Mühle. Mühlen sowie Sieg- und Blockadebedingungen werden nach jedem Zug automatisch mathematisch im Array überprüft. Zusätzlich sind ein blinkender Farbcursor für die Spielerführung sowie ein blockierungsfreier 2-Sekunden-Sicherheitsreset über Taster 2 integriert.
Anschluss des Empfängers für die Ausgabe
+-----------------------+
| 5V Netzteil (>= 4A) |
+-----------+-----------+
|
| 5V & GND (Schraubklemmen / Hohlstecker)
v
+-----------+-----------------------------------------------+
| SEENGREAT Adapter Board REV 2.2 |
| |
| [ Eingesteckter ESP32-S3-DevKitC-1 ] |
| (Empfängt Steuersignale kabellos über ESP-NOW) |
| |
| [5V Ausgangsklemmen] [HUB75 Flachband- |
| Wannenstecker 16P] |
+-----------+----------------------------------+------------+
| |
| 5V Stromversorgung | 16-poliges
| (Rot/Schwarz Litzen) | HUB75 Datenkabel
v v
+-----------+----------------------------------+------------+
| 64x64 RGB LED Matrix Panel |
| |
| [Strom-Eingang] [HUB75 DATA IN] |
+-----------------------------------------------------------+






