Bemerkung

Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.

Warum beitreten?

  • Expertenunterstützung: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.

  • Lernen & Teilen: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.

  • Spezialrabatte: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.

  • Festliche Aktionen und Gewinnspiele: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [ hier ] und treten Sie heute bei!

SPIEL - Snake

Dieses Beispiel implementiert das klassische Snake-Spiel auf einer 8x12 LED-Matrix mit dem R4 Wifi Board. Spieler steuern die Richtung der Schlange mit einem Zwei-Achsen-Joystick.

Benötigte Komponenten

Für dieses Projekt benötigen wir die folgenden Komponenten.

Es ist definitiv praktisch, ein ganzes Kit zu kaufen, hier ist der Link:

Name

ARTIKEL IN DIESEM KIT

LINK

Elite Explorer Kit

300+

Elite Explorer Kit

Sie können sie auch einzeln über die untenstehenden Links kaufen.

KOMPONENTENBESCHREIBUNG

KAUF-LINK

Arduino Uno R4 WiFi

-

Jumperkabel

KAUFEN

Joystick-Modul

KAUFEN

Verdrahtung

../_images/13_snake_bb.png

Schaltplan

../_images/13_snake_schematic.png

Code

Bemerkung

  • Sie können die Datei 13_snake.ino direkt unter dem Pfad elite-explorer-kit-main\fun_project\13_snake öffnen.

  • Oder kopieren Sie diesen Code in die Arduino IDE.

13_snake.ino
  1/*
  2  This code implements a simple Snake game using an Arduino Uno R4 and a 
  3  Joystick Module. The Snake moves based on joystick input, and the 
  4  objective is to eat randomly generated food without colliding with 
  5  the snake's body. The game ends if the snake collides with itself.
  6
  7  Board: Arduino Uno R4 
  8  Component: Joystick Module
  9*/
 10
 11
 12#include "Arduino_LED_Matrix.h"
 13
 14ArduinoLEDMatrix matrix;
 15byte frame[8][12];
 16byte flatFrame[8 * 12];  // Flattened frame for matrix.loadPixels()
 17
 18// Snake variables
 19struct Point {
 20  byte x;
 21  byte y;
 22};
 23
 24Point snake[100];
 25int snakeLength = 3;
 26Point food;
 27int direction = 0;  // 0=up, 1=right, 2=down, 3=left
 28
 29void setup() {
 30  pinMode(A0, INPUT);  // joystick X-axis
 31  pinMode(A1, INPUT);  // joystick Y-axis
 32
 33  // Initialize LED matrix
 34  matrix.begin();
 35
 36  // Initialize snake at middle of screen
 37  snake[0] = { 6, 4 };
 38  snake[1] = { 6, 5 };
 39  snake[2] = { 6, 6 };
 40
 41  // Generate initial food
 42  generateFood();
 43}
 44
 45void loop() {
 46  // Read joystick input
 47  int x = analogRead(A0);
 48  int y = analogRead(A1);
 49
 50  // Determine new direction based on joystick
 51  if (x > 600 && direction != 3) direction = 1;
 52  else if (x < 400 && direction != 1) direction = 3;
 53  else if (y > 600 && direction != 0) direction = 2;
 54  else if (y < 400 && direction != 2) direction = 0;
 55
 56  // Move snake
 57  moveSnake();
 58
 59  // Check for collision with food
 60  if (snake[0].x == food.x && snake[0].y == food.y) {
 61    snake[snakeLength] = snake[snakeLength - 1];  // Initialize the new segment
 62    snakeLength++;
 63    generateFood();
 64  }
 65
 66  // Check for collision with self
 67  for (int i = 1; i < snakeLength; i++) {
 68    if (snake[0].x == snake[i].x && snake[0].y == snake[i].y) {
 69      // Reset game (or end game)
 70      snakeLength = 3;
 71      snake[0] = { 6, 4 };
 72      snake[1] = { 6, 5 };
 73      snake[2] = { 6, 6 };
 74      direction = 0;
 75      generateFood();
 76    }
 77  }
 78
 79  // Draw to LED matrix
 80  drawFrame();
 81
 82  // Delay to control speed
 83  delay(200);
 84}
 85
 86void moveSnake() {
 87  for (int i = snakeLength - 1; i > 0; i--) {
 88    snake[i] = snake[i - 1];
 89  }
 90
 91  // Move the head of the snake based on the direction
 92  switch (direction) {
 93    case 0:
 94      snake[0].y = (snake[0].y - 1 + 8) % 8;  // Wrap around at the top and bottom edges
 95      break;
 96    case 1:
 97      snake[0].x = (snake[0].x + 1) % 12;  // Wrap around at the right and left edges
 98      break;
 99    case 2:
100      snake[0].y = (snake[0].y + 1) % 8;  // Wrap around at the bottom and top edges
101      break;
102    case 3:
103      snake[0].x = (snake[0].x - 1 + 12) % 12;  // Wrap around at the left and right edges
104      break;
105  }
106}
107
108void generateFood() {
109  Point possibleLocations[8 * 12];
110  int idx = 0;
111
112  // Generate all possible locations for the food
113  for (int y = 0; y < 8; y++) {
114    for (int x = 0; x < 12; x++) {
115      bool overlap = false;
116
117      // Check for overlap with the snake
118      for (int i = 0; i < snakeLength; i++) {
119        if (snake[i].x == x && snake[i].y == y) {
120          overlap = true;
121          break;
122        }
123      }
124
125      if (!overlap) {
126        possibleLocations[idx++] = { x, y };
127      }
128    }
129  }
130
131  // Randomly choose a location for the food from the possible locations
132  int choice = random(0, idx);
133  food = possibleLocations[choice];
134}
135
136void drawFrame() {
137  // Clear frame
138  for (int y = 0; y < 8; y++) {
139    for (int x = 0; x < 12; x++) {
140      frame[y][x] = 0;
141    }
142  }
143
144  // Draw snake
145  for (int i = 0; i < snakeLength; i++) {
146    frame[snake[i].y][snake[i].x] = 1;
147  }
148
149  // Draw food
150  frame[food.y][food.x] = 1;
151
152  // Flatten frame array and load into LED matrix
153  int idx = 0;
154  for (int y = 0; y < 8; y++) {
155    for (int x = 0; x < 12; x++) {
156      flatFrame[idx++] = frame[y][x];
157    }
158  }
159  matrix.loadPixels(flatFrame, 8 * 12);
160  matrix.renderFrame(0);
161}

