สารบัญ:
- ขั้นตอนที่ 1: การเดินสายไฟ
- ขั้นตอนที่ 2: คำประกาศ
- ขั้นตอนที่ 3: ฟังก์ชันการตั้งค่า
- ขั้นตอนที่ 4: ฟังก์ชันลูป
- ขั้นตอนที่ 5: ฟังก์ชัน ClearLCD
- ขั้นตอนที่ 6: ฟังก์ชัน DrawBoard
- ขั้นตอนที่ 7: ฟังก์ชัน PlayBoard
- ขั้นตอนที่ 8: ฟังก์ชัน ClearBoard
- ขั้นตอนที่ 9: ฟังก์ชันชื่อเรื่อง
- ขั้นตอนที่ 10: ฟังก์ชัน ButtonsMenu
- ขั้นตอนที่ 11: ฟังก์ชั่น ButtonsGame
- ขั้นตอนที่ 12: ฟังก์ชัน GameOver
- ขั้นตอนที่ 13: ฟังก์ชันอินพุต
- ขั้นตอนที่ 14: ฟังก์ชัน BottomCheck
- ขั้นตอนที่ 15: ฟังก์ชัน WriteSerial
- ขั้นตอนที่ 16: เสร็จสิ้น
วีดีโอ: Arduino - กระเบื้องเปียโน: 16 ขั้นตอน (พร้อมรูปภาพ)
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:06
สวัสดีชาวอินเทอร์เน็ต นี่เป็นเรื่องเกี่ยวกับวิธีทำให้สิ่งที่แน่นอนว่าไม่ใช่เกมมือถือบน arduino uno r3
ในการเริ่มต้น คุณจะต้องใช้ชิ้นส่วนทั้งหมด ซึ่งมีดังนี้!1x Arduino Uno r3 ($42)
2x LCD Keypad Shield (ตัวละ 19 เหรียญ)
ปุ่ม 5x
ตัวต้านทาน 5x220Ω
สาย 28x
เอาล่ะ เมื่อคุณมีทุกส่วนแล้ว ก็ถึงเวลาเริ่มต้น!
ขั้นตอนที่ 1: การเดินสายไฟ
เริ่มต้นด้วยการเดินสาย Arduino และเพื่อนของคุณตามที่แสดงในแผนภาพ
ตรวจสอบให้แน่ใจว่าปุ่มต่างๆ เชื่อมโยงกันอย่างถูกต้อง โดยช่องเสียบ A0-4 อยู่ที่ด้านกราวด์ของรางปุ่ม มิฉะนั้น Arduino จะคิดว่าปุ่มต่างๆ ถูกกดค้างไว้อย่างต่อเนื่องแทนที่จะเพียงแค่กดเท่านั้น
ขั้นตอนที่ 2: คำประกาศ
โค้ดทั้งหมดที่นี่ควรมาก่อน void setup และ void loop เนื่องจากตัวแปรและอ็อบเจ็กต์เหล่านี้ถูกใช้ในหลายฟังก์ชันที่เราจะตั้งค่า
เริ่มต้นด้วยการใส่:
#รวม
ที่ด้านบนสุดของโค้ดของคุณ นี่เป็นการบอกให้ Arduino ใช้ไลบรารี "LiquidCrystal.h" และฟังก์ชันที่เป็นส่วนหนึ่งของมัน
ขั้นตอนต่อไปคือการกำหนดพินที่เราใช้สำหรับปุ่มของเราโดยวางโค้ดนี้ไว้ด้านล่าง #include ของเรา:
#define btnEnter A0#define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18
เรากำหนดเงื่อนไข btnEnter และ btn1 ถึง btn 4 เพื่อทำให้โค้ดอ่านง่ายขึ้น หรือเปลี่ยนแปลงหากจำเป็น หมายความว่าเมื่อเราพิมพ์ btn1 Arduino จะรู้ว่าจริง ๆ แล้วเราหมายถึงปุ่ม 15 แม้ว่าเราจะเรียกพอร์ต 15, 16, 17 และ 18 พวกเขาจะถูกระบุว่าเป็น A1 A2 A3 และ A4 บน Arduino นั่นเป็นเพราะ เป็นพอร์ตที่ใช้สำหรับอินพุตแบบอะนาล็อกโดยเฉพาะ แม้ว่าเราจะใช้สำหรับอินพุตดิจิทัลเท่านั้น
ต่อไปเราจะสร้างวัตถุที่จะควบคุมจอแสดงผลคริสตัลเหลว เมื่อต้องการทำสิ่งนี้ให้วางโค้ดนี้ไว้ใต้นิยามของเรา
LiquidCrystal lcdLeft(8, 9, 12, 10, 11, 13);LiquidCrystal lcdRight(2, 3, 4, 5, 6, 7);
สิ่งนี้บอก Arduino ว่าเมื่อเราเรียก lcdLeft หรือ lcdRight เรากำลังอ้างถึงวัตถุ LiquidCrystal ตัวเลขในวงเล็บที่แนบมาจะบอก Arduino ว่าพอร์ตใดที่วัตถุควรใช้เพื่อส่งข้อความไปยัง LCD เมื่อเราใช้งานฟังก์ชัน
ตอนนี้ เราต้องประกาศตัวแปรโดยวางโค้ดถัดไปด้านล่างการประกาศอ็อบเจกต์:
//ตัวแปรเหล่านี้เป็นตัวเลือกที่คุณสามารถเปลี่ยนได้ - ตัวเลขที่สูงขึ้น = ความเร็วของเกมที่เร็วขึ้น upint intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;
//ตั้งค่าตัวแปรสำหรับ gameboolean bolPlay; // ติดตามว่าผู้เล่น int intScore; //ติดตามคะแนนของผู้เล่น int intDiff; // เป็นเพียงสิ่งที่น่ายกย่องสำหรับการบอกว่าเกมมีปัญหาอะไร // ตั้งค่าตัวแปรสำหรับอินพุต int intEnter; //ติดตามว่าผู้ใช้กดปุ่ม Enter int intInput; //ติดตามว่าปุ่มใดที่ผู้ใช้กดบูลีน bolTilePressed; // ตรวจสอบให้แน่ใจว่าผู้เล่นไม่ได้กดปุ่ม 5x โดยไม่ได้ตั้งใจและสูญเสีย // ตั้งค่าตัวแปรสำหรับ turn int intTick; //นับค่าเป็น millies (ต่อลูป) จนถึง intDelay int intDelay; //เวลาที่โปรแกรมรอจนถึงเทิร์นถัดไปในหน่วยมิลลิวินาที intGameSpeed; //abit ของตัวเลือกการดีบัก boolean bolSerialBoard; //เมื่อ true จะพิมพ์บอร์ดในมอนิเตอร์แบบอนุกรม
เราประกาศตัวแปรโดยระบุประเภทข้อมูลแล้วตามด้วยชื่อตัวแปร เช่น int thisIsAnInteger
ตัวแปรบูลีน เช่น bolSerialBoard และ bolPlay สามารถมีค่าใดค่าหนึ่งจากสองค่าเท่านั้น จริงหรือเท็จ
ตัวแปรจำนวนเต็ม (int) เช่น intScore และ intInput สามารถใช้ตัวเลขจำนวนเต็มเป็นค่าได้ เช่น 1, 5 หรือ 100
ข้อมูลประเภทอื่นๆ ที่โดดเด่นอื่นๆ ที่เราไม่ได้ใช้ในที่นี้คือสตริง ซึ่งเป็นกลุ่มข้อความ และทศนิยม ซึ่งเป็นตัวเลขทศนิยม
ตัวแปรแต่ละตัวในที่นี้ใช้ในที่ต่างๆ กันโดยโปรแกรม นี่คือบทสรุปของสิ่งที่แต่ละตัวแปรทำ
bolPlay บอกโปรแกรมว่าควรแสดงเมนูหรือว่าเกมจริงควรทำงานอยู่หรือไม่
intScore ติดตามคะแนนของผู้เล่นเมื่อพวกเขาชนไทล์
intDiff ใช้ในเมนูหลักเพื่อบอกโปรแกรมว่าต้องพิมพ์ข้อความอะไรบนจอ LCD
intEnter ใช้เพื่อบอกโปรแกรมว่ากดปุ่ม Enter (ซ้ายสุด) หรือไม่
intInput ใช้สำหรับบอกโปรแกรมว่าปุ่มใดอีก 4 ปุ่มที่ถูกกด
bolTilePressed ใช้เพื่อให้แน่ใจว่าโปรแกรมจะอ่านเมื่อกดปุ่มเท่านั้น ไม่ใช่เมื่อกดค้างไว้
intGameSpeed, intGameSpeedEasy, intGameSpeedMedium และ intGameSpeedHard ใช้เพื่อควบคุมความเร็วของเกมควรเพิ่มความเร็วตามความยากที่เลือกไว้
intTick และ intDelay ใช้เพื่อหยุดโปรแกรมไม่ให้ย้ายบอร์ดทุกครั้งที่วนซ้ำ
bolSerialBoard ใช้สำหรับทำให้โปรแกรมส่งบอร์ดไปยังมอนิเตอร์อนุกรมของ Arduino เป็นชุดตัวเลขสำหรับการทดสอบ
ในที่สุดก็ถึงเวลาประกาศบอร์ดของเราเป็นอาร์เรย์โดยใช้รหัสนี้:
// ตั้งค่าเกม arrayint arrGame[16][4] = { {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} };
อาร์เรย์คือเมทริกซ์ที่จุดใดก็ตามที่สามารถเรียกคณิตศาสตร์หรือเปลี่ยนแปลงได้
รหัสของคุณควรมีลักษณะดังนี้
// รวมไลบรารี่ #include
//ตัวแปรเหล่านี้เป็นตัวเลือกที่คุณสามารถเปลี่ยนได้ - ตัวเลขที่สูงขึ้น = เกมเร็วขึ้น เร็วขึ้น
int intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;
// กำหนดหมุด
#define btnEnter A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18
// สร้างวัตถุ LCD (n, ~, n, ~, ~, n)
LiquidCrystal lcdLeft(8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight (2, 3, 4, 5, 6, 7);
// ตั้งค่าเกมอาร์เรย์
int arrGame[16][4] = { {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} };
//ตั้งค่าตัวแปรสำหรับเกม
บูลีน bolPlay; //ติดตามว่าผู้เล่น intScore; //ติดตามคะแนนของผู้เล่น int intDiff; //แค่เรื่องน่ารู้ที่บอกว่าเกมมันยากแค่ไหน
//ตั้งค่าตัวแปรสำหรับอินพุต
int intEnter; //ติดตามว่าผู้ใช้กดปุ่ม Enter int intInput; //ติดตามว่าปุ่มใดที่ผู้ใช้กดบูลีน bolTilePressed; // ตรวจสอบให้แน่ใจว่าผู้เล่นไม่บังเอิญกดปุ่ม 5x และแพ้
//ตั้งค่าตัวแปรสำหรับเทิร์น
int intTick; //นับค่าเป็น millies (ต่อลูป) จนถึง intDelay int intDelay; //เวลาที่โปรแกรมรอจนถึงเทิร์นถัดไปในหน่วยมิลลิวินาที intGameSpeed;
//abit ของตัวเลือกการดีบัก
บูลีน bolSerialBoard; //เมื่อ true จะพิมพ์บอร์ดในมอนิเตอร์แบบอนุกรม
ขั้นตอนที่ 3: ฟังก์ชันการตั้งค่า
ลูปการตั้งค่าเป็นฟังก์ชันที่ Arduino อ่านเพียงครั้งเดียวเมื่อเริ่มทำงานครั้งแรก
ในลูปการตั้งค่า เราแค่ตั้งค่าของตัวแปรบางตัวของเรา เพราะแทนที่จะตั้งค่าเมื่อประกาศ เรากำลังดำเนินการที่นี่
เริ่มต้นด้วยการวางรหัสนี้ลงในการตั้งค่าเป็นโมฆะของคุณ
bolPlay = เท็จ;intScore = 0; intTick = 0; intDelay = 1,000; intDiff = 1; intGameSpeed = intGameSpeedMedium;
แต่ละบรรทัดเป็นเพียงการตั้งค่าตัวแปรให้เป็นค่า
bolPlay ถูกตั้งค่าเป็นเท็จเพื่อให้เกมไม่เริ่มเล่น
intScore ถูกตั้งค่าเป็น 0 เพราะโดยปกติคะแนนของคุณเริ่มต้นที่ 0
intTick เริ่มต้นที่ 0 เพราะโปรแกรมไม่ได้นับอะไรเลย
intDelay ถูกตั้งค่าเป็น 1,000 เพราะนั่นคืออัตราที่ไทล์เริ่มต้น
intDiff เป็นเพียงนักพรตเพื่อให้โปรแกรมรู้ว่าจะเขียนอะไรสำหรับความยากของเกม
intGameSpeed ถูกตั้งค่าเป็น intGameSpeedMedium อะไรก็ตาม หมายความว่าตั้งค่าไว้ที่ระดับความยากปานกลาง
ถัดไป ให้ใส่รหัสนี้ใน Void Setup ด้านล่างโค้ดที่คุณเพิ่งใส่เข้าไป
lcdLeft.begin(16, 2);lcdRight.begin(16, 2);
Serial.begin(9600);
สิ่งนี้บอกให้ Arduino เริ่มสื่อสารกับคอมพิวเตอร์ผ่านจอภาพอนุกรม (มองเห็นได้โดยการคลิกปุ่มที่ด้านบนขวาของ Arduino IDE)
Void Setup ของคุณควรมีลักษณะดังนี้!
การตั้งค่าเป็นโมฆะ () { Serial.begin (9600); //เริ่มมอนิเตอร์แบบอนุกรม //ตั้งค่าตัวแปร bolPlay = false; intScore = 0; intTick = 0; intDelay = 1,000; intDiff = 1; intGameSpeed = intGameSpeedMedium; //เริ่ม lcdLeft.begin(16, 2); lcdRight.begin(16, 2); }
ขั้นตอนที่ 4: ฟังก์ชันลูป
ฟังก์ชันลูปทำงานโดย Arduino ทุก ๆ การวนซ้ำของ Arduino
คัดลอกโค้ดต่อไปนี้ลงใน Void Loop ของคุณ
วงเป็นโมฆะ () { อินพุต (); // ตรวจสอบการเล่นอินพุต if (bolPlay == true){ if (intTick >= intDelay){ //ตรวจสอบว่าเกมควรเล่นเทิร์นหรือรอ Serial.println("~~~~~~~ ต่อไป ~~");//พิมพ์เพื่อแสดงว่ากระดานย้ายไป //writeSerial(); //หากเปิดใช้งานตัวเลือกให้เขียนบอร์ดลงใน serial buttonsGame(); // ตรวจสอบอินพุตของผู้เล่น playBoard(); // ย้ายบอร์ดและเพิ่มไทล์ใหม่ clearLcd(); // ทำความสะอาด LCD ก่อนวาด drawBoard(); //วาดบอร์ดลงบนด้านล่างของจอ LCDCheck(); intTick = 0; // รีเซ็ต intTick } อื่น ๆ { buttonsGame (); // ตรวจสอบอินพุตของผู้เล่น clearLcd(); // ทำความสะอาด LCD ก่อนวาด drawBoard(); //วาดกระดานลงบนจอ LCD intTick = intTick + intGameSpeed; //เพิ่มเพื่อทำเครื่องหมาย } } อื่น ๆ { clearLcd(); // ทำความสะอาด LCD ก่อนวาดชื่อ (); //แสดงชื่อและปุ่มข้อมูลคะแนนเมนู(); // อ่านอินพุตของผู้เล่น clearBoard(); // ตรวจสอบให้แน่ใจว่าทั้งกระดาน = 0 } ล่าช้า (10); // ชะลอ Arduino โดยช่วงเวลาสั้น ๆ }
เมื่อ bolPlay เท่ากับ true หมายความว่าเกมกำลังเล่นอยู่ และโค้ดทั้งหมดสำหรับเวลาที่เล่นเกมควรรัน แต่เราต้องการให้บอร์ดเพิ่มไทล์ใหม่และเลื่อนลงเมื่อ intTick มากกว่า intDelay ของเรา ไม่เช่นนั้นเรายังต้องการให้ผู้ใช้กดปุ่มเพื่อตีไทล์และสำหรับ intTick เพื่อเพิ่มความเร็ว
โค้ดนี้ส่วนใหญ่ใช้ฟังก์ชันที่เรายังไม่ได้สร้าง และเราจะทำให้ใช้งานได้ในขั้นตอนต่อไป วัตถุประสงค์ของฟังก์ชันเหล่านี้มีดังนี้
อินพุตจะอ่านว่าปุ่มใดที่ผู้ใช้กด
ปุ่มเกมจะควบคุมการทำงานของปุ่มต่างๆ เมื่ออยู่ในเกม ไม่ใช่ในเมนู
playBoard เพิ่มไทล์ใหม่ให้กับบอร์ด แล้วย้ายทุกอย่างในบอร์ดลงหนึ่งช่อง
clearLCD ทำความสะอาด LCD เพื่อให้แน่ใจว่าไม่มีผีเหลืออยู่หลังกระเบื้อง
drawBoard ผ่าน arrGame และพิมพ์ลงบน LCD
clearBoard ล้าง arrGame ทั้งหมดเมื่อเกมไม่อยู่ในการเล่น
bottomCheck ตรวจสอบด้านล่างของ arrGame สำหรับเงื่อนไขความล้มเหลว
ชื่อจะแสดงชื่อเกมและข้อมูลคะแนนเมื่ออยู่ในเมนู
เมนูปุ่มควบคุมสิ่งที่ผู้ใช้ป้อนข้อมูลเมื่ออยู่ในเมนู
gameOver เป็นอีกฟังก์ชันหนึ่งแม้ว่าจะไม่ได้ถูกเรียกที่นี่เนื่องจากถูกเรียกในฟังก์ชันด้านล่างตรวจสอบและปุ่มแทนเกม
ขั้นตอนที่ 5: ฟังก์ชัน ClearLCD
เพื่อสร้างฟังก์ชัน เราเริ่มต้นด้วยการเพิ่มสิ่งนี้ลงในโค้ด
โมฆะ functionName() {
}
"functionName" สามารถเป็นอะไรก็ได้ ตราบใดที่ยังไม่มีอยู่
คัดลอกรหัสนี้ลงในโปรแกรมของคุณ:
เป็นโมฆะ clearLcd () { สำหรับ (int i = 0; i <= 15; i++) { สำหรับ (int ii = 0; ii <= 1; ii++) { lcdLeft.setCursor (i, ii); lcdLeft.write(" "); lcdRight.setเคอร์เซอร์(i, ii); lcdRight.write(" "); } } }
สิ่งนี้ทำงานผ่านอาร์เรย์ทั้งหมดโดยใช้ 2 ลูปนับเพื่อผ่านแต่ละจุดบน LCD และเขียนช่องว่าง
โดยไม่ต้องรีเซ็ตเป็นอะไรเลย LCD จะรักษาสิ่งที่เขียนไว้ก่อนหน้านี้
ขั้นตอนที่ 6: ฟังก์ชัน DrawBoard
คัดลอกโค้ดนี้ลงในโปรแกรมของคุณ
เป็นโมฆะ drawBoard () { สำหรับ (int i = 1; i <= 15; i ++) { //draw collums 1 และ 2 บน LCD ด้านซ้าย // ถ้าไทล์ = 0 ไม่เขียนอะไรเลย = 1 เขียน "#", = 2 เขียน "@" lcdLeft.setCursor(i, 1); // ตั้งค่าเป็นคอลัมน์แรก (ซ้ายสุด) if (arrGame[0] == 1) {lcdLeft.write("#");} if (arrGame[0] == 2) {lcdLeft.write("@");} lcdLeft.setCursor(i, 0); // ตั้งค่าเป็นคอลัมน์ที่สอง (ตรงกลางซ้าย) if (arrGame[1] == 1) {lcdLeft.write("#");} if (arrGame[1] == 2) {lcdLeft.write("@");} lcdRight.setCursor(i, 1); // ตั้งค่าเป็นคอลัมน์ที่สาม (ตรงกลางขวา) if (arrGame[2] == 1) {lcdRight.write("#");} if (arrGame[2] == 2) {lcdRight.write("@");} lcdRight.setCursor(i, 0); // ตั้งค่าเป็นคอลัมน์ที่สี่ (ขวาสุด) if (arrGame[3] == 1) {lcdRight.write("#");} if (arrGame[3] == 2) {lcdRight.เขียน("@");} } }
สิ่งนี้ใช้การวนซ้ำเพื่อผ่านแต่ละแถวของกระดาน จากนั้นตรวจสอบเพื่อดูว่าคอลัมน์ใดในแถวนั้นเท่ากับ 1 หรือ 2 โดยขึ้นอยู่กับว่าคอลัมน์นั้นจะพิมพ์บน LCD ไม่ว่าจะเป็นแฮชแท็กสำหรับไทล์ที่ยังไม่ได้ hit หรือ @ สำหรับไทล์การตี
ขั้นตอนที่ 7: ฟังก์ชัน PlayBoard
คัดลอกรหัสนี้ลงในโปรแกรมของคุณ
โมฆะ playBoard() { สำหรับ (int i = 0; i <= 3; i++){arrGame[0] = 0;} // เคลียร์แถวบนสุด arrGame[0][random(0, 4)] = 1; // กำหนดจุดสุ่มบนแถวบนสุดให้เป็นไทล์สำหรับ (int i = 15; i>= 1; i--){ //ทำงานจากด้านล่างของกระดานไปยังด้านบนสุดสำหรับ (int ii = 0; ii <= 3; ii ++){ // สำหรับแต่ละ collum arrGame[ii] = arrGame[i - 1][ii]; } } }
รหัสนี้เริ่มต้นด้วยการล้างแถวบนสุดทั้งหมดเป็น 0 หรือไม่มีไทล์ จากนั้นตั้งค่าไทล์สุ่มหนึ่งรายการเป็น 1 และยกเลิกการใช้ไทล์
จากนั้นจะผ่านลูปนับย้อนกลับจาก 15 เป็น 1 โดยตั้งค่าแถวให้เท่ากับแถวด้านบนที่เท่ากับเท่าใด ทำให้บอร์ดเลื่อนลงมาด้านล่างของจอ LCD
ขั้นตอนที่ 8: ฟังก์ชัน ClearBoard
คัดลอกรหัสนี้ลงในโปรแกรมของคุณ
โมฆะ clearBoard () {// รีเซ็ตค่าขีดและค่าหน่วงเวลา intTick = 0; intDelay = 1,000; // ผ่านกระดานและตั้งค่าทุกอย่างเป็น 0 สำหรับ (int i = 0; i <= 15; i++){ for (int ii = 0; ii <= 3; ii++){ arrGame[ii] = 0; } } }
รหัสนี้ทำงานเมื่อไม่ได้เล่นเกมเพื่อให้แน่ใจว่า arrGame ทั้งหมดถูกตั้งค่าเป็น 0 หรือไม่มีไทล์ โดยใช้การวนซ้ำที่นับเพื่อผ่านอาร์เรย์
รหัสยังรีเซ็ตค่าของ intDelay และ intTick
ขั้นตอนที่ 9: ฟังก์ชันชื่อเรื่อง
คัดลอกโค้ดต่อไปนี้ลงในโปรแกรมของคุณ
ชื่อเป็นโมฆะ () {// เขียนชื่อลงบน LCD และช่องว่างสำหรับคะแนน lcdRight.setCursor (0, 0); lcdRight.write("กระเบื้องเปียโน"); lcdRight.setCursor(0, 1); lcdRight.write("คะแนน:"); //แปลงคะแนนเป็นสตริงถ่าน strScore[3]; sprintf(strScore, "%d", intScore); //แสดงคะแนนบน LCD lcdRight.write(strScore); // เพิ่ม diffictuly lcdRight.setCursor(10, 1); if (intDiff == 0){ lcdRight.write ("ง่าย"); } if (intDiff == 1) { lcdRight.write ("ปานกลาง"); } if (intDiff == 2) { lcdRight.write ("ยาก"); } //กดคำสั่งเล็กน้อย lcdLeft.setCursor(0, 0); lcdLeft.write("กด Enter"); lcdLeft.setเคอร์เซอร์(0, 1); lcdLeft.write("เพื่อเริ่มต้น!"); }
รหัสนี้เขียนชื่อเกมและคะแนนลงบน LCD โดยบอกให้ LCD ทราบว่าจะเริ่มพิมพ์ที่ใดโดยใช้ LCD.setCursor แล้วจึงเขียนสตริงใน LCD.write
ตัวแปรใหม่จะถูกสร้างขึ้นที่นี่เช่นกัน strScore ใช้เพื่อแปลง intScore เป็นประเภทข้อมูลสตริงหรือถ่านโดยใช้ฟังก์ชัน sprintf
intDiff ยังใช้ที่นี่ โดยพิจารณาจากค่าที่พิมพ์ตัวเลือกความยากต่างๆ
ขั้นตอนที่ 10: ฟังก์ชัน ButtonsMenu
ใส่รหัสต่อไปนี้ลงในโปรแกรมของคุณ
void buttonsMenu(){ // เมื่อกด enter เริ่มเกมและรีเซ็ตค่าคะแนนถ้า (intEnter == 1) { bolPlay = true; intScore = 0; เพลย์บอร์ด(); drawBoard(); } // เมื่อกดปุ่ม 3 ให้เปิดตัวเลือกการดีบักของการพิมพ์บอร์ดแบบอนุกรม if (intInput == 3){ if (bolSerialBoard == false){ Serial.println("Serial Board Active"); bolSerialBoard = จริง; } อื่น ๆ { Serial.println ("Serial Board Disabled"); bolSerialBoard = เท็จ; } } // ตั้งค่าความเร็วของเกมเป็นความยากง่ายถ้า (intInput == 0){ Serial.print ("เกมตั้งค่าให้ง่าย ("); Serial.print (intGameSpeedEasy); Serial.println ("ms การเร่งความเร็ว)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // ตั้งค่าความเร็วของเกมเป็นความยากปานกลางหาก (intInput == 1){ Serial.print ("เกมตั้งค่าเป็นปานกลาง ("); Serial.print (intGameSpeedMedium); Serial.println ("ms การเร่งความเร็ว)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // ตั้งค่าความเร็วของเกมเป็นระดับยากหาก (intInput == 2){ Serial.print("เกมถูกตั้งค่าเป็นฮาร์ด ("); Serial.print (intGameSpeedHard); Serial.println ("ms การเร่งความเร็ว)"); intDiff = 2; intGameSpeed = intGameSpeedHard; } }
รหัสนี้ทำงานเฉพาะเมื่อ bolPlay เท่ากับ false ใน void Loop
หากตั้งค่า intEnter เป็น 1 แสดงว่ามีการกดปุ่ม Enter หากมีการกดปุ่ม โปรแกรมจะตั้งค่า bolPlay เป็น true และเริ่มเกม
จากนั้นโปรแกรมจะอ่านว่า intInput เท่ากับอะไร หากมีค่าเท่ากับ 0 ให้กดปุ่มแรกจากด้านซ้าย ไปทางขวาขึ้นไป 3 หาก intInput เท่ากับ 4 จะไม่มีการกดปุ่มใดๆ
หากกดปุ่ม 0-2 เกมจะเปลี่ยนความยาก อีกทั้งปรับค่าความเร็วของเกมด้วย หมายความว่าเกมจะเร่งเร็วขึ้น
หากกดปุ่ม 3 เกมจะเปิดใช้งานหรือปิดใช้งานโหมดดีบักโดยที่ทั้งกระดานถูกพิมพ์ในจอภาพแบบอนุกรมเพื่อช่วยในการค้นหาปัญหาในโปรแกรม
ขั้นตอนที่ 11: ฟังก์ชั่น ButtonsGame
คัดลอกรหัสต่อไปนี้ลงในโปรแกรมของคุณ
void buttonsGame(){ if (intInput != 4) { //if a button is pressed if (bolTilePressed == false){ // only if bolTilePressed is false trigger actions for check a button press bolTilePressed = true; //จากนั้นตั้งค่า bolTilePressed เป็น true เพื่อให้แน่ใจว่าจะไม่ถูกทริกเกอร์แบบ acidentilly อีก int intLowestTile = 0; // เพื่อตั้งค่าเป็นไทล์ที่มีไทล์ต่ำสุด intCheckedTile = 15; // เพื่อติดตามว่าไทล์ใดได้รับการตรวจสอบในขณะที่ (intLowestTile == 0) {// ตราบใดที่ไม่ได้ตั้งค่าให้ตรวจสอบไทล์สำหรับ (int i = 0; i 100) { // ตราบใดที่ int ดีเลย์ไม่ต่ำกว่า 100 intDelay = intDelay - 20; //รับค่าจากมัน } } else { Serial.println ("กดปุ่มผิด"); จบเกม(); //มิฉะนั้นเกมจะจบลง } } } } }
รหัสจะทำงานเมื่อ bolPlay เท่ากับ true ใน void Loop เท่านั้น
เช่นเดียวกับปุ่มเมนูตามค่าของ intInput จะตรวจสอบเพื่อดูว่าผู้เล่นแตะไทล์หรือพลาดไปหรือไม่
ทำได้โดยผ่าน arrGame จากล่างขึ้นบนโดยใช้ while loop เพื่อค้นหาว่าแถวใดต่ำที่สุดด้วยไทล์ unhit จากนั้นจะตรวจสอบเพื่อดูว่าจุดในแถวนั้นที่สอดคล้องกับปุ่มที่กดนั้นเป็นไทล์ที่ไม่มีการตีหรือไม่ หากไม่มีการกดปุ่ม มันจะตั้งค่าให้เท่ากับ 2 แทนที่จะเป็น 1 หมายความว่าจะแสดงเป็น @ ไม่เช่นนั้นจะทริกเกอร์ gameOver ฟังก์ชั่นที่เรายังไม่ได้สร้าง
ฟังก์ชันนี้ยังใช้ตัวแปร bolTilePressed โดยตั้งค่าให้เป็นจริงเมื่อกดปุ่ม และเป็นเท็จเมื่อไม่ได้กดปุ่ม ทั้งนี้เพื่อให้แน่ใจว่าผู้ใช้จะไม่พลาดเกมโดยไม่ได้ตั้งใจ เนื่องจากโปรแกรมคิดว่าพวกเขากดปุ่มหลายครั้งเมื่อกดค้างไว้
ขั้นตอนที่ 12: ฟังก์ชัน GameOver
คัดลอกโค้ดต่อไปนี้ลงในโปรแกรมของคุณ
เป็นโมฆะ gameOver () { Serial.println ("จบเกม!"); Serial.print("คะแนนของคุณคือ: "); Serial.println (intScore); Serial.print("ความเร็วของคุณคือ: "); Serial.println (intDelay); bolPlay = เท็จ; }
สิ่งนี้ถูกทริกเกอร์โดยฟังก์ชัน checkBottom หรือปุ่มต่างๆ ของเกม และทริกเกอร์จุดสิ้นสุดของเกมโดยการตั้งค่า bolPlay ให้เป็นเท็จ
นอกจากนี้ยังพิมพ์ข้อความลงในจอภาพแบบอนุกรมสำหรับคะแนนผู้ใช้และเพิ่มไทล์ความเร็วเป็นมิลลิวินาที
ขั้นตอนที่ 13: ฟังก์ชันอินพุต
คัดลอกรหัสต่อไปนี้ลงในโปรแกรมของคุณ
อินพุตเป็นโมฆะ () { intEnter = digitalRead (btnEnter); //read enter //อ่านว่าอินพุตใดของอินพุตอื่น หรือถ้าไม่มีการตั้งค่าเป็น 4 if (digitalRead(btn1) == HIGH){intInput = 0;} else { if (digitalRead (btn2) == HIGH){intInput = 1;} else { if (digitalRead (btn3) == HIGH) {intInput = 2;} else { if (digitalRead (btn4) == HIGH) {intInput = 3;} อื่น ๆ { intInput = 4; }}}} //serial พิมพ์อินพุต if (intEnter == 1){Serial.println("Enter Pressed! ");} if (intInput != 4){ Serial.print("Button Press: "); Serial.println (intInput); } อื่น { //ถ้าไม่มีการกดปุ่ม ให้รีเซ็ต bolTilePressed bolTilePressed = false; } }
รหัสนี้ใช้กับฟังก์ชั่นปุ่มเกมและปุ่มเมนู ขึ้นอยู่กับปุ่มที่ผู้ใช้กด จะเป็นการตั้งค่าของ intInput หรือหากไม่มีการกดปุ่มใด ๆ ก็จะตั้งค่า intInput ให้เท่ากับ 4
หากไม่มีการกดปุ่ม นี่คือที่ที่ bolTilePressed ถูกรีเซ็ตสำหรับปุ่มฟังก์ชันเกม
นอกจากนี้ยังพิมพ์ข้อความไปยังจอภาพแบบอนุกรมที่กดปุ่ม
ขั้นตอนที่ 14: ฟังก์ชัน BottomCheck
คัดลอกรหัสต่อไปนี้ไปยังโปรแกรมของคุณ
ถือเป็นโมฆะ bottomCheck () { สำหรับ (int i = 0; i <= 3; i++) { // สำหรับ 4 คอลัมน์ if (arrGame[15] == 1){ // ถ้าไทล์อยู่ด้านล่าง Serial.println("ไทล์ที่ด้านล่าง"); arrGame[15] = 2; drawBoard(); ล่าช้า (400); arrGame[15] = 1; drawBoard(); ล่าช้า (400); arrGame[15] = 2; drawBoard(); ล่าช้า (400); arrGame[15] = 1; drawBoard(); ล่าช้า (400); จบเกม(); } } }
ใช้การวนซ้ำ รหัสนี้จะตรวจสอบแถวล่างของ arrGame สำหรับไทล์ที่ไม่ได้ถูกโจมตี (ไทล์เท่ากับ 1) หากมีไทล์ที่ไม่ถูกโจมตีที่ด้านล่างของหน้าจอ ไทล์จะกะพริบและทริกเกอร์เกมโอเวอร์
ขั้นตอนที่ 15: ฟังก์ชัน WriteSerial
คัดลอกรหัสต่อไปนี้ลงในโปรแกรมของคุณ
เป็นโมฆะ writeSerial () { ถ้า (bolSerialBoard == จริง) { สำหรับ (int i = 0; i <= 15; i ++) { สำหรับ (int ii = 0; ii <= 3; ii ++) { Serial.print (arrGame [สาม]); Serial.print(", "); } Serial.println(""); } } }
นี่คือฟังก์ชันที่ตามมาด้วยตัวเลือกการดีบักที่สามารถเปิดใช้งานได้ในฟังก์ชัน buttonsMenu หาก bolSerialBoard ถูกตั้งค่าเป็น true ในฟังก์ชันนั้น ฟังก์ชันนั้นจะผ่าน arrGame และพิมพ์ทั้งบอร์ดลงในจอภาพแบบอนุกรมเพื่อการทดสอบโดยใช้อาร์เรย์
ขั้นตอนที่ 16: เสร็จสิ้น
รหัสทั้งหมดของคุณไม่ควรสมบูรณ์และมีลักษณะเช่นนี้!
/* * ชื่อ - กระเบื้องเปียโน; Arduino * โดย - Domenic Marulli * วันที่ - 11/*
/ รวมห้องสมุด
#รวม
//ตัวแปรเหล่านี้เป็นตัวเลือกที่คุณสามารถเปลี่ยนได้ - ตัวเลขที่สูงขึ้น = เกมเร็วขึ้น เร็วขึ้น
int intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;
// กำหนดหมุด
#define btnEnter A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18
// สร้างวัตถุ LCD (n, ~, n, ~, ~, n)
LiquidCrystal lcdLeft(8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight (2, 3, 4, 5, 6, 7);
// ตั้งค่าเกมอาร์เรย์
int arrGame[16][4] = { {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} };
//ตั้งค่าตัวแปรสำหรับเกม
บูลีน bolPlay; //ติดตามว่าผู้เล่น intScore; //ติดตามคะแนนของผู้เล่น int intDiff; //แค่เรื่องน่ารู้ที่บอกว่าเกมมันยากแค่ไหน
//ตั้งค่าตัวแปรสำหรับอินพุต
int intEnter; //ติดตามว่าผู้ใช้กดปุ่ม Enter int intInput; //ติดตามว่าปุ่มใดที่ผู้ใช้กดบูลีน bolTilePressed; // ตรวจสอบให้แน่ใจว่าผู้เล่นไม่บังเอิญกดปุ่ม 5x และแพ้
//ตั้งค่าตัวแปรสำหรับเทิร์น
int intTick; //นับค่าเป็น millies (ต่อลูป) จนถึง intDelay int intDelay; //เวลาที่โปรแกรมรอจนถึงเทิร์นถัดไปในหน่วยมิลลิวินาที intGameSpeed;
//abit ของตัวเลือกการดีบัก
บูลีน bolSerialBoard; //เมื่อ true จะพิมพ์บอร์ดในมอนิเตอร์แบบอนุกรม
// การตั้งค่าที่จะเรียกใช้ครั้งเดียว
การตั้งค่าเป็นโมฆะ () { Serial.begin (9600); //เริ่มมอนิเตอร์แบบอนุกรม //ตั้งค่าตัวแปร bolPlay = false; intScore = 0; intTick = 0; intDelay = 1,000; intDiff = 1; intGameSpeed = intGameSpeedMedium; //เริ่ม lcdLeft.begin(16, 2); lcdRight.begin(16, 2); }
//ลูปที่จะรันทุกๆ 10 มิลลิวินาที
วงเป็นโมฆะ () { อินพุต (); // ตรวจสอบการเล่นอินพุต if (bolPlay == true){ if (intTick >= intDelay){ //ตรวจสอบว่าเกมควรเล่นเทิร์นหรือรอ Serial.println("~~~~~~~ ต่อไป ~~");//พิมพ์เพื่อแสดงว่ากระดานย้ายไป //writeSerial(); //หากเปิดใช้งานตัวเลือกให้เขียนบอร์ดลงใน serial buttonsGame(); // ตรวจสอบอินพุตของผู้เล่น playBoard(); // ย้ายบอร์ดและเพิ่มไทล์ใหม่ clearLcd(); // ทำความสะอาด LCD ก่อนวาด drawBoard(); //วาดบอร์ดลงบนด้านล่างของจอ LCDCheck(); intTick = 0; // รีเซ็ต intTick } อื่น ๆ { buttonsGame (); // ตรวจสอบอินพุตของผู้เล่น clearLcd(); // ทำความสะอาด LCD ก่อนวาด drawBoard(); //วาดกระดานลงบนจอ LCD intTick = intTick + intGameSpeed; //เพิ่มเพื่อทำเครื่องหมาย } } อื่น ๆ { clearLcd(); // ทำความสะอาด LCD ก่อนวาดชื่อ (); //แสดงชื่อและปุ่มข้อมูลคะแนนเมนู(); // อ่านอินพุตของผู้เล่น clearBoard(); // ตรวจสอบให้แน่ใจว่าทั้งกระดาน = 0 } ล่าช้า (10); // ชะลอ Arduino โดยช่วงเวลาสั้น ๆ }
// ทำความสะอาด LCD เพื่อไม่ให้เซลล์ที่ไม่ถูกป้อนเหลืออยู่
เป็นโมฆะ clearLcd () { สำหรับ (int i = 0; i <= 15; i++) { สำหรับ (int ii = 0; ii <= 1; ii++) { lcdLeft.setCursor (i, ii); lcdLeft.write(" "); lcdRight.setเคอร์เซอร์(i, ii); lcdRight.write(" "); } } }
//ดึงกระดานลงบนจอ LCD
เป็นโมฆะ drawBoard () { สำหรับ (int i = 1; i <= 15; i ++) { //draw collums 1 และ 2 บน LCD ด้านซ้าย // ถ้าไทล์ = 0 ไม่เขียนอะไรเลย = 1 เขียน "#", = 2 เขียน "@" lcdLeft.setCursor(i, 1); // ตั้งค่าเป็นคอลัมน์แรก (ซ้ายสุด) if (arrGame[0] == 1) {lcdLeft.write("#");} if (arrGame[0] == 2) {lcdLeft.write("@");} lcdLeft.setCursor(i, 0); // ตั้งค่าเป็นคอลัมน์ที่สอง (ตรงกลางซ้าย) if (arrGame[1] == 1) {lcdLeft.write("#");} if (arrGame[1] == 2) {lcdLeft.write("@");} lcdRight.setCursor(i, 1); // ตั้งค่าเป็นคอลัมน์ที่สาม (ตรงกลางขวา) if (arrGame[2] == 1) {lcdRight.write("#");} if (arrGame[2] == 2) {lcdRight.write("@");} lcdRight.setCursor(i, 0); // ตั้งค่าเป็นคอลัมน์ที่สี่ (ขวาสุด) if (arrGame[3] == 1) {lcdRight.write("#");} if (arrGame[3] == 2) {lcdRight.เขียน("@");} } }
//เลื่อนกระดานลงและวางค่าสุ่มให้เป็นไทล์
โมฆะ playBoard() { สำหรับ (int i = 0; i <= 3; i++){arrGame[0] = 0;} // เคลียร์แถวบนสุด arrGame[0][random(0, 4)] = 1; // กำหนดจุดสุ่มบนแถวบนสุดให้เป็นไทล์สำหรับ (int i = 15; i>= 1; i--){ //ทำงานจากด้านล่างของกระดานไปยังด้านบนสุดสำหรับ (int ii = 0; ii <= 3; ii ++){ // สำหรับแต่ละ collum arrGame[ii] = arrGame[i - 1][ii]; } } }
// ตั้งค่าทั้งกระดานเป็น 0 และรีเซ็ตตัวแปรเป็น pregame
โมฆะ clearBoard () {// รีเซ็ตค่าขีดและค่าหน่วงเวลา intTick = 0; intDelay = 1,000; // ผ่านกระดานและตั้งค่าทุกอย่างเป็น 0 สำหรับ (int i = 0; i <= 15; i++){ for (int ii = 0; ii <= 3; ii++){ arrGame[ii] = 0; } } }
// แสดงเมนูหลักบน LCD's
ชื่อเป็นโมฆะ () {// เขียนชื่อลงบน LCD และช่องว่างสำหรับคะแนน lcdRight.setCursor (0, 0); lcdRight.write("กระเบื้องเปียโน"); lcdRight.setCursor(0, 1); lcdRight.write("คะแนน:"); //แปลงคะแนนเป็นสตริงถ่าน strScore[3]; sprintf(strScore, "%d", intScore); //แสดงคะแนนบน LCD lcdRight.write(strScore); // เพิ่ม diffictuly lcdRight.setCursor(10, 1); if (intDiff == 0){ lcdRight.write ("ง่าย"); } if (intDiff == 1) { lcdRight.write ("ปานกลาง"); } if (intDiff == 2) { lcdRight.write ("ยาก"); } //กดคำสั่งเล็กน้อย lcdLeft.setCursor(0, 0); lcdLeft.write("กด Enter"); lcdLeft.setเคอร์เซอร์(0, 1); lcdLeft.write("เพื่อเริ่มต้น!"); }
// ตรวจสอบปุ่มต่างๆ และสิ่งที่ต้องทำเมื่อออกจากเกม
void buttonsMenu(){ // เมื่อกด enter เริ่มเกมและรีเซ็ตค่าคะแนนถ้า (intEnter == 1) { bolPlay = true; intScore = 0; เพลย์บอร์ด(); drawBoard(); } // เมื่อกดปุ่ม 3 ให้เปิดตัวเลือกการดีบักของการพิมพ์บอร์ดแบบอนุกรม if (intInput == 3){ if (bolSerialBoard == false){ Serial.println("Serial Board Active"); bolSerialBoard = จริง; } อื่น ๆ { Serial.println ("Serial Board Disabled"); bolSerialBoard = เท็จ; } } // ตั้งค่าความเร็วของเกมเป็นความยากง่ายถ้า (intInput == 0){ Serial.print ("เกมตั้งค่าให้ง่าย ("); Serial.print (intGameSpeedEasy); Serial.println ("ms การเร่งความเร็ว)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // ตั้งค่าความเร็วของเกมเป็นความยากปานกลางหาก (intInput == 1){ Serial.print ("เกมตั้งค่าเป็นปานกลาง ("); Serial.print (intGameSpeedMedium); Serial.println ("ms การเร่งความเร็ว)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // ตั้งค่าความเร็วของเกมเป็นระดับยากหาก (intInput == 2){ Serial.print("เกมถูกตั้งค่าเป็นฮาร์ด ("); Serial.print (intGameSpeedHard); Serial.println ("ms การเร่งความเร็ว)"); intDiff = 2; intGameSpeed = intGameSpeedHard; } }
// ตรวจสอบปุ่มและสิ่งที่ต้องทำในขณะที่อยู่ในเกม
โมฆะ buttonsGame(){ if (intInput != 4) { //if a button is pressed if (bolTilePressed == false){ // only if bolTilePressed is false trigger actions for check a button press bolTilePressed = true; //จากนั้นตั้งค่า bolTilePressed เป็น true เพื่อให้แน่ใจว่าจะไม่ถูกทริกเกอร์แบบ acidentilly อีก int intLowestTile = 0; // เพื่อตั้งค่าเป็นไทล์ที่มีไทล์ต่ำสุด intCheckedTile = 15; // เพื่อติดตามว่าไทล์ใดได้รับการตรวจสอบในขณะที่ (intLowestTile == 0) {// ตราบใดที่ไม่ได้ตั้งค่าให้ตรวจสอบไทล์สำหรับ (int i = 0; i 100) { // ตราบใดที่ int ดีเลย์ไม่ต่ำกว่า 100 intDelay = intDelay - 20; //รับค่าจากมัน } } else { Serial.println ("กดปุ่มผิด"); จบเกม(); //มิฉะนั้นเกมจะจบลง } } } } }
เป็นโมฆะ gameOver () {
Serial.println("จบเกม!"); Serial.print("คะแนนของคุณคือ: "); Serial.println (intScore); Serial.print("ความเร็วของคุณคือ: "); Serial.println (intDelay); bolPlay = เท็จ; }
// ตรวจสอบอินพุตของผู้เล่น
อินพุตเป็นโมฆะ () { intEnter = digitalRead (btnEnter); //read enter //อ่านว่าอินพุตใดของอินพุตอื่น หรือถ้าไม่มีการตั้งค่าเป็น 4 if (digitalRead(btn1) == HIGH){intInput = 0;} else { if (digitalRead (btn2) == HIGH){intInput = 1;} else { if (digitalRead (btn3) == HIGH) {intInput = 2;} else { if (digitalRead (btn4) == HIGH) {intInput = 3;} อื่น ๆ { intInput = 4; }}}} //serial พิมพ์อินพุต if (intEnter == 1){Serial.println("Enter Pressed! ");} if (intInput != 4){ Serial.print("Button Press: "); Serial.println (intInput); } อื่น { //ถ้าไม่มีการกดปุ่ม ให้รีเซ็ต bolTilePressed bolTilePressed = false; } }
//ตรวจสอบด้านล่างของบอร์ดว่ามีข้อผิดพลาดหรือไม่
void bottomCheck() { สำหรับ (int i = 0; i <= 3; i++) { // สำหรับ 4 คอลัมน์ if (arrGame[15] == 1){ // ถ้าไทล์อยู่ด้านล่าง Serial.println("ไทล์ที่ด้านล่าง"); arrGame[15] = 2; drawBoard(); ล่าช้า (400); arrGame[15] = 1; drawBoard(); ล่าช้า (400); arrGame[15] = 2; drawBoard(); ล่าช้า (400); arrGame[15] = 1; drawBoard(); ล่าช้า (400); จบเกม(); } } }
//พิมพ์บอร์ดลงในมอนิเตอร์แบบอนุกรมหาก bolSerialBoard เป็นจริง
เป็นโมฆะ writeSerial () { ถ้า (bolSerialBoard == จริง) { สำหรับ (int i = 0; i <= 15; i ++) { สำหรับ (int ii = 0; ii <= 3; ii ++) { Serial.print (arrGame [สาม]); Serial.print(", "); } Serial.println(""); } } }
เมื่อป้อนรหัสทั้งหมดแล้ว ให้อัปโหลดไปยัง Arduino แล้วสนุกได้เลย!
แนะนำ:
อะแดปเตอร์ Arduino Nano เป็น Arduino Uno: 6 ขั้นตอน (พร้อมรูปภาพ)
อะแดปเตอร์ Arduino Nano เป็น Arduino Uno: Arduino Nano เป็นสมาชิกที่ดี ขนาดเล็ก และราคาถูกของตระกูล Arduino มันขึ้นอยู่กับชิป Atmega328 สิ่งที่ทำให้มีประสิทธิภาพเท่ากับ Arduino Uno พี่ชายที่ใหญ่ที่สุดของเขา แต่สามารถรับเงินน้อยกว่า ในอีเบย์ตอนนี้เวอร์ชั่นภาษาจีนสามารถข
Bolt - DIY Wireless Charging Night Clock (6 ขั้นตอน): 6 ขั้นตอน (พร้อมรูปภาพ)
Bolt - DIY Wireless Charging Night Clock (6 ขั้นตอน): การชาร์จแบบเหนี่ยวนำ (เรียกอีกอย่างว่าการชาร์จแบบไร้สายหรือการชาร์จแบบไร้สาย) เป็นการถ่ายโอนพลังงานแบบไร้สาย ใช้การเหนี่ยวนำแม่เหล็กไฟฟ้าเพื่อจ่ายกระแสไฟฟ้าให้กับอุปกรณ์พกพา แอปพลิเคชั่นที่พบบ่อยที่สุดคือ Qi Wireless Charging st
Arduino ที่ถูกที่สุด -- Arduino ที่เล็กที่สุด -- Arduino Pro Mini -- การเขียนโปรแกรม -- Arduino Neno: 6 ขั้นตอน (พร้อมรูปภาพ)
Arduino ที่ถูกที่สุด || Arduino ที่เล็กที่สุด || Arduino Pro Mini || การเขียนโปรแกรม || Arduino Neno:…………………………… โปรดสมัครสมาชิกช่อง YouTube ของฉันสำหรับวิดีโอเพิ่มเติม……. โปรเจ็กต์นี้เกี่ยวกับวิธีเชื่อมต่อ Arduino ที่เล็กที่สุดและถูกที่สุดเท่าที่เคยมีมา Arduino ที่เล็กที่สุดและถูกที่สุดคือ arduino pro mini คล้ายกับ Arduino
4 ขั้นตอน Digital Sequencer: 19 ขั้นตอน (พร้อมรูปภาพ)
4 ขั้นตอน Digital Sequencer: CPE 133, Cal Poly San Luis Obispo ผู้สร้างโปรเจ็กต์: Jayson Johnston และ Bjorn Nelson ในอุตสาหกรรมเพลงในปัจจุบัน ซึ่งเป็นหนึ่งใน “instruments” เป็นเครื่องสังเคราะห์เสียงดิจิตอล ดนตรีทุกประเภท ตั้งแต่ฮิปฮอป ป๊อป และอีฟ
ป้ายโฆษณาแบบพกพาราคาถูกเพียง 10 ขั้นตอน!!: 13 ขั้นตอน (พร้อมรูปภาพ)
ป้ายโฆษณาแบบพกพาราคาถูกเพียง 10 ขั้นตอน!!: ทำป้ายโฆษณาแบบพกพาราคาถูกด้วยตัวเอง ด้วยป้ายนี้ คุณสามารถแสดงข้อความหรือโลโก้ของคุณได้ทุกที่ทั่วทั้งเมือง คำแนะนำนี้เป็นการตอบสนองต่อ/ปรับปรุง/เปลี่ยนแปลงของ: https://www.instructables.com/id/Low-Cost-Illuminated-