Arduino打地鼠小游戏代码详解:避开按钮消抖、随机数及时间计算陷阱!
```cpp #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // 定义三个按钮的引脚 const int buttonPin1 = 2; const int buttonPin2 = 3; const int buttonPin3 = 4; // 定义三个LED灯的引脚 const int ledPin1 = 5; const int ledPin2 = 6; const int ledPin3 = 7; // 游戏相关变量 int score = 0; // 分数 int randomHole; // 随机亮起的洞 unsigned long startTime; // 游戏开始时间 unsigned long gameDuration = 30000; // 游戏时长,30秒 bool gameStarted = false; // 游戏是否开始 void setup() { // 初始化串口通信 Serial.begin(9600); // 初始化OLED显示屏 if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 allocation failed")); for(;;); } display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.println("Whac-A-Mole!"); display.println("Press any key"); display.display(); // 设置按钮引脚为输入模式 pinMode(buttonPin1, INPUT_PULLUP); pinMode(buttonPin2, INPUT_PULLUP); pinMode(buttonPin3, INPUT_PULLUP); // 设置LED灯引脚为输出模式 pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); // 关闭所有LED灯 digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, LOW); digitalWrite(ledPin3, LOW); } void loop() { if (!gameStarted) { // 检测是否有按钮按下以开始游戏 if (digitalRead(buttonPin1) == LOW || digitalRead(buttonPin2) == LOW || digitalRead(buttonPin3) == LOW) { gameStarted = true; startTime = millis(); newRound(); } } else { // 检查游戏是否结束 if (millis() - startTime >= gameDuration) { gameOver(); } else { checkButtons(); } } } // 开始新的一轮 void newRound() { // 关闭所有LED灯 digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, LOW); digitalWrite(ledPin3, LOW); // 随机选择一个洞亮起 randomHole = random(1, 4); if (randomHole == 1) { digitalWrite(ledPin1, HIGH); } else if (randomHole == 2) { digitalWrite(ledPin2, HIGH); } else if (randomHole == 3) { digitalWrite(ledPin3, HIGH); } } // 检查按钮是否按下 void checkButtons() { if (randomHole == 1 && digitalRead(buttonPin1) == LOW) { score++; newRound(); } else if (randomHole == 2 && digitalRead(buttonPin2) == LOW) { score++; newRound(); } else if (randomHole == 3 && digitalRead(buttonPin3) == LOW) { score++; newRound(); } } // 游戏结束 void gameOver() { gameStarted = false; // 关闭所有LED灯 digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, LOW); digitalWrite(ledPin3, LOW); // 在OLED上显示游戏结束信息和分数 display.clearDisplay(); display.setCursor(0, 0); display.println("Game Over!"); display.print("Score: "); display.println(score); display.display(); // 重置分数 score = 0; } ``` 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 按钮的消抖问题,由于机械按钮在按下和释放时会产生抖动,可能会导致多次触发,需要进行消抖处理。 2. 随机数的生成,要确保随机数的范围正确,避免出现超出预期的情况。 3. 时间的计算,在判断游戏是否结束时,要注意时间的单位和计算的准确性,避免出现游戏时长不准确的问题。 ######[AI写代码神器 | 1190点数解答 | 2025-09-10 14:17:47]
- 龙年年会盛宴:热场、表演、游戏嗨翻全场! (字节豆包 | 270点数解答 | 2025-01-16 14:21:53)267
- 超燃年会盛宴:游戏、表演与祝福共迎 2024 新征程!(字节豆包 | 392点数解答 | 2025-01-16 14:34:56)183
- Java JFrame 实现多界面跳转:含登录、注册及个人信息管理功能(讯飞星火 | 503点数解答 | 2024-06-06 23:49:29)400
- 超详细!用复杂 HTML 代码打造功能丰富网站,含特色搜索与展示(字节豆包 | 572点数解答 | 2024-11-17 07:58:26)266
- 深度揭秘 Oracle Workarea Size Policy:参数调优助力数据库性能飞升(阿里通义 | 372点数解答 | 2024-05-13 10:54:45)237
- jQuery 实现动态操作 DOM:打造可增删任务的待办事项列表应用(百度文心 | 1015点数解答 | 2024-10-26 23:41:22)438
- jQuery 打造实用待办事项列表:输入添加、点击删除一步到位!(阿里通义 | 1139点数解答 | 2024-10-29 08:44:48)355
- jQuery 实现动态操作 DOM:打造带添加与删除功能的待办事项列表应用(阿里通义 | 687点数解答 | 2024-10-29 09:25:06)368
- jQuery 实战:打造可添加与删除任务的待办事项列表应用(字节豆包 | 499点数解答 | 2024-10-29 20:40:48)281
- 易语言读取文本文件并显示到超级列表框:代码示例与注意要点(DeepSeek | 571点数解答 | 2025-08-23 20:54:40)233
- 易语言:读取并显示特定文本到超级列表框,还能增加新数据的方法与要点(DeepSeek | 1317点数解答 | 2025-08-23 20:58:40)236
- 用Arduino实现光敏电阻控制<500亮、按钮开启的流水灯,附硬件连接与代码示例 ( | 987点数解答 | 2024-06-20 20:05:00)186