Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Snake Game op 16x16 LED-matrix met Arduino UNO

Onderdelen en benodigdheden

OnderdeelAantalOpmerking
Arduino UNO1
RGB LED Pixel Matrix (NeoPixel NeoMatrix 16x16)1Bijv. via AliExpress
Jumper wires1
Analoge joystick1
Breadboard1

Over dit project

Ik leer Arduino en wilde de klassieke Snake-game van mijn oude Nokia nabouwen. Gebruikte een 16x16 LED-matrix, joystick en Arduino UNO. De logica is wat lastig omdat elke LED achtereenvolgens aangesloten is.

Je stuurt de slang, eet voedsel, groeit en sterft. Code is uitbreidbaar.

Veel plezier! Abonneer op mijn YouTube en Instagram (Nederlands ondertitels komen later).

Snake Game op 16x16 LED-matrix met Arduino UNO
Snake Game op 16x16 LED-matrix met Arduino UNO
Snake Game op 16x16 LED-matrix met Arduino UNO

Code

De complete C/C++-code voor de Arduino UNO:

#include 
// Matrix instellingen
#define NUM_LEDS 256
#define DATA_PIN 3
#define BRIGHTNESS 8
// Joystick instellingen
#define pinX A2
#define pinY A1
#define swPin 2

int snake[256];
int snakeSize = 2;
int snakeSpeed = 500;
int row, col;
int lastDirection = 135;
int i, newDirection, OlddX = 1, OlddY, f;
int red, green, blue, fred, fgreen, fblue;
CRGB leds[NUM_LEDS];

void setup() {
  red = random(0, 255); green = random(0, 255); blue = random(0, 255);
  fred = random(127, 255); fgreen = random(127, 255); fblue = random(127, 255);
  Serial.begin(9600);
  pinMode(pinX, INPUT); pinMode(pinY, INPUT); pinMode(swPin, INPUT);
  digitalWrite(swPin, HIGH);
  FastLED.addLeds(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);
  for (i = 0; i <= 255; i++) snake[i] = 0;
  for (i = 0; i <= snakeSize; i++) snake[i] = lastDirection + i;
  f = random(0, 255);
  FastLED.show();
}

int Snakedirection(int last, int dX, int dY) {
  dX = map(dX, 0, 1000, -1, 1);
  dY = map(dY, 0, 1000, -1, 1);
  if (dX == 0 && dY == 0 && OlddX != dX) dX = OlddX;
  if (dY == 0 && dX == 0 && OlddY != dY) dY = OlddY;
  int newDirection = last;
  if (dX != 0) {
    if (row & 1) {
      if (col == 0 && dX == 1) newDirection = last - 15;
      else if (col == 15 && dX == -1) newDirection = last + 15;
      else newDirection = last + dX;
    } else {
      if (col == 0 && dX == 1) newDirection = last + 15;
      else if (col == 15 && dX == -1) newDirection = last - 15;
      else newDirection = last - dX;
    }
  }
  if (dY < 0) {
    if (row == 15 && dY == -1) newDirection = col;
    else if (row & 1) newDirection = last + (col * 2) + 1;
    else newDirection = last + (16 - col - 1) + (16 - col);
  }
  if (dY > 0) {
    if (row == 0 && dY == 1) newDirection = 255 - col;
    else if (row & 1) newDirection = last - (last - 16 * row) - (16 - col);
    else newDirection = last - (col * 2) - 1;
  }
  OlddX = dX; OlddY = dY;
  return newDirection;
}

int snakeMove(int snakeDirection) {
  for (i = 0; i <= 255; i++) if (snake[i] == snakeDirection) death();
  FastLED.clear();
  for (i = snakeSize; i >= 1; i--) snake[i] = snake[i - 1];
  snake[0] = snakeDirection;
  for (i = 0; i <= 255; i++) if (snake[i]) leds[snake[i]].setRGB(red, green, blue);
  FastLED.show();
  row = (int)(snakeDirection / 16);
  if (row & 1) col = (row + 1) * 16 - snakeDirection - 1;
  else col = snakeDirection - row * 16;
  return snakeDirection;
}

void food(int eaten) {
  if (eaten == f) {
    snakeSize++;
    f = random(0, 255);
    red = fred; green = fgreen; blue = fblue;
    fred = random(0, 255); fgreen = random(0, 255); fblue = random(0, 255);
    snakeSpeed = snakeSpeed / 1.1;
  } else {
    leds[f].setRGB(fred, fgreen, fblue);
    FastLED.show();
  }
}

void death() {
  snakeSize = 2; snakeSpeed = 500; red = 255; green = 0; blue = 0;
}

void color(boolean sw) {
  if (!sw) { red = random(0, 255); green = random(0, 255); blue = random(0, 255); }
}

void loop() {
  color(digitalRead(swPin));
  newDirection = Snakedirection(lastDirection, analogRead(pinX), analogRead(pinY));
  lastDirection = snakeMove(newDirection);
  food(newDirection);
  delay(snakeSpeed);
}

Schema's

Snake Game op 16x16 LED-matrix met Arduino UNO

Productieproces

  1. DIY Arduino USB Gaming Controller – Bouw Je Eigen High-Performance Gamepad
  2. Bouw een 24×16 LED Pong-console met Arduino Nano & MAX7219
  3. Bouw een Tetris-spel met Arduino Nano op een Zelfgemaakte 16×8 LED-matrix
  4. Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
  5. Interactieve LED-matrix deurdisplay met PIR-bewegingsensor – Arduino vakantiegroet
  6. Bouw een Slimme Arduino Vierpotige Robot: Stap-voor-Stap Handleiding
  7. Pixel Chaser: Interactieve één-tik LED-spel met Arduino Nano
  8. Arduino Flip Clock met 8×8 LED Matrix – DIY Real-Time Clock Project
  9. Arduino RGB LED Kleurmixer – Beginner-vriendelijk DIY-project
  10. Een 8×8 LED-matrix beheersen met Arduino Uno: Stap-voor-stap handleiding
  11. 1D Pong-spel met Arduino en WS2812 LED-strip – Stap-voor-stap DIY handleiding