制作 Arduino 记忆游戏
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
应用和在线服务
|
关于这个项目
你还记得游戏“西蒙”吗?很多和我同龄的人(出生在 70 年代)不得不浪费很多时间来玩它。游戏很简单,它有 4 个不同颜色的按钮,它们会依次亮起,你必须重复这个顺序。每一次,你都做对了,游戏会在最后给你一个额外的颜色的序列。
很久以前我为圣诞节买了一个,但后来我搬家搬家,搬家又搬家,所以游戏迷失在许多盒子中的一个盒子里,这些盒子从一个移动到另一个永远不会被拆开......
作为一个“成年人”,我发现了 Arduino 的乐趣,并借此机会重振了我失散已久的朋友。
本教程将向您展示如何使用 Arduino Uno、几个 LED 和电阻器以及一个相对简单的电路来制作类似的游戏。
对于初学者来说,程序本身可能有点复杂,所以我试图在代码中解释它的作用和方式。
运行此游戏的最简单方法是这样。
1) 严格按照图中所示连接电路。电线的颜色无关紧要,因此如果您用完黑色电线,那没关系。 :)
2) 将源代码粘贴到您喜欢的 Arduino 编辑器中并上传到开发板
3) 玩游戏
游戏在大约 3 秒后开始,所有 LED 灯闪烁 5 次。
如果一个或多个 LED 不闪烁,请检查接线。在我的板上,非常小的按钮并不总是正确放置,并且有弹出的倾向。
如果接线看起来正确,请尝试将正常工作的 LED 与不工作的 LED 倒置,看看是接线还是 LED 本身。
5 次闪烁完成后,一个 LED 将亮起。我不能告诉你哪个,这是一个惊喜:) 按下那个 LED 的按钮。该 LED 将再次亮起,然后是一个新的。按顺序按下正确的按钮......你看我要做什么......
然后,很快,您就会看到它们都快速闪烁。那就是你输了。 :D
将播放给您的最后一个序列,以便您可以计算您的分数,然后是之前的 5 次缓慢闪烁,表明游戏又开始了。
您有 2 秒钟的时间按下每个按钮。
你去吧!玩得开心!
想让它更难一点吗?为什么不将代码中的第一行更改为不同的值?
#define PLAYER_WAIT_TIME 2000
或者你可以添加另一个 LED,如果你有一个......为此,你首先需要重现电路的这一部分:
这里的橙色线将连接到 Arduino 上任何未使用的引脚(尽管避免 0 和 1)
然后修改代码中的以下几行:
byte noPins =4byte pin[] ={2, 13, 10, 8};
如果你在第 6 针上加了一个 LED,代码就会变成
byte noPins =5byte pin[] ={2, 13, 10, 8, 6};
编写 Arduino 代码的小技巧:
void setup() { delay(3000); Serial.begin(9600);重启(); } 代码>
将短暂延迟作为 setup() 函数的第一条语句。很容易让 Arduino 进入无限循环或以某种方式锁定它。如果发生这种情况,那么短暂的延迟允许您重置 Arduino 并在它再次锁定之前上传空白草图。 .
我最终接受了这个小想法并使其便携......
如果您想为类似(但更高级)的游戏看到一个非常酷的想法。检查这个 https://www.instructables.com/id/Lego-Mini-Memory-Game by Peter Kent。他在手机上制作了这款游戏,并带有乐高汽车的界面。真是太棒了!
代码
- 记忆游戏代码
记忆游戏代码Arduino
这是游戏的完整代码。只需将其复制并粘贴到您最喜欢的 IDE 中,然后将其上传到 Arduino。#define PLAYER_WAIT_TIME 2000 // 按钮按下之间允许的时间 - 2s 字节序列 [100]; // 存储光序列字节 curLen =0; // 当前序列字节的长度 inputCount =0; // 在给定的回合字节中玩家按下(正确)按钮的次数 lastInput =0; // 来自玩家字节的最后输入 expRd =0; // 假定由 playerbool 点亮的 LED btnDwn =false; // 用于检查按钮是否被按下bool wait =false; // 程序是否在等待用户按下按钮bool resetFlag =false; // 用于向程序表明一旦播放器丢失字节 soundPin =5; // 扬声器输出字节 noPins =4; // 按钮/LED 的数量(在处理这个问题时,我只使用了 2 个 LED)// 您可以通过添加额外的 LED/按钮/电阻器组合来使游戏更难。字节 pin[] ={2, 13, 10 , 8}; // 按钮输入引脚和 LED 输出引脚 - 如果您想将按钮连接到其他引脚,请更改这些值 // 元素数量必须与 long inputTime =0 以下的 noPins 匹配; // 用户输入之间延迟的定时器变量void setup() { delay(3000); // 这是为了让我在连接 arduino 后有时间喘口气 - 如果你想要 Serial.begin(9600); 可以删除; // 启动串行监视器。这也可以删除,只要您删除 Reset() 下对 Serial 的所有引用;}////// 根据 'dir' 的值将所有引脚设置为 INPUT 或 OUTPUT ////void setPinDirection(byte dir){ for(byte i =0; i快 |大数字 -> 慢//无效闪光(短频率){ setPinDirection(输出); /// 我们现在正在激活 LED for(int i =0; i <5; i++){ writeAllPins(HIGH);哔(50);延迟(频率); writeAllPins(低);延迟(频率); }}//////此函数将所有游戏变量重置为其默认值////void Reset(){ flash(500); CurLen =0;输入计数 =0;最后输入 =0; expRd =0; btnDwn =假;等待=假; resetFlag =false;}////// 用户丢失///void Lose(){ flash(50); }////// arduino 向用户显示必须记住的内容/// 丢失后也调用以显示您上次的序列是什么////void playSequence(){ //循环遍历存储的序列并点亮适当的LED依次为(int i =0; i PLAYER_WAIT_TIME){ // 如果玩家花费的时间超过允许的时间,DoLoseProcess(); // 一切都丢失了 :( return; } if(!btnDwn){ // expRd =sequence[inputCount]; // 找到我们期望从玩家那里得到的值 Serial.print("Expected:"); // 串行监视器输出- 如果删除上面的 Serial.begin 应该删除 Serial.println(expRd); // 串行监视器输出 - 如果删除上面的 Serial.begin for(int i =0; i
示意图
simonsays_siKds3Jmk2.fzz制造工艺