大家應該對打地鼠不陌生,簡單的遊戲規則,加上宛如雷神索爾的槌子,看到一隻隻欠打的地鼠分別從不同的洞跑出來,大力地給他打下去。這種爽快的感覺真的讓人無法忘懷。因此,為了讓我們能夠方便的隨時隨地都可以回味童年時的回憶,我們決定設計這款簡易型的打地鼠機器。只需要按按鈕就能夠輕易的完成這個遊戲,而且還能隨身攜帶,非常的方便。
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int ledPin[] = {12, 11, 10, 9, 8};
int ButtonPin[] = {7, 6, 5, 4, 3};
boolean ledState[] = {0, 0, 0, 0, 0};
int n1 = 0;
int n2 = 0;
unsigned long time_now;
int score = 0;
int wrongAnswers = 0;
int animationDelay = 1000;
int lightDuration = 1500;
int fastLightDuration = 1000;
int fastScoreThreshold1 = 20;
int fastScoreThreshold2 = 30;
bool doubleLights = false;
void setup() {
// 初始化LCD
lcd.init();
lcd.backlight();
Serial.begin(9600);
for (int i = 0; i < 5; i++) {
pinMode(ledPin[i], OUTPUT);
pinMode(ButtonPin[i], INPUT_PULLUP);
}
for (int i = 0; i < 5; i++) {
digitalWrite(ledPin[i], LOW);
}
startAnimation();
time_now = millis();
}
void loop() {
if (millis() >= time_now + animationDelay) {
for (int i = 0; i < 5; i++) {
digitalWrite(ledPin[i], LOW);
ledState[i] = LOW;
}
time_now = millis();
if (score >= fastScoreThreshold2) {
n1 = random(5);
do {
n2 = random(5);
} while (n1 == n2);
digitalWrite(ledPin[n1], HIGH);
digitalWrite(ledPin[n2], HIGH);
ledState[n1] = HIGH;
ledState[n2] = HIGH;
doubleLights = true;
lightDuration = fastLightDuration;
} else if (score >= fastScoreThreshold1) {
int n = random(5);
digitalWrite(ledPin[n], HIGH);
ledState[n] = HIGH;
doubleLights = false;
lightDuration = fastLightDuration;
} else {
int n = random(5);
digitalWrite(ledPin[n], HIGH);
ledState[n] = HIGH;
doubleLights = false;
lightDuration = 1500;
}
unsigned long startPressTime = millis();
boolean buttonPressed = false;
int pressedButton = -1;
while (millis() - startPressTime <= lightDuration) {
for (int i = 0; i < 5; i++) {
if (digitalRead(ButtonPin[i]) == LOW) {
buttonPressed = true;
pressedButton = i;
break;
}
}
if (buttonPressed) break;
}
if (doubleLights) {
digitalWrite(ledPin[n1], LOW);
digitalWrite(ledPin[n2], LOW);
ledState[n1] = LOW;
ledState[n2] = LOW;
} else {
digitalWrite(ledPin[n1], LOW);
ledState[n1] = LOW;
}
if (buttonPressed && (pressedButton == n1 || pressedButton == n2)) {
score++;
} else {
wrongAnswers++;
if (wrongAnswers >= 3) {
gameOverAnimation();
while (true);
}
}
}
lcd.setCursor(0, 0);
lcd.print("Score:");
lcd.print(score);
lcd.setCursor(0, 1);
lcd.print("Mistakes:");
lcd.print(wrongAnswers);
}
void startAnimation() {
lcd.setCursor(0, 0);
lcd.print("start");
delay(2000);
lcd.clear();
}
void gameOverAnimation() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Game Over");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Score: ");
lcd.print(score);
delay(2000);
}
這次的課程讓我學到了很多,過程中我們遇到了很多程式的問題,很想放棄,但都被我們一 一的克服了,看到成品順利的運作讓我非常的有成就感,還有很多挑戰等著我們去克服然後吸收,希望未來可以做出更厲害的作品。
透過這次的課程,學到了蠻多接線以及程式的設計。這學期更是需要我們活用上學期所學到的知識,去做延伸以及變化,來完成這次我們自己選擇的期末作品。這次做期末的作品時,遇到了蠻多的挫折,從接線一直接錯到程式碼一而再再而三的用錯,但還好我們並沒有放棄,冷靜地運用知識並把問題解決。很開心可以在這次的作品製作中,學習到這麼多。
經過這次的作業,透過本次的學習,來了解如何更深入的應用arduino,在快樂中學習。雖然本次的作業有一些的材料需要自己購買,還要寫報價單,算是給自己一個另類的學習機會。