สารบัญ:

NeoPixels Matrix:เกมงู: 4 ขั้นตอน
NeoPixels Matrix:เกมงู: 4 ขั้นตอน

วีดีโอ: NeoPixels Matrix:เกมงู: 4 ขั้นตอน

วีดีโอ: NeoPixels Matrix:เกมงู: 4 ขั้นตอน
วีดีโอ: Up for a game of Pong? #diy #wordclock #arduino #neopixel #shorts 2024, กรกฎาคม
Anonim
NeoPixels Matrix:เกมงู
NeoPixels Matrix:เกมงู

คุณยังจำเกมงูที่เราเล่นบนกล่องเกมหรือมือถือของเราในวัยเด็กได้หรือไม่? วันนี้เราจะมาเรียนรู้วิธีการสร้างเกมงูด้วย 8*8 NeoPixels Matrix เราเลือก Arduino uno เป็นศูนย์ควบคุมและโมดูล Joystick breakout เพื่อควบคุมงู

ขั้นตอนที่ 1: รายการส่วนประกอบ:

ฮาร์ดแวร์:

1 X Freaduino UNO Rev2.2 MB_EFUNO

1 X ยืดหยุ่น 64 RGB LED 8*8 NeoPixels Matrix

1 X โมดูลฝ่าวงล้อมจอยสติ๊ก BKOUT_MD01

3 X ไกด์ไลน์

ซอฟต์แวร์:

Arduino IDE

ขั้นตอนที่ 2: การเชื่อมต่อฮาร์ดแวร์

เชื่อมต่อ NeoPixels เพื่อตรึง D2

"X" บนโมดูลจอยสติ๊กฝ่าวงล้อมเชื่อมต่อพิน A0 บนบอร์ด Arduino UNO, "Y" เชื่อมต่อพิน A1, "K" เชื่อมต่อพิน A2

ขั้นตอนที่ 3: การเขียนโปรแกรม

P#รวม

