Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Игра «Змейка» на матрице 16×16 LED с Arduino UNO

Компоненты и материалы

Arduino UNO × 1
RGB LED Pixel Matrix, NeoPixel NeoMatrix 16×16 × 1
Провода-перемычки × 1
Аналоговый джойстик × 1
Breadboard (макетная плата) × 1

О проекте

Изучаю возможности Arduino и решил воссоздать классическую аркадную «Змейку» с моего старого Nokia. Вот что получилось.

Использовал матрицу 16×16 LED, джойстик и Arduino UNO. Сложность в том, что каждый светодиод подключен последовательно, поэтому логика перемещения нестандартная.

Управляйте змейкой: ешьте еду, растите, умирайте. Код готов к доработке.

Веселитесь! Если понравилось — подпишитесь на мой YouTube и Instagram (пока на русском, скоро добавлю субтитры).

Игра «Змейка» на матрице 16×16 LED с Arduino UNO
Игра «Змейка» на матрице 16×16 LED с Arduino UNO
Игра «Змейка» на матрице 16×16 LED с Arduino UNO

Код

Код (C/C++)

#include  //matrix settings #define NUM_LEDS 256 #define DATA_PIN 3 #define BRIGHTNESS 8 //joystick settings #define pinX A2 // ось X джойстика #define pinY A1 // ось Y джойстика #define swPin 2 // кнопка джойстика int snake[256]; // array of snake elements int snakeSize = 2; // real snake size int snakeSpeed = 500; int row; // row number int col; // column number int lastDirection = 135; // start direction int i, newDirection, OlddX = 1, OlddY, f; int red, green, blue, fred, fgreen, fblue; //colors 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 ){ // moving in X direction 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){ // moving in Y DOWN direction 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){ // moving in Y UP direction 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); // row number 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); }

Схемы

Игра «Змейка» на матрице 16×16 LED с Arduino UNO

Производственный процесс

  1. DIY USB-геймпад на Arduino: собственный высокопроизводительный контроллер
  2. Сборка консоли Pong 24×16 на Arduino Nano и MAX7219
  3. Tetris на Arduino Nano: самостоятельная сборка 16×8 LED-матрицы на 74HC595
  4. Управление светодиодом по Bluetooth с Arduino: простой DIY-гид
  5. Интерактивный LED-дисплей в двери с PIR-датчиком — новогоднее приветствие на Arduino
  6. Пошаговое руководство: сборка умного четырёхногого робота на Arduino
  7. Pixel Chaser: игра на один тап с NeoPixel Ring и Arduino Nano
  8. Arduino Flip Clock на матрице 8×8 LED — DIY проект реального времени
  9. Arduino RGB-микшер цветов: Простой проект для начинающих
  10. Мастерство 8×8 LED-матрицы с Arduino Uno: Пошаговое руководство