Wie funktioniert des?

Hier ist eine detaillierte Erklärung des Codes:

  1. Variablendefinition und -initialisierung

    Importieren Sie die Bibliothek Arduino_LED_Matrix für LED-Matrix-Operationen. matrix ist eine Instanz der LED-Matrix. frame und flatFrame sind Arrays, die verwendet werden, um Pixelinformationen auf dem Bildschirm zu speichern und zu verarbeiten. Die Schlange wird als ein Array von Point-Strukturen dargestellt, wobei jeder Punkt eine x- und y-Koordinate hat. food repräsentiert die Position des Futters. direction ist die aktuelle Bewegungsrichtung der Schlange.

  2. setup()

    Initialisieren Sie die X- und Y-Achsen des Joysticks als Eingänge. Starten Sie die LED-Matrix. Initialisieren Sie die Startposition der Schlange in der Mitte des Bildschirms. Generieren Sie die anfängliche Position des Futters zufällig.

  3. loop()

    Bestimmen Sie die Richtung der Schlange anhand der Ablesungen vom Joystick. Bewegen Sie die Schlange. Überprüfen Sie, ob der Kopf der Schlange mit dem Futter kollidiert. Wenn ja, wächst die Schlange und neues Futter wird an einem neuen Ort generiert. Überprüfen Sie, ob die Schlange mit sich selbst kollidiert. Wenn ja, setzen Sie das Spiel zurück. Zeichnen Sie den aktuellen Spielstand (Positionen von Schlange und Futter) auf der LED-Matrix. Fügen Sie eine Verzögerung hinzu, um die Geschwindigkeit des Spiels zu steuern.

  4. moveSnake()

    Bewegen Sie jeden Teil der Schlange an die Position des vorherigen Teils, beginnend am Schwanz und bewegend zum Kopf. Bewegen Sie den Kopf der Schlange basierend auf ihrer Richtung.

  5. generateFood()

    Generieren Sie alle möglichen Futterpositionen. Überprüfen Sie, ob jede Position mit irgendeinem Teil der Schlange überlappt. Wenn es nicht überlappt, wird die Position als möglicher Futterort betrachtet. Wählen Sie zufällig einen möglichen Futterort aus.

  6. drawFrame()

    Löschen Sie das aktuelle Frame. Zeichnen Sie die Schlange und das Futter auf dem Frame. Flachen Sie das zweidimensionale Frame-Array in ein eindimensionales Array (flatFrame) ab und laden Sie es auf die LED-Matrix.