Arduino蜂鸣器实现 1,2switch上的小游戏

        作为一个游戏爱好者,肯定听说过任天堂的switch,switch里面有个体感小游戏合集叫1,2switch,里面有一个游戏让我印象深刻——“Quick Draw”。说的是两个牛仔对枪。https://www.bilibili.com/video/av16801361?p=7。正好我们智能产品设计课程要做东西,我想了一下可不可以用Arduino来实现呢? 

        说干就干,我们确定好分工,我负责编程和电路。他们负责外边的模型,因为是第一次接触Arduino,对里面应用的语法语言都不是很了解,再简单的接触了一下发现就是C++。这就好办了。我不知道的只有几个函数对应功能,比如说测电流,比如说发出声音之类的。

        我最初的设想是这样的,首先在一个循环开始时记录下时间变量。然后进入到一个循环当中去,这个循环很快! 循环出去的条件时两个按钮都按下了(模拟开枪)。如果有一个没有按下,那么循环就一直判断两个按钮的状态。每个按钮按下,都会再记录一个时间点,得出刚才的时间差,这样就知道哪个按钮按的快了!

 

  while(t1==0 or t2==0){
  // 这个判断条件是判断按钮有没有按下,如果没有就继续执行 if(digitalRead(7)==HIGH) {t1=millis()-t; Serial.println("右边okk"); digitalWrite(4,HIGH); }
  // 这里在中间加一个循环也是消除误差 if(t1!=0 and t2!=0){ break; } if(digitalRead(8)==HIGH) {t2=millis()-t; Serial.println("左边okk"); digitalWrite(4,HIGH); } }

  理论上说这两个判断条件谁先谁后没有关系。但是毕竟是先判断一个按钮,再判断另一个。这样中间肯定是有误差的。所以将出循环的判断条件放在中间。(Arduino好像不能用多线程)。

        Ok,现在可以判断哪个按钮按下比较快了,现在我们给出胜利的结果(哪边快哪边的灯会亮)

  

  if(t1>t2){
       Serial.println("左边先开枪!右边阵亡!"); 
       digitalWrite(12, HIGH); 
  }
  if(t1<t2){
    Serial.println("右边先开枪!左边阵亡!");
    digitalWrite(11, HIGH); 
  }
  if(t1==t2){
    Serial.println("时间一样");// 因为以上的循环判断,所以这里基本上可以确定不会触发同时按下的情况
  }

  结束了这次判断,我们让灯闪烁三下,开始进入下一次循环。

  // 这里是让两个时间差归零
t1 = 0; t2 = 0; delay(2500); // 延迟2.5s digitalWrite(11,LOW); //让两个判断灯熄灭 digitalWrite(12,LOW); Serial.println(""); Serial.println(""); Serial.println(""); Serial.println("GO ON--------------------------------"); delay(1000);// 延迟1s for(int i=0;i<3;i++)// 本次循环结束 三个灯闪烁三下 { digitalWrite(11,HIGH); digitalWrite(12,HIGH); digitalWrite(5, HIGH); delay(250); digitalWrite(11,LOW); digitalWrite(12,LOW); digitalWrite(5, LOW); delay(250); }

  为了让游戏变的好玩,我们让游戏的开始时间变得不确定,引入了随机数。这样在每局结束后都会产生一个新的随机数,让这个随机数作为等待时间,这样让两方的博弈更加精彩。

  Serial.println("READY~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
  int ran = random(1000,10000); // 随机时间1s到10s不确定
  Serial.println(ran);
  delay(ran);
  digitalWrite(5, HIGH); // 灯亮作为比赛开始的标志
  Serial.println("FIRE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");

  当中间灯亮时,比赛开始!承接文章开始处。

        

项目分析思路:

利用arduino模拟西部牛仔对决的游戏

  1. 如何判断双方的输赢? -> 按键按下的快慢 -> arduino板,按键
  2. 如何设置提示信息? -> 通过灯光提示 -> LED
  3. 如何增加用户的参与度和耐玩性? ->

      ① 加入随机等待时间 -> 代码

      ② 将按键独立出去模拟枪的扳机 -> 初步设计外壳模板

  1. 如何增强交互提示信息? -> 通过声音提示 -> 加入ISD1820声音采集模块
  2. 如何判断对局结束标志 -> 通过灯光闪烁提示 -> 代码
  3. 如何实现产品原型 -> 采用分体式结构 -> 深入外壳设计,建模,3d打印,功能装载

  

执行逻辑:

  1. 当前对局开始
  2. 记录当前时间戳
  3. 进入循环记录程序
  4. 记录按键按下的时间,触发枪声提示信息
  5. 记录两个按键按下的时间差,如果没有记录到返回上一步,如果记录完成进入下一步
  6. 延迟等待判定结果
  7. 判断程序:如果左边时间用的短,左边获胜同时左灯亮,否则右边获胜(右边亮)
  8. 延迟等待程序
  9. 关闭灯光判定,准备进入下一轮
  10. 当前对局结束提示(三个灯光同时闪烁3秒)
  11. 延迟等待随机时间程序
  12. 等待时间完成,触发声音(fire)提示信息
  13. 进入下一轮比赛

 

        这里我们还有很多没有加上去,因为时间不是很够。比如说像原版游戏,如果中间是个彩灯,必须在某某颜色的灯亮时才算开始,这样我们就可以亮起其他颜色的灯迷惑双方。还比如说,如果谁在还没有开始,或者灯亮错了的情况下开枪,我们就判断这位选手失败。等等,迫于时间压力我们只好停手。

        总结来说,刚开始我提议做这个还是比较难得,因为不知道怎么样写代码,但是到了后来一步步解决问题,最后我们团队将模型做好,电路接好交上去的时候还是很激动的。最后,还得感谢我们亲爱的组员,没有你们产品无法落地。

 

 

posted @ 2019-12-08 21:10  CRboyfriend  阅读(535)  评论(0)    收藏  举报