使用Plug-and-Make工具包構(gòu)建游戲
掃描二維碼
隨時(shí)隨地手機(jī)看文章
一個(gè)電子游戲的世界可以用Arduinos來(lái)實(shí)現(xiàn)。這次我嘗試使用新的Plug-and-Make-Kit構(gòu)建一個(gè)簡(jiǎn)單的游戲。
最近,Arduino推出了新的Plug-and-Make工具包。優(yōu)點(diǎn)非常明顯:無(wú)需焊接,無(wú)需面包板。我試了一下。
有一個(gè)簡(jiǎn)單的游戲,用七個(gè)按鈕和七個(gè)led排成一個(gè)圓圈。(不幸的是,這個(gè)游戲沒(méi)有名字。)唯一的規(guī)則是:每次按下一個(gè)按鈕都會(huì)切換最近的三個(gè)led的狀態(tài),目標(biāo)是讓所有l(wèi)ed都亮起。這里有一段介紹這個(gè)游戲的視頻。使用即插即用套件,您只能獲得一個(gè)包含三個(gè)按鈕的模塊,單個(gè)模塊不可用。您可能會(huì)購(gòu)買三個(gè)套件并將所有按鈕模塊放在一起,但這不起作用,因?yàn)槊總€(gè)模塊都具有相同的I2C地址,從而導(dǎo)致地址沖突。(順便說(shuō)一下,我只有一個(gè)即插即用的工具包,因?yàn)槌壬幕逡呀?jīng)用于其他項(xiàng)目,我用一塊丙烯酸玻璃創(chuàng)建了它的副本。)因此,在一天結(jié)束時(shí),我修改了我的計(jì)劃:用戶不會(huì)按下按鈕,而是隨機(jī)函數(shù)按下虛擬的不存在的按鈕。
下一個(gè)問(wèn)題是led的幾何形狀。像素模塊甚至提供了8個(gè)按鈕,但它們不是排列成一個(gè)圓圈。因此,忽略最后一個(gè)LED,并將第一個(gè)和最后一個(gè)LED視為彼此相鄰,如下所示。
這樣做效果很好,但是你不知道哪個(gè)虛擬按鈕被按下了。簡(jiǎn)單的解決辦法是:虛擬按鈕旁邊的LED必須閃爍。只要按下按鈕,三個(gè)led就會(huì)被切換,沒(méi)有問(wèn)題。現(xiàn)在棘手的部分來(lái)了:打開(kāi)或關(guān)閉LED不需要花時(shí)間。我想讓它們平滑地褪色。但事實(shí)證明,與其他圖形庫(kù)相比,Modulino Pixel庫(kù)非常差。你必須付出很多才能完成它。到目前為止,一切順利。但游戲通常會(huì)結(jié)束。按下虛擬按鈕的鬼魂怎么能給你獎(jiǎng)勵(lì)呢?我想展示彩虹在像素上移動(dòng)。但與其他庫(kù)相反,像素庫(kù)不提供彩虹函數(shù)。所以我必須自己編碼。
如果您擁有一個(gè)即插即做套件,您可以將像素模塊連接到R4 WiFi,上傳草圖,觀看閃爍的led并享受樂(lè)趣,并最終看到彩虹。
代碼
/*
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