Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Construye el Juego Snake en Matriz LED 16x16 con Arduino UNO

Componentes y suministros

Arduino UNO × 1
Matriz de píxeles RGB NeoPixel NeoMatrix × 1
Cables jumper (genéricos) × 1
Joystick analógico (genérico) × 1
Protoboard (genérica) × 1

Sobre este proyecto

¡Hola! Estoy aprendiendo las posibilidades de Arduino. Y decidí copiar el clásico juego Snake de mi viejo Nokia. ¡Aquí está!

Usé una matriz LED 16x16, joystick y Arduino UNO. No fue fácil porque cada LED está conectado consecutivamente. Así que la lógica de movimiento es un poco complicada.

Aquí puedes controlar el personaje snake. Come comida sabrosa, crece y muere. El código del programa está listo para ampliar.

¡Diviértete y disfruta! Si te gusta, no dudes en suscribirte a mi YouTube e Instagram :) Están en ruso, pero haré subtítulos muy pronto.

Construye el Juego Snake en Matriz LED 16x16 con Arduino UNO
Construye el Juego Snake en Matriz LED 16x16 con Arduino UNO
Construye el Juego Snake en Matriz LED 16x16 con Arduino UNO

Código

Código (C/C++)


#include  // configuración matriz
#define NUM_LEDS 256
#define DATA_PIN 3
#define BRIGHTNESS 8
// configuración joystick
#define pinX A2 // eje X joystick
#define pinY A1 // eje Y joystick
#define swPin 2 // botón joystick

int snake[256]; // array de elementos de la serpiente
int snakeSize = 2; // tamaño real de la serpiente
int snakeSpeed = 500;
int row; // número de fila
int col; // número de columna
int lastDirection = 135; // dirección inicial
int i, newDirection, OlddX = 1, OlddY, f;
int red, green, blue, fred, fgreen, fblue; // colores
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) { // movimiento en dirección X
    if (row & 1) {
      if(col == 0 && dX == 1) { newDirection = last - 15; }
      else if(col == 15 && dX == -1) { newDirection = last + 15; }
      else newDirection = last + dX; // par
    } else {
      if(col == 0 && dX == 1) { newDirection = last + 15; }
      else if(col == 15 && dX == -1) { newDirection = last - 15; }
      else newDirection = last - dX; // impar
    }
  }
  if(dY < 0) { // movimiento en Y ABAJO
    if(row == 15 && dY == -1) { newDirection = col; }
    else if (row & 1) { newDirection = last + (col * 2) + 1; } // par
    else { newDirection = last + (16 - col - 1) + (16 - col); } // impar
  }
  if(dY > 0) { // movimiento en Y ARRIBA
    if(row == 0 && dY == 1) { newDirection = 255 - col; }
    else if (row & 1) { newDirection = last - (last - 16 * row) - (16 - col); } // par
    else { newDirection = last - (col * 2) - 1; } // impar
  }
  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); // número de fila
  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);
}

Esquemáticos

Construye el Juego Snake en Matriz LED 16x16 con Arduino UNO

Proceso de manufactura

  1. Mando USB para juegos DIY con Arduino – Construye tu propio gamepad de alto rendimiento
  2. Construye una consola Pong 24×16 LED con Arduino Nano y MAX7219
  3. Construye un juego Tetris con Arduino Nano en matriz LED 16x8 DIY
  4. Controla un LED por Bluetooth con Arduino – Guía DIY paso a paso
  5. Pantalla LED Matricial Interactiva en Puerta con Sensor PIR - Saludo Navideño Arduino
  6. Construye un Robot Cuadrúpedo Inteligente con Arduino: Guía Paso a Paso
  7. Pixel Chaser: Juego LED Interactivo de Un Toque con Arduino Nano
  8. Reloj flip Arduino con matriz LED 8×8: proyecto DIY de reloj en tiempo real
  9. Mezclador de Colores RGB con Arduino – Proyecto DIY para Principiantes
  10. Control de Matriz LED 8×8 con Arduino Uno: Guía Paso a Paso
  11. Juego Pong 1D con Arduino Nano y tira LED WS2812: Tutorial paso a paso