Buat Game Snake pada Matriks LED 16x16 dengan Arduino UNO
Komponen dan Perlengkapan
Arduino UNO – 1 unit
Matriks LED Piksel RGB, NeoPixel NeoMatrix – 1 unit
Kabel jumper (umum) – 1 set
Joystick analog (umum) – 1 unit
Papan roti (umum) – 1 unit
Tentang Proyek Ini
Halo! Saya sedang mempelajari peluang Arduino. Dan saya memutuskan untuk menyalin game snake arcade klasik dari nokia lama saya. Jadi, inilah caranya.
Saya menggunakan matriks LED 16x16, joystick dan Arduino UNO. Itu tidak mudah karena setiap LED terhubung secara berurutan. Jadi, logika pergerakan sedikit rumit.
Di sini Anda dapat mengontrol karakter snake. Makan makanan lezat, tumbuh, dan mati. Kode program siap untuk ditingkatkan.
Selamat bersenang-senang dan nikmati. Jika Anda menyukainya jangan ragu untuk langganan YouTube dan Instagram saya :) Mereka dalam bahasa Rusia, tetapi saya akan segera membuat subtitle.
Kode
Kode
KodeC/C++
#include <FastLED.h> //pengaturan matriks #define NUM_LEDS 256 #define DATA_PIN 3 #define BRIGHTNESS 8 //pengaturan joystick #define pinX A2 // sumbu X joystick #define pinY A1 // sumbu Y joystick #define swPin 2 // tombol joystick int snake[256]; // array elemen snake int snakeSize = 2; // ukuran snake sebenarnya int snakeSpeed = 500; int row; // nomor baris int col; // nomor kolom int lastDirection = 135; // arah awal int i, newDirection, OlddX = 1, OlddY, f; int red, green, blue, fred, fgreen, fblue; //warna 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<NEOPIXEL, DATA_PIN>(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 ){ // bergerak di arah 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; // genap } else { if( col == 0 && dX == 1){ newDirection = last +15; } else if( col == 15 && dX == -1 ){ newDirection = last -15; } else newDirection = last - dX; // ganjil } } if( dY < 0){ // bergerak di arah Y BAWAH if(row == 15 && dY == -1){newDirection = col;} else if ( row&1 ){ newDirection = last + (col*2)+1; // genap } else { newDirection = last + (16-col-1)+(16-col); // ganjil } } if( dY > 0){ // bergerak di arah Y ATAS if( row == 0 && dY == 1){ newDirection = 255 - col;} else if ( row&1 ){ newDirection = last - (last - 16*row) - (16 - col); // genap } else { newDirection = last - (col*2)-1; // ganjil } } 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); // nomor baris 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); }