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模拟西部牛仔对决的游戏
- 如何判断双方的输赢? -> 按键按下的快慢 -> arduino板,按键
- 如何设置提示信息? -> 通过灯光提示 -> LED灯
- 如何增加用户的参与度和耐玩性? ->
① 加入随机等待时间 -> 代码
② 将按键独立出去模拟枪的扳机 -> 初步设计外壳模板
- 如何增强交互提示信息? -> 通过声音提示 -> 加入ISD1820声音采集模块
- 如何判断对局结束标志 -> 通过灯光闪烁提示 -> 代码
- 如何实现产品原型 -> 采用分体式结构 -> 深入外壳设计,建模,3d打印,功能装载
执行逻辑:
- 当前对局开始
- 记录当前时间戳
- 进入循环记录程序
- 记录按键按下的时间,触发枪声提示信息
- 记录两个按键按下的时间差,如果没有记录到返回上一步,如果记录完成进入下一步
- 延迟等待判定结果
- 判断程序:如果左边时间用的短,左边获胜同时左灯亮,否则右边获胜(右边亮)
- 延迟等待程序
- 关闭灯光判定,准备进入下一轮
- 当前对局结束提示(三个灯光同时闪烁3秒)
- 延迟等待随机时间程序
- 等待时间完成,触发声音(fire)提示信息
- 进入下一轮比赛
这里我们还有很多没有加上去,因为时间不是很够。比如说像原版游戏,如果中间是个彩灯,必须在某某颜色的灯亮时才算开始,这样我们就可以亮起其他颜色的灯迷惑双方。还比如说,如果谁在还没有开始,或者灯亮错了的情况下开枪,我们就判断这位选手失败。等等,迫于时间压力我们只好停手。
总结来说,刚开始我提议做这个还是比较难得,因为不知道怎么样写代码,但是到了后来一步步解决问题,最后我们团队将模型做好,电路接好交上去的时候还是很激动的。最后,还得感谢我们亲爱的组员,没有你们产品无法落地。






浙公网安备 33010602011771号