使用Plug-and-Make工具包构建游戏
扫描二维码
随时随地手机看文章
一个电子游戏的世界可以用Arduinos来实现。这次我尝试使用新的Plug-and-Make-Kit构建一个简单的游戏。
最近,Arduino推出了新的Plug-and-Make工具包。优点非常明显:无需焊接,无需面包板。我试了一下。
有一个简单的游戏,用七个按钮和七个led排成一个圆圈。(不幸的是,这个游戏没有名字。)唯一的规则是:每次按下一个按钮都会切换最近的三个led的状态,目标是让所有led都亮起。这里有一段介绍这个游戏的视频。使用即插即用套件,您只能获得一个包含三个按钮的模块,单个模块不可用。您可能会购买三个套件并将所有按钮模块放在一起,但这不起作用,因为每个模块都具有相同的I2C地址,从而导致地址冲突。(顺便说一下,我只有一个即插即用的工具包,因为橙色的基板已经用于其他项目,我用一块丙烯酸玻璃创建了它的副本。)因此,在一天结束时,我修改了我的计划:用户不会按下按钮,而是随机函数按下虚拟的不存在的按钮。
下一个问题是led的几何形状。像素模块甚至提供了8个按钮,但它们不是排列成一个圆圈。因此,忽略最后一个LED,并将第一个和最后一个LED视为彼此相邻,如下所示。
这样做效果很好,但是你不知道哪个虚拟按钮被按下了。简单的解决办法是:虚拟按钮旁边的LED必须闪烁。只要按下按钮,三个led就会被切换,没有问题。现在棘手的部分来了:打开或关闭LED不需要花时间。我想让它们平滑地褪色。但事实证明,与其他图形库相比,Modulino Pixel库非常差。你必须付出很多才能完成它。到目前为止,一切顺利。但游戏通常会结束。按下虚拟按钮的鬼魂怎么能给你奖励呢?我想展示彩虹在像素上移动。但与其他库相反,像素库不提供彩虹函数。所以我必须自己编码。
如果您拥有一个即插即做套件,您可以将像素模块连接到R4 WiFi,上传草图,观看闪烁的led并享受乐趣,并最终看到彩虹。
代码
/*
Version with simulated player
R4 Plug and Make Kit
place jumper in pins-6-7 to disable delays
*/
#include
ModulinoPixels strip;
const byte NUM = 7;
const byte mask = (1 << NUM) - 1;
byte state = 0;
int count;
int df; // disable delays
void setup() {
Serial.begin(9600);
Serial.println(__FILE__);
Modulino.begin();
strip.begin();
// Parameter: Index der LED, Farbe, Helligkeit
// strip.set(0, colorBlue, HELLIGKEIT);
pinMode(6, OUTPUT);
pinMode(7, INPUT_PULLUP);
df = digitalRead(7);
newGame();
}
void loop() {
df = digitalRead(7);
do {
count++;
byte k = getKey();
blink(k); // this key has been pressed
bitToggle3(k); // perform one by one
delay(1000 * df);
}
while (state != mask);
newGame();
}
byte getKey() {
static byte lastKey;
byte k;
// don't repeat yourself:
do k = random(NUM);
while (k == lastKey);
lastKey = k;
if (df == 1) {
Serial.print("key = ");
Serial.println(k);
}
return k;
}
void newGame() {
// success
if (df == 1) {
rainbow();
delay(100);
Serial.print("count = ");
}
Serial.println(count);
delay(1000 * df);
state = random(mask);
count = 0;
update(-1); // -1 = no fading
}
void blink(byte j) {
byte b = bitRead(state, j);
byte red = 255 * j;
for (byte i = 0; i < 10; i++) {
// last i must be odd
byte green;
if (i & 1) green = 0; else green = 255;
strip.set(j, ModulinoColor(red, green, 1));
strip.show();
delay(100 * df);
}
}
void bitToggle3(byte b) {
byte a = b > 0 ? b - 1 : NUM - 1;
byte c = b < NUM - 1 ? b + 1 : 0;
update(b);
update(a);
update(c);
}
void update(byte k) {
// fade changing led up or down
int b = bitRead(state, k);
float fade = 1 + b * 254; // start value
float factor = 1.25 - b * 0.5; // speed
do {
for (byte i = 0; i < NUM; i++) {
byte red = 0; // red or off
if (i == k) red = fade;
else if (bitRead(state, i)) red = 255;
strip.set(i, ModulinoColor(red, 0, 1));
}
strip.show();
delay(50 * df);
fade = min(fade * factor, 255);
}
while ((fade > 0.5) && (fade < 255));
delay(300 * df);
bitToggle(state, k);
}
void rainbow() {
const int A = 2 * 128;
const int B = 3 * 128;
const int C = 4 * 128;
const long D = 6 * 128; // long verhindert Ueberlauf
for (int i = 0; i < 10; i++) {
for (int pixno = 0; pixno < NUM; pixno++) {
int x = ((pixno + i) * D / NUM) % D;
// constrain beschraenkt auf Bereich zwischen 0 und 255
int r = constrain(abs(x - B) - 128, 0, 255);
int g = constrain(256 - abs(x - A), 0, 255);
int b = constrain(256 - abs(x - C), 0, 255);
strip.set(pixno, ModulinoColor(r, g, b));
strip.show();
}
delay(200);
}
}
本文编译自hackster.io