Connect Four: ESP32-C3 LED Edition
A hardware-based Connect Four game featuring an 8x8 NeoPixel matrix, a strategic Minimax AI, and a dynamic "Attract Mode" for public display.
How the Program Works
The program is built as a Finite State Machine (FSM). It manages the game flow by transitioning between distinct states based on user input, game outcomes, or inactivity timers.
1. Game States
- Menu: Displays stylized Roman numerals (I or II) to select between Single Player or Two Player modes.
- Game Play: The main loop handles the real-time gravity of falling discs, encoder tracking for column selection, and the hand-off between the human and the AI.
- Game Over: Triggered when a win or draw is detected. It "locks" the board, dims the background discs to 15% intensity, and flashes the winning line.
- Demo Mode: Triggered after 60 seconds of inactivity. The AI plays against itself to act as a visual "attract mode."
2. Win Detection Logic
To ensure 100% accuracy, the program performs a synchronous, multi-directional scan of the 7x6 grid after every single move. It checks for four matching non-zero values in the following patterns:
- Horizontal:
[column] [row]to[column + 3] [row] - Vertical:
[column] [row]to[column] [row + 3] - Diagonal Up:
[column] [row]to[column + 3] [row + 3] - Diagonal Down:
[column] [row]to[column + 3] [row - 3]
The AI: Strategic Minimax
The computer opponent uses the Minimax Algorithm, a classic artificial intelligence method for zero-sum games.
1. Look-Ahead (Depth Search)
The AI does not just look at the current board; it simulates the game 6 to 8 moves into the future. It explores a "tree" of possibilities: "If I play here, and the player plays there, then I can play here..."
2. Alpha-Beta Pruning
Because searching millions of possibilities would be too slow for a microcontroller, we use Alpha-Beta Pruning. This allows the AI to "prune" (ignore) branches of the game tree that are mathematically guaranteed to be worse than moves it has already found, significantly speeding up the calculation.
3. Immediate Threat Reaction
To prevent the AI from being "distracted" by deep strategies while missing a simple win or loss, we implemented a high-priority Reaction Scanner:
- Kill Move: If the AI can win in exactly one move, it takes it immediately.
- Block Move: If the player is one move away from winning (3-in-a-row), the AI identifies the threat and blocks it regardless of the Minimax score.
4. Controlled Randomness (Demo Mode)
To keep the Demo Mode interesting for spectators, the AI has a 25% chance to ignore the "perfect" move and pick a random column. This ensures that every demo game is unique and not a repetitive loop of the same strategy.
Technical Specifications
Hardware Pins (Lolin C3 Mini)
| Component | Pin | Function |
|---|---|---|
| LED_PIN | 4 | WS2812B NeoPixel Data |
| ENC_A | 0 | Rotary Encoder Phase A |
| ENC_B | 1 | Rotary Encoder Phase B |
| ENC_SW | 2 | Switch (Includes 50ms Software Debounce) |
NeoPixel Grid Layout
The 8x8 matrix is mapped as follows:
- Play Area: 7 columns (0-6) by 6 rows (0-5).
- Boundaries: Row 1 and Column 7 are lit in Blue to mark the board limits.
- Indicators: The top-right pixel (7,0) pulses in the computer's color while it is "thinking."
- Glowing Frame: During Demo mode, the blue borders pulse with a white "glow" effect using a
beat8sine wave to indicate autonomous play.
Controls & Interaction
- Rotate Encoder: Move the cursor (top row) to select a column.
- Press Encoder Button: Drop a disc.
- Full Column Warning: If you attempt to play in a full column, the selection disc will blink rapidly, and the move will be ignored.
- Reset: After a game ends, press the button once to return to the Menu.
Build Flags (platformio.ini)
Tweak the game performance without changing the source code:
IDLE_TIMEOUT: Time (ms) before Demo Mode starts.DEMO_RESET_PAUSE: Delay (ms) between games in Demo Mode.DEBOUNCE_DELAY: Sensitivity of the encoder button.BRIGHTNESS: Global brightness of the NeoPixels.