#define PIN 2 //Output Pin #define MAX_LED 64 //จำนวนลูกปัด uint32_t c; int a = 0, จำนวน; ถ่าน huan ที่ไม่ได้ลงนาม = 0, ci = 0; อักขระที่ไม่ได้ลงชื่อ u = 40; //ขนาดตัวอักษรของกลุ่มคำ unsigned char x = 0; สีถ่านที่ไม่ได้ลงนาม[3]; ถ่านที่ไม่ได้ลงนาม = {2, 3, 4, 5, 9, 14, 17, 20, 22, 26, 27, 29, 34, 35, 36, 37, 41, 46, 49, 54, 58, 59, 60, 61}; // 24 ไฟถ่านไม่มีเครื่องหมาย[8][8] = { {0, 1, 2, 3, 4, 5, 6, 7}, {15, 14, 13, 12, 11, 10, 9, 8}, {16, 17, 18, 19, 20, 21, 22, 23}, {31, 30, 29, 28, 27, 26, 25, 24}, {32, 33, 34, 35, 36, 37, 38, 39}, {47, 46, 45, 44, 43, 42, 41, 40}, {48, 49, 50, 51, 52, 53, 54, 55}, {63, 62, 61, 60, 59, 58, 57, 56}, }; อักขระถ่านที่ไม่ได้ลงนาม[8] = //ตั้งค่าคำที่จะส่ง { {0, 1, 1, 1, 1, 1, 0, 0}, {0, 1, 0, 0, 0, 1, 0, 0}, // 0 {0, 1, 1, 1, 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, 0, 0, 0}, // 1 {0, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 1, 1, 1, 0, 0}, {0, 1, 0, 1, 0, 1, 0, 0}, // 2 {0, 1, 1, 1, 0, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 1, 0, 1, 0, 0}, {0, 1, 0, 1, 0, 1, 0, 0}, // 3 {0, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 0}, // 4 {0, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 1, 1, 0, 1, 0, 0}, {0, 1, 0, 1, 0, 1, 0, 0}, // 5 {0, 1, 0, 1, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 1, 1, 1, 1, 0, 0}, {0, 1, 0, 1, 0, 1, 0, 0}, // 6 {0, 1, 0, 1, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0}, // 7 {0, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 1, 1, 1, 1, 0, 0}, {0, 1, 0, 1, 0, 1, 0, 0}, // 8 {0, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 1, 1, 0, 1, 0, 0}, {0, 1, 0, 1, 0, 1, 0, 0}, // 9 {0, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0 }, }; displaycore ถ่านที่ไม่ได้ลงนาม [8][8]; ความเร็ว intS = 400; // ความเร็วเริ่มต้นของคะแนน int งู; // คะแนนเกม int xValue; // JoyStick-X int yValue; // JoyStick-Y int zValue; // JoyStick-Z int FX ปีงบประมาณ; // พิกัดอาหาร int SX, SY; // พิกัดหัวงู int KEY, K; int เปิดใช้งาน; // เปิดใช้งานเพื่อเริ่มเกมใหม่ char sx[64]; //พิกัดของงูตัว char sy[64]; แถบ Adafruit_NeoPixel = Adafruit_NeoPixel(MAX_LED, PIN, NEO_RGB + NEO_KHZ800); เป็นโมฆะ RANDOM () { A: FX = สุ่ม (0, 7); ปีงบประมาณ = สุ่ม(0, 7); สำหรับ (int i = 0; i < 3 + คะแนน; i++) // ป้องกันการแสดงอาหารบนตัวงู { if (FX == sx && FY == sy) ไปที่ A; } } void myDelay(unsigned int Time) { // ในช่วงเวลาดีเลย์ของการเคลื่อนไหวของงู เราต้องทําบางอย่าง เช่น อาหารกากเพชร และอ่านทิศทางของ Joystick for (int t = 1; t 950 && KEY != 5) { เค = 8; } else if (yValue <50 && KEY != 8) { K = 5; } else if (xValue 950 && KEY != 4) { K = 6; } } // ที่นี่คุณสามารถเปรียบเทียบได้ว่าทิศทางของปุ่มกดอยู่ตรงข้ามกับทิศทางการเคลื่อนที่ของงูหรือไม่ ถ้าอยู่ตรงข้ามก็เลิกใช้ปุ่มกด /****************************************************** ******************************************************** ******************************************************** ******************************************************** ********/ โมฆะ gameover () { // เมื่อโปรแกรม Gameover หยุดทำงาน ให้กดปุ่มกลางเพื่อเริ่มเกมใหม่ ค่าถ่านที่ไม่ได้ลงนาม y; สี[0] = สุ่ม(3, 18); // กำหนดสี พารามิเตอร์คือ R G B ช่วง 0-255 สี [1] = สุ่ม(3, 18); สี [2] = สุ่ม(3, 18); c = แถบสี(สี[1], สี[0], สี[2]); ค่า = คะแนน / 10; ค่า = ค่า * 4; y = 0; for (number = value; number <value + 4; number++) { for (unsigned char vertical = 0; vertical <8; vertical++) { displayscore[y][vertical] = character[number][vertical]; } y++; } ค่า = คะแนน % 10; ค่า = ค่า * 4; for (number = value; number <value + 4; number++) { for (unsigned char vertical = 0; vertical <8; vertical++) { displayscore[y][vertical] = character[number][vertical]; } y++; } สำหรับ (ถ่านที่ไม่ได้ลงนามในแนวนอน = 0; แนวนอน <8; แนวนอน ++) { สำหรับ (ถ่านที่ไม่ได้ลงชื่อในแนวตั้ง = 0; แนวตั้ง <8; แนวตั้ง ++) { if (แสดงคะแนน [แนวนอน][แนวตั้ง] == 1) // ตัดสินว่าแสง เปิดอยู่ { strip.setPixelColor(แสง[แนวนอน][แนวตั้ง], c); } อื่น ๆ strip.setPixelColor(แสง[แนวนอน][แนวตั้ง], 0); } } strip.show();// ส่งข้อมูลล่าช้า (5000); เค = 0; // รีเซ็ตทิศทางจอยสติ๊ก sx[0] = 2; sx[1] = 1; sx[2] = 0; sy[0] = 1; sy[1] = 1; sy[2] = 1; // รีเซ็ตคะแนนพิกัดงู = 0; // รีเซ็ตความเร็วคะแนนเกม S = 400; // ความเร็วเริ่มต้นของงู } การตั้งค่าเป็นโมฆะ () { Serial.begin (9600); // เริ่มต้นไลบรารี strip.begin(); // ส่งข้อมูล กำหนดสีของแต่ละจุดเป็น 0 ดังนั้นทุกจุดจะไม่สว่างที่จุดเริ่มต้น แถบ.show(); เค = 0; // รีเซ็ตทิศทางของจอยสติ๊ก sx[0] = 2; sx[1] = 1; sx[2] = 0; sy[0] = 1; sy[1] = 1; sy[2] = 1; // รีเซ็ตคะแนนพิกัดงู = 0; // รีเซ็ตคะแนนเกม Color[0] = สุ่ม(3, 18); // กำหนดสี พารามิเตอร์คือ R G B ช่วง 0-255 สี [1] = สุ่ม(3, 18); สี [2] = สุ่ม(3, 18); c = แถบสี(สี[1], สี[0], สี[2]); // เขียว แดง น้ำเงิน // กำหนดสีสำหรับ (ตัวเลข = 0; จำนวน <24; จำนวน++) { strip.setPixelColor (ไป [หมายเลข], c); } strip.show();// ส่งข้อมูลล่าช้า (2000); สุ่ม(); // ผลิตอาหาร } โมฆะมือถือ () { คีย์ = K; //ทุกการเคลื่อนไหวของงูทำให้ทิศทางเปลี่ยนไปทันที ถ้า (คีย์ == 8) // งูขึ้นข้างบน { สำหรับ (int i = 2 + คะแนน; i> 0; i--) { sx = sx[i - 1]; sy = sy[i - 1]; } sy[0] = sy[0] - 1; if (sy[0] <0) // ข้ามพรมแดนและไปต่ออีกด้านหนึ่ง sy[0] = 7; } else if (KEY == 5) // Snake down down { for (int i = 2 + score; i> 0; i--) { sx = sx[i - 1]; sy = sy[i - 1]; } sy[0] = sy[0] + 1; if (sy[0] > 7) // ข้ามพรมแดนและไปต่ออีกด้านหนึ่ง sy[0] = 0; } อื่น ๆ ถ้า (คีย์ == 4) // งูเหลือการเคลื่อนไหว { สำหรับ (int i = 2 + คะแนน; i > 0; i--) { sx = sx[i - 1]; sy = sy[i - 1]; } sx[0] = sx[0] - 1; if (sx[0] <0) // ข้ามเส้นขอบและดำเนินการต่อในอีกด้านหนึ่ง sx[0] = 7; } else if (KEY == 6) // การเคลื่อนไหวที่ถูกต้องของ Snake { สำหรับ (int i = 2 + คะแนน; i> 0; i--) { sx = sx[i - 1]; sy = sy[i - 1]; } sx[0] = sx[0] + 1; if (sx[0] > 7) // ข้ามเส้นขอบและไปต่อในอีกด้านหนึ่ง sx[0] = 0; } // ย้ายตัวงูด้วยปุ่ม } void displays() { for (number = 0; number <64; number++) //ล้างหน้าจอ { strip.setPixelColor(number, 0); } strip.show(); สี[0] = 40; // กำหนดสี พารามิเตอร์คือ R G B ช่วง 0-255 สี [1] = 0; สี [2] = 0; c = แถบสี(สี[1], สี[0], สี[2]); //เขียว แดง น้ำเงิน // กำหนดสี x = light[FX][FY]; //แสดงแถบอาหาร.setPixelColor(x, c); สี[0] = สุ่ม(3, 18); // กำหนดสี พารามิเตอร์คือ R G B ช่วง 0-255 สี [1] = สุ่ม(3, 18); สี [2] = สุ่ม(3, 18); c = แถบสี(สี[1], สี[0], สี[2]); // เขียว แดง น้ำเงิน // กำหนดสีให้กับ (int i = 2 + score; i> 0; i--) // แสดงตัวงู { x = light[sx[sy; strip.setPixelColor(x, c); } สี[0] = 0; // กำหนดสี พารามิเตอร์คือ R G B ช่วง 0-255 สี [1] = 40; สี [2] = 0; c = แถบสี(สี[1], สี[0], สี[2]); //เขียว แดง น้ำเงิน // กำหนดสี x = light[sx[0][sy[0]; //แสดงแถบหัวงู.setPixelColor(x, c); strip.show();//ส่งข้อมูล } void loop() { mobile(); myDelay (ความเร็ว S); // ภายใน () เป็นเวลาล่าช้า แสดง (); SX = sx[0]; SY = sy[0]; // รับพิกัดของหัวงูสำหรับ (int i = 1; i <= 2 + score; i++) { if (SX == sx && SY == sy) gameover(); } // ตัดสินว่าหัวงูสัมผัสตัวหรือไม่ หากแตะแล้วส่งต่อไปที่ GameOver ถ้า (SY == ปีงบประมาณ && SX == FX) { สุ่ม (); คะแนน ++; สี[0] = 40; // กำหนดสี พารามิเตอร์คือ R G B ช่วง 0-255 สี [1] = 0; สี [2] = 0; c = แถบสี(สี[1], สี[0], สี[2]); // เขียว แดง น้ำเงิน // กำหนดสี x = light[FX][FY]; //แสดงแถบอาหาร.setPixelColor(x, c); strip.show ();// ส่งข้อมูลถ้า (! (คะแนน % 5)) { // เร่งความเร็วงูตามคะแนน รับประทานอาหารทุกๆ 5 มื้อ เร่ง 100 มิลลิวินาที ความเร็วS = ความเร็วS - 50; if (speedS <150) // ขีด จำกัด ล่างสุดคือ 200ms ถ้าความเร็วต่ำกว่า 200ms ความเร็วจะอยู่ที่ 200ms ความเร็วS = 150; } } // ตัดสินว่ากินอาหารหรือไม่ ถ้างูกินอาหารก็บวกคะแนนและสร้างอาหารใหม่แบบสุ่ม }

ผลการทดลอง

ขั้นตอนที่ 4: ผลการทดสอบ

การอ่านแบบสัมพัทธ์:

FreaksBot Bluetooth Car

จุดไฟลูกปัดแรกบน 8*8 NeoPixels Matrix ด้วย Arduino

การทดลอง Micro:bit 05: RGB LED -- Elecfreaks Mirco: bit Starter Kit Course

Friday Product Post: LED Music Frequency Spectrum Display ชุดบัดกรี

ใช้ ElecFreaks Micro:bit Tinker Kit เพื่อสร้างแสงอัจฉริยะ

แนะนำ: