zoukankan      html  css  js  c++  java
  • 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();
    }

    参考连线图

  • 相关阅读:
    用Python完成一个汇率转换器
    鸿蒙如何用JS开发智能手表App
    鸿蒙如何用JS开发智能手表App
    SAP Spartacus SplitViewComponent Migration 的一个具体例子
    SAP Spartacus B2B 页面 Popover Component 的条件显示逻辑
    SAP Spartacus 升级时关于 schematics 的更新
    SAP Spartacus B2B 页面 Disable 按钮的显示原理
    SAP Spartacus B2B 页面 Disable Confirmation 对话框的显示原理
    通过 Feature Level 动态控制 SAP Spartacus 的页面显示
    SAP Commerce Cloud Build Manifest Components
  • 原文地址:https://www.cnblogs.com/ticktack/p/7998080.html
Copyright © 2011-2022 走看看