• Arduino自制打地鼠游戏机详细教程


    打地鼠游戏机

    游戏规则:
    3LED对应3个按键,刚开始时蜂鸣器鸣叫三声,频率5Hz,紧接着每0.5秒生成一个02随机数,对应点亮相应的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,则不会执行花括号里的内容
    3for(i=x, i<y, i++){...}——给变量i初始赋值为x,当i<y时,执行花括号里的内容,然后i数值增加1c语言里,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)蜂鸣器使用说明:当蜂鸣器的正极(长管脚)与ArduinoI/O口相连,另一端接地,此时Arduino输出高电平时蜂鸣器鸣叫,输出低电平时蜂鸣器不叫。

     

    实验器材:
    Arduino Uno开发板,3个开关,1个蜂鸣器,3LED6个电阻,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();
    }

    参考连线图

  • 相关阅读:
    无缝滚动轮播图
    angular 1.6指令与服务
    angular 1.6路由
    javascript 对象
    JavaScript的运算符
    初识JavaScript!
    git常用命令(二)文字版
    CSS水平垂直居中
    收藏的一些牛逼博客
    html5 学习汇总
  • 原文地址:https://www.cnblogs.com/ticktack/p/7998080.html
Copyright © 2020-2023  润新知