打地鼠游戲機
游戲規則:
3個LED對應3個按鍵,剛開始時蜂鳴器鳴叫三聲,頻率5Hz,緊接着每0.5秒生成一個0至2的隨機數,對應點亮相應的LED,在下次隨機數生成之前判斷相應的按鍵是否被按下,若按鍵正確,在串口打印“LED編號”+“right”;若按鍵錯誤,蜂鳴器鳴叫0.2秒,在串口打印“LED編號”+“wrong”,然后繼續生成隨機數。完成10次操作后生成隨機數的頻率變為0.4秒,又完成10次操作后頻率變為0.3秒,以此類推,0.1秒頻率下完成10次操作游戲結束,串口打印“game over”,蜂鳴器鳴叫5聲,頻率5Hz。在游戲過程中,錯誤3次游戲也結束,串口打印“game over”,蜂鳴器鳴叫3聲,頻率5Hz。
背景知識:
1)rand()——Arduino IDE庫中自帶的用於產生隨機數的函數:在Arduino IDE中調用rand()將會返回一個隨機的正整數。例如 int num=rand(); //num為一個隨機生成的正整數
2)while(..) {...}——循環判斷小括號內條件是否為真,若為真,執行花括號里的內容,否則跳出循環。例如while(x>0){x=x-1;} 表示當x>0時一直執行減一的操作,直到不滿足x>0時跳出while循環,如果一開始x的值就不滿足x>0,則不會執行花括號里的內容
3)for(i=x, i<y, i++){...}——給變量i初始賦值為x,當i<y時,執行花括號里的內容,然后i數值增加1(c語言里,i++等價於i=i+1)。類似的,還可以有for(int i=x, i<=y, i=i+2){...};
for(int i=x, i>y, i--);
4)%——取模操作:‘%’符號左邊放操作數,‘%’右邊放要除以的數,結果將得到余數。例如:int num=11%3; //num=2 int num=12%3; //num=0
5)自定義函數:a.沒有參數,不帶返回值,結構類似void loop(){...} b.沒有參數,但有返回值,比如函數rand(),返回一個隨機數 c. 帶參數,沒有返回值。格式為: void funcName(i){}
d. 帶參數,且有返回值。格式為:type funcName(i){... return x;}
6)蜂鳴器使用說明:當蜂鳴器的正極(長管腳)與Arduino的I/O口相連,另一端接地,此時Arduino輸出高電平時蜂鳴器鳴叫,輸出低電平時蜂鳴器不叫。
實驗器材:
Arduino Uno開發板,3個開關,1個蜂鳴器,3個LED,6個電阻,14根導線,2個面包板
參考代碼:
int btn0=6, btn1=7, btn2=8, buzzer=9;
int led0=10, led1=11, led2=12;
int i, j, k, error=0, num=-1;
void ledOn(){
//隨機使一個LED亮
num = rand()%3;
if(num==0) digitalWrite(led0, HIGH);
if(num==1) digitalWrite(led1, HIGH);
if(num==2) digitalWrite(led2, HIGH);
}
void ledOff(){
digitalWrite(led0, LOW);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
}
void warning(){
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
error++;
}
int judge(){
//判斷對應的按鍵是否被按下,按鍵正確返回1,否則返回0
while(num==0){
if(digitalRead(btn0)==HIGH){
Serial.println("0 right");
return 1;
}
else if(digitalRead(btn1)==HIGH || digitalRead(btn2)==HIGH){
error++;
Serial.println("0 wrong");
return 0;
}
}
while(num==1){
if(digitalRead(btn1)==HIGH){
Serial.println("1 right");
return 1;
}
else if(digitalRead(btn0)==HIGH || digitalRead(btn2)==HIGH){
error++;
Serial.println("1 wrong");
return 0;
}
}
while(num==2){
if(digitalRead(btn2)==HIGH){
Serial.println("2 right");
return 1;}
else if(digitalRead(btn0)==HIGH || digitalRead(btn1)==HIGH){
error++;
Serial.println("2 wrong");
return 0;
}
}
return -1;
}
void forever(){
while(1){delay(1000);}
}
int task(int x){
ledOn();
delay(x);
ledOff();
delay(x);
if(judge()==0) warning();
if(error>=3){
for(k=1; k<=3; k++){
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
delay(200);
}
Serial.println("game over");
return 0;
}
return 1;
}
void setup() {
Serial.begin(9600);
pinMode(led0, OUTPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(btn0, INPUT);
pinMode(btn1, INPUT);
pinMode(btn2, INPUT);
for(i=0; i<3; i++){
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
delay(200);
}//開始時蜂鳴器鳴叫三聲
}
void loop() {
for(j=0;j<10;j++)
if(task(500)==0)
forever();
for(j=0;j<10;j++)
if(task(400)==0)
forever();
for(j=0;j<10;j++)
if(task(300)==0)
forever();
for(j=0;j<10;j++)
if(task(200)==0)
forever();
for(j=0;j<10;j++)
if(task(100)==0)
forever();
Serial.println("game over");
forever();
}
參考連線圖