我有一个基本上是使用LED和按钮的Whack-A-Mole游戏的功能。 LED-A点亮,用户必须按BTN-A才能将其关闭...,我们继续进行下一个LED / BTN组合。
我的电路正常工作,我可以分别打开/关闭每个LED并检测每个按钮的按下。但是,一旦进入游戏循环(见下文),我就会看到一些奇怪的行为。
我的代码如下:
void gameTwo(){
Serial.println("We are in Game 2");
playGameTwo();
//lightShowTwo();
// Set game state
int gameState = 0;
// Start counter
elapsedMillis timeElapsed;
// First LED
digitalWrite(ledB, HIGH);
while(digitalRead(btnB) != HIGH){
//Serial.print("btnBstate is: ");
//Serial.println(digitalRead(btnB));
if(digitalRead(btnB) == 1){
delay(50);
digitalWrite(ledB, LOW);
Serial.print(timeElapsed);
}
}
// Second LED
digitalWrite(ledE, HIGH);
while(digitalRead(btnE) != HIGH){
//Serial.print("btnBstate is: ");
//Serial.println(digitalRead(btnE));
if(digitalRead(btnE) == 1){
delay(50);
digitalWrite(ledE, LOW);
Serial.print(timeElapsed);
}
}
// Third LED
digitalWrite(ledF, HIGH);
while(digitalRead(btnF) != HIGH){
//Serial.print("btnBstate is: ");
//Serial.println(digitalRead(btnE));
if(digitalRead(btnF) == 1){
delay(50); // these dalays DO NOT work
digitalWrite(ledF, LOW);
Serial.print(timeElapsed);
}
}
// End Game - Publish Elapsed Time
gameState = 1;
// record user's elapsed time
int userTime = timeElapsed;
Serial.print("Game Finished - Your time was: ");
Serial.print(timeElapsed);
Serial.println(" ms!");
}
问题在于它并不总是有效。有时LED-A熄灭,有时保持点亮。
如您所见,我也尝试过添加一个小的延迟(50)也无济于事。
在while循环中检测按钮按下的最佳方法是什么。
奖金问题:我正在对游戏进行硬编码(例如LEDA,LEDB ... LEDx)。应该有一个更好的方法,也许使用数组来推动游戏序列。因为我不是程序员,所以希望您能从中获得一些指导或文章来获得更多的相关知识。谢谢。
答案 0 :(得分:1)
您可以使用while
循环播放,直到按下按钮为止。
使用数组将使它变得更加容易,这里我将一个数组用于led,另一个用于按钮。数组中的数字表示引脚。我插入了random()
函数,这将使其更具挑战性。每个循环都为led[]
接受一个随机ledPin,为btn[]
接受一个对应的btnPin。
//suppose that the button in pin 4 is for led in pin 1
//the button in pin 5 is for led in pin 2
//and the button in pin 6 is for led in pin 3
int led[] = {1, 2, 3};
int btn[] = {4, 5, 6};
int count = 3;
int ledPin = 0;
int btnPin = 0;
int previous = 0;
void setup() {
for( ledPin=0; ledPin<count; ledPin++ ){
pinMode(led[ledPin], OUTPUT);
}
}
void loop() {
ledPin = random(1, 4); //pick a random number 1-3
while( ledPin == previous ){ //if it is the same as previous, change it
ledPin = random(3); }
btnPin = ledPin + 3; //btnPin set to 4-6
digitalWrite(led[ledPin], HIGH);
while( digitalRead(btn[btnPin]) == LOW ){} //or HIGH according to pulling method
digitalWrite(led[ledPin],LOW);
previous = ledPin;
}