Klassisches Asteroids-Spiel mit Arduino Mega und MAX72XX LED-Matrix
Komponenten und Materialien
| Komponente | Menge | |
|---|---|---|
| Arduino Mega 2560 | 1 | |
| MAX7219 LED-Matrix Shield (Maxim MAXREFDES99#) | 1 | 8x8 LED Matrix |
| Taster 12mm (SparkFun) | 2 | Links / Rechts |
| Summer (Buzzer) | 1 | aktiv, für Soundeffekte |
| Steckbrett (Breadboard) | 1 |
Spielbeschreibung
Ein einfaches Arcade-Spiel auf einer 8x8 LED-Matrix. Der Spieler steuert ein Raumschiff (ein Pixel in der untersten Reihe) per zwei Tastern nach links/rechts. Asteroiden (Pixel) fallen von oben nach unten. Das Spiel wird mit der Zeit schneller. Bei Kollision: Explosionsanimation, Sound, Anzeige der Überlebenszeit (Score). Tastendruck nach Game Over startet neues Spiel.
Hardware-Anschluss
- MAX7219: DIN→Pin 12, CLK→Pin 11, LOAD/CS→Pin 10
- Taster Links: Pin 2 (INPUT_PULLUP), Taster Rechts: Pin 3 (INPUT_PULLUP)
- Summer: Pin 9
- Stromversorgung über Arduino USB
Software
- Arduino IDE
- Bibliothek:
LedControl.h(von Eberhard Fahle)
Code-Übersicht
Der vollständige Code ist im Repository enthalten. Hier die Kernlogik:
Initialisierung
LedControl lc = LedControl(12, 11, 10, 1); // DIN, CLK, LOAD, Geräteanzahl
int ship = 3; // Startposition Raumschiff (Spalte 0-7)
int columns[8] = {0}; // Asteroiden-Positionen pro Spalte (0=kein, 1-10=Reihe)
int tick = 300; // Spielgeschwindigkeit (ms)
int tickCounter = 1;
bool gameOver = false;
Interrupts für Tasten (entprellt)
void left() {
if(millis() - buttonPressed > 150) {
ship = (ship == 0) ? 7 : ship - 1; // Wrap-around
lc.clearDisplay(0);
buttonPressed = millis();
}
if(gameOver) { gameOver = false; setup(); } // Neustart
}
void right() {
if(millis() - buttonPressed > 150) {
ship = (ship == 7) ? 0 : ship + 1;
lc.clearDisplay(0);
buttonPressed = millis();
}
if(gameOver) { gameOver = false; setup(); }
}
Haupt-Loop (Game Tick)
void loop() {
if(millis() - now > tick) {
score++; // Score = überlebte Ticks
now = millis();
// Alle 4 Ticks: neues Asteroiden-Spawn & Beschleunigung
if(tickCounter == 1) {
tick = tick / 1.02; // schneller
int col = random(0, 8);
if(columns[col] == 0) columns[col] = 1; // neuer Asteroid oben
}
tickCounter = (tickCounter == 4) ? 1 : tickCounter + 1;
// Alle Asteroiden eine Reihe nach unten bewegen
for(int i=0; i<8; i++) {
if(columns[i] == 10) columns[i] = 0; // unten raus -> entfernen
if(columns[i] != 0) columns[i]++;
}
lc.clearDisplay(0);
}
// Anzeige: Raumschiff (Reihe 7), Asteroiden
lc.setLed(0, 7, ship, true);
for(int i=0; i<8; i++) {
if(columns[i] > 0) {
lc.setLed(0, columns[i]-2, i, true); // zwei Pixel hoch
lc.setLed(0, columns[i]-3, i, true);
}
}
// Kollision prüfen (Asteroid in Reihe 8 oder 9 bei Schiffsspalte)
if(columns[ship] == 9 || columns[ship] == 10) {
// Explosionsanimation + Sound
for(int i=0; i<4; i++) {
lc.setLed(0, 7, ship+i, true);
lc.setLed(0, 7, ship-i, true);
lc.setLed(0, 7-i, ship+i, true);
lc.setLed(0, 7-i, ship-i, true);
lc.setLed(0, 7-1.5*i, ship, true);
tone(9, random(1000), 250); // zufälliger Sound
delay(250); lc.clearDisplay(0); noTone(9);
}
delay(500);
// Score anzeigen (bis 99 auf Matrix, >99: letzte zwei Stellen + Hunderter als Punkte)
// ... (Zeichen-Routinen draw0() bis draw9() im Vollcode)
gameOver = true;
while(gameOver); // wartet auf Tastendruck (Interrupt startet neu)
}
}
Ziffern-Darstellung (3 Spalten pro Ziffer)
Funktionen draw0() bis draw9() setzen Spalten-Bitmuster für 7-Segment-ähnliche Darstellung auf der Matrix.
Schaltplan
Der Schaltplan zeigt die Verbindungen: MAX7219 an SPI-Pins (12,11,10), Taster an Pin 2/3 mit Pullup, Summer an Pin 9.
Erweiterungsideen
- Mehrere Matrizen kaskadieren (größeres Spielfeld).
- Highscore im EEPROM speichern.
- Schwierigkeitsgrade, verschiedene Asteroiden-Größen.
- OLED-Display für Menüs/Highscores.
Herstellungsprozess
- Schach: Von antiken Ursprüngen zur modernen Fertigung – Ein Expertenüberblick
- Flipper: Geschichte, Design und Fertigung eines klassischen Arcade-Spiels
- Die Evolution und Handwerkskunst des American Football: Von antiken Spielen zu modernen NFL-Standards
- Klassisches Pong-Spiel auf Arduino UNO mit OLED-Display bauen – Schritt-für-Schritt-Tutorial
- 37-LED-Roulette-Spiel mit Arduino Nano bauen – Europäisches Layout
- 24×16 LED Pong-Konsole mit Arduino Nano & MAX7219 bauen
- Tetris-Spiel mit Arduino Nano auf selbstgebauter 16×8 LED-Matrix
- Interaktives Joystick-Spiel mit Arduino & LED-Feedback
- Interaktive LED-Matrix Tür-Anzeige mit PIR-Bewegungssensor – Arduino Feiertagsgruß
- Soundgesteuerte 8-LED-Lichtanzeige mit Arduino