打地鼠游戏机
游戏规则:
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个面包板
参考代码:
/* 此程序对判断按键是否正确,若错误,蜂鸣器报警并记录错误次数 若出错3次游戏结束,蜂鸣器鸣叫3声,频率5Hz。50次按键测试完成, 则游戏结束,蜂鸣器鸣叫5声,频率5Hz */ int buzzer=6; //蜂鸣器 int btn0=7, btn1=8, btn2=9; //按键buttons int led0=10, led1=11, led2=12; //读取LED状态端口 int i, j, k, error=0; //按键错误的次数 int judge(){ //判断对应的按键是否被按下,按键正确返回1,否则返回0 while(digitalRead(led0)==HIGH){ if(digitalRead(btn0)==LOW) return 1; else if(digitalRead(btn1)==LOW || digitalRead(btn2)==LOW){ error=error+1; return 0; } } while(digitalRead(led1)==HIGH){ if(digitalRead(btn1)==LOW) return 1; else if(digitalRead(btn0)==LOW || digitalRead(btn2)==LOW) return 0; } while(digitalRead(led2)==HIGH){ if(digitalRead(btn2)==LOW) return 1; else if(digitalRead(btn0)==LOW || digitalRead(btn1)==LOW) return 0; } return -1; } void warning(){ digitalWrite(buzzer, HIGH); delay(200); digitalWrite(buzzer, LOW); error++; } void setup() { pinMode(6, OUTPUT); for(i=7; i<=12; i++) pinMode(i, INPUT); //设置7-12引脚为输入模式 } void loop() { for(j=0; j<50&&error<3; j++){ if(judge()==0) warning(); if(error=3){ for(j=1; j<=3; j++){ digitalWrite(buzzer, HIGH); delay(200); digitalWrite(buzzer, LOW); delay(200); } } } if(error<3){ for(k=1; k<=5; k++){ digitalWrite(buzzer, HIGH); delay(200); digitalWrite(buzzer, LOW); delay(200); } } }
参考连线