Membuat Game Ular Arduino pada Matriks LED 8x8
Komponen dan Perlengkapan
 | | × | 1 | |
 | | × | 1 | |
| | Joystick Analog (Generik) |
| × | 1 | |
 | | Kabel Jumper Laki-laki/Perempuan |
| × | 1 | |
 | | × | 1 | |
Aplikasi dan Layanan Online
Tentang Proyek Ini
Saya membuat konsol game keren dari rangka Meccanoid dan Erector set dan saya menggunakan kode Sergey Royz (CEK DISINI) dan saya menambahkan hal tambahan ke dalamnya dan meningkatkan kecepatan sehingga bergerak dengan halus. Saya tidak akan menjelaskan cara membuat rangka tetapi saya merekomendasikan Anda untuk membuat rangka Anda sendiri. Tapi Anda memerlukan rangka. Bersenang-senanglah dengan ini lakukan apa yang Anda inginkan. Saya HARAP ANDA SUKA PROYEK INI! Beri komentar jika Anda ada pertanyaan dan saya berharap dapat menjawabnya secepatnya dan jika Anda ada rekomendasi untuk proyek saya selanjutnya, tolong beri komentar dan beri tahu saya. Juga fritzing saya tidak berfungsi, jadi saya akan memberi tahu saja:
Skematik:
Pasang shield ke Arduino Uno sehingga Anda memiliki lebih banyak stok GND dan 5v tanpa menggunakan breadboard.
Matriks:
- DIN ke pin digital 10 pada Arduino
- CS ke pin digital 9 pada Arduino
- CLK ke pin digital 8 pada Arduino
Joystick:
- Gnd ke pin Gnd pada Arduino
Kode
SnakeC/C++
Yang harus Anda lakukan hanyalah menyalin dan menempelkan kode
/** * Snake * Implementasi permainan ular klasik * di mana ular bergerak terus-menerus dan pemain * harus menghindari perpotongan dengan dirinya sendiri dan batas. * Ketika ular memakan makanan ia tumbuh dan sedikit mempercepat. * * 23 Jun 2016 * oleh Sergey Royz dan hunter Buzzell */ #include <LedControl.h> /* Pin Joystick */ #define VRX A0 #define VRY A1 #define SW 2 /* Pin Layar */ #define CLK 8 #define CS 9 #define DIN 10 #define SIZE 8 #define ADVANCE_DELAY 20 int snake[SIZE*SIZE][2]; int length; int food[2], v[2]; bool is_game_over = false; long current_time; long prev_advance; int blink_count; const short messageSpeed = 5; LedControl lc = LedControl(DIN, CLK, CS, 1); void init_game() { prev_advance = current_time = 0; blink_count = 3; int half = SIZE / 2; length = SIZE / 3; for (int i = 0; i < length; i++) { snake[i][0] = half - 1; snake[i][1] = half + i; } food[0] = half + 1; food[1] = half - 1; v[0] = 0; v[1] = -1; } void render() { for (int i = 0; i < length; i++) { lc.setLed(0, snake[i][0], snake[i][1], 1); } lc.setLed(0, food[0], food[1], 1); } void clearScreen() { for (int x = 0; x < SIZE; x++) { for (int y = 0; y < SIZE; y++) { lc.setLed(0, x, y, 0); } } } /** * menggerakkan ular ke depan * mengembalikan true jika permainan berakhir */ bool advance() { int head[2] = {snake[0][0] + v[0], snake[0][1] + v[1]}; if (head[0] < 0 || head[0] >= SIZE) { delay(1000); showGameOverMessage(); return true; } if (head[1] < 0 || head[1] >= SIZE) { delay(1000); showGameOverMessage(); return true; } for (int i = 0; i < length; i++) { if (snake[i][0] == head[0] && snake[i][1] == head[1]) { delay(1000); showGameOverMessage(); return true; } } bool grow = (head[0] == food[0] && head[1] == food[1]); if (grow) { length++; randomSeed(current_time); food[0] = random(SIZE); food[1] = random(SIZE); } for (int i = length - 1; i >= 0; i--) { snake[i + 1][0] = snake[i][0]; snake[i + 1][1] = snake[i][1]; } snake[0][0] += v[0]; snake[0][1] += v[1]; return false; } void setup() { pinMode(SW, INPUT_PULLUP); pinMode(VRX, INPUT); pinMode(VRY, INPUT); attachInterrupt(digitalPinToInterrupt(SW), restart, RISING); lc.shutdown(0, false); lc.setIntensity(0, 8); init_game(); render(); } void loop() { if (!is_game_over) { clearScreen(); render(); if (current_time - prev_advance > ADVANCE_DELAY) { is_game_over = advance(); prev_advance = current_time; } } else { while (blink_count > 0) { clearScreen(); delay(300); render(); delay(300); blink_count--; } } readControls(); current_time++; } void restart() { init_game(); is_game_over = false; } void readControls() { int dx = map(analogRead(VRX), 0, 906, 2, -2); int dy = map(analogRead(VRY), 0, 906, -2, 2); if (dx != 0) {dx = dx / abs(dx);} if (dy != 0) {dy = dy / abs(dy);} if (dy != 0 && v[0] != 0) { v[0] = 0; v[1] = dy; } if (dx != 0 && v[1] != 0) { v[0] = dx; v[1] = 0; } } const PROGMEM bool gameOverMessage[8][90] = { {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,0,0,0,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,1,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,1,1,0,1,0,1,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0} }; void showGameOverMessage() { for (int d = 0; d < sizeof(gameOverMessage[0]) - 7; d++) { for (int col = 0; col < 8; col++) { delay(messageSpeed); for (int row = 0; row < 8; row++) { // ini membaca byte dari PROGMEM dan menampilkannya di layar lc.setLed(0, row, col, pgm_read_byte(&(gameOverMessage[row][col + d]))); } } } }