欢迎回到勤奋博客!
在某种程度上,我们都玩过“西蒙说”游戏。在这款游戏中,一个人,Simon(或Susan、Chad或任何碰巧是领导者的人)会说“Simon说”,然后告诉所有其他玩家做一些事情,比如举起左手。这款游戏的陷阱是,如果领导者让其他玩家做某事而不说“Simon说”,而其他玩家不管怎样都做了,那么他们就出局了。我个人非常喜欢玩《Simon Says》,但我觉得如果你能在一堆led灯下玩《Simon said》会更有趣……
这就是我所做的。使用一组9个led, 2个PmodBTNs(每个上有四个用户按钮),一个额外的按钮,一个移位寄存器,我能够创建Simon Says,它就像我希望的那样有趣。理所当然,chipKIT uC32我设计的游戏总是让Simon按下按钮让led以uC32所创造的模式亮起来,这并不是一种高强度的有氧运动,但我觉得这很好。
一些你可能感兴趣的是如何我做游戏工作以及游戏用户猜原始模式相比,如何玩这个游戏的人知道如果他们得到了答案正确与否,以及单片机想出了如何首先随机模式。
在用户猜测和led的原始模式之间的比较是通过两个数组.一个数组跟踪uC32生成的数字,这些数字对应于图案中点亮的led。另一组类似地跟踪哪个LED通过玩家按下相应的按钮被点亮。当玩家按照正确的顺序点亮LED后,他们按下最左边的独立按钮,点亮唯一的黄色LED,从而提交他们的“最终答案”。
uC32然后逐个比较这两个数组,看看它们是否匹配。如果数组匹配,四个绿色led就会闪烁几次,向玩家表明他们的模式是正确的,他们需要匹配的模式长度增加1。
然而,如果两个阵列不匹配,红色LED将闪烁,图案的长度返回到只有一个LED。为了确保这两个数组不会意外地以某种方式不同,在显示一个新的led模式(任意长度)之前,数组的值都在内部被重置为所有零。
但微控制器是如何产生“随机”模式的呢?电子芯片,如PIC32芯片来自微芯片,没有任何方法可以任意得出某种数字,但uC32上的芯片有一个很长的数字序列。这个数字序列是通过random()函数访问的,该函数根据您给它的边界选择一个数字。例如,对于可以点亮的8个led, random()函数被写成random(1,9)来选择1到8之间的一个数字。random()函数中给出的上限被假定为比random()函数的期望输出范围大1。
虽然这很好,但我们会发现,每次我们玩Simon Says时,点亮的led的模式总是相同的,因为random()从中提取的数字序列总是相同的。为了解决这个问题并让游戏更“随机”,我们可以在使用random()函数之前调用randomSeed()函数。RandomSeed()将根据我们给它的值告诉微控制器从哪里开始从数字序列中提取数字。因此,我们可以让randomSeed()根据微控制器上一个I/O引脚的模拟噪声获得一个值,让我们从random()函数的数字序列的“随机”位置开始。
然而,根据我的经验,针上的电噪声往往被限制在一个非常小的数字范围内,例如0到5,这不是我想要的任意范围。因此,我让randomSeed()从函数millis()收集它的编号,该函数报告持续近50天的连续运行时间计数器上的值。通过使用millis(), random()函数从其中提取其值本质上取决于玩家提交答案所需的时间。假设玩家是人类而不是另一个微控制器,这种方法可以保证每次玩游戏时都会选择数字序列中的不同位置。
你可以在下面的文本文件中获得我用于游戏的代码(右键点击它可以在新标签中打开它)。如果你想要更多关于如何创建电路本身的指导,请随意查看我的Instructable for it here。我还在下面提供了一个链接,链接到我的项目代码。
继续回到Digilent博客,看看在Digilent这里总是发生的其他很酷的事情!

“西蒙说……用led灯!”