我是一名三年级学生,今年开始的第一个arduino课程-我在执行for循环时遇到了延迟和不停止程序的问题。我的任务是在chrome中创造一款类似于恐龙的游戏,问题是当我想要将每个循环分开100毫秒的时间让仙人掌向侧面移动时。有人能帮帮我吗?:)
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// punktacja
int score = 0;
int lastScore = 0;
// czy gracz wygral?
bool won = false;
// zmienna do lcd clear po zwycięstwie
bool blocker = true;
int buttonPin = 6;
int buttonState = 0;
// Obliczanie czasu do spawnu obstacli
//unsigned long aktualnyCzas = millis();
//unsigned long zapamietanyCzas = 0;
//unsigned long roznicaCzasu = 0;
byte dino[8] = {
0b00000,
0b00111,
0b00111,
0b10110,
0b11111,
0b01010,
0b01010,
0b00000
};
byte cactus[8] = {
0b00100,
0b00101,
0b10101,
0b10101,
0b10111,
0b11100,
0b00100,
0b00000
};
byte stone[8] = {
0b00000,
0b00100,
0b01110,
0b01110,
0b01110,
0b11111,
0b11111,
0b11111
};
byte clear[8] = {
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
void setup() {
pinMode(buttonPin, INPUT);
lcd.begin(16, 2);
lcd.setCursor(11, 0);
lcd.print("s:");
lcd.createChar(0, dino);
lcd.createChar(1, cactus);
lcd.createChar(2, stone);
lcd.createChar(9, clear);
}
void loop() {
//Obliczanie czasu
//aktualnyCzas = millis();
// Odczyt z guzika
buttonState = digitalRead(buttonPin);
//Główna pętla gry
if(won == false)
{
// Spawn kamieni
if(lastScore < score - 5)
{
lastScore = score;
for(int i = 15; i >= 0; i--)
{
SpawnStone(i);
wait(100);
}
}
// Punktacja
score = millis() / 100;
lcd.setCursor(13, 0);
lcd.print(score);
if(buttonState == HIGH)
{
JumpDino();
}
else if (buttonState == LOW)
{
SpawnDino();
}
}
//LCD Clear po wygranej
if(score == 1000 && blocker == true)
{
blocker = false;
lcd.clear();
}
//Informacja o zwycięstwie
if(score > 999)
{
won = true;
lcd.setCursor(0, 0);
lcd.print("YOU WON!");
return;
}
}
void SpawnDino()
{
lcd.setCursor(0,1);
lcd.write(byte(0));
lcd.setCursor(0,0);
lcd.write(byte(9));
}
void JumpDino()
{
lcd.setCursor(0,0);
lcd.write(byte(0));
lcd.setCursor(0,1);
lcd.write(byte(9));
}
int SpawnStone(int i)
{
lcd.setCursor(i,1);
lcd.write(byte(2));
lcd.setCursor(i+1,1);
lcd.write(byte(9));
}
void wait(long duration)
{
int wait = 0;
long last = millis();
while (wait == 0)
{
long now = millis();
if (now - last >= duration)
{ wait = 1;}
else {}
}
}
@Edit
我试过了:
int SpawnStone(int i)
{
if(actualTime - rememberTime > differenceTime)
{
rememberTime = actualTime;
lcd.setCursor(i,1);
lcd.write(byte(2));
lcd.setCursor(i+1,1);
lcd.write(byte(9));
SpawnStone(i-1);
}
}
但它只是让我的石头出现在这样的开始帧(
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// punktacja
int score = 0;
int lastScore = 0;
// czy gracz jeszcze gra
bool isPlaying = false;
// zmienna do lcd clear po zwycięstwie
bool blocker = true;
int buttonPin = 6;
int buttonState = 0;
// Obliczanie czasu do spawnu obstacli
long actualTime = 0;
long rememberTime = 0;
long differenceTime = 100;
int checkScore;
int stonePosition;
byte dino[8] = {
0b01111,
0b01111,
0b00111,
0b10110,
0b11111,
0b01010,
0b01010,
0b01011
};
byte stoneDown[8] = {
0b00000,
0b00100,
0b01110,
0b01110,
0b01110,
0b11111,
0b11111,
0b11111
};
byte clear[8] = {
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
void setup() {
Serial.begin(9600);
checkScore = 0;
pinMode(buttonPin, INPUT);
lcd.begin(16, 2);
lcd.setCursor(11, 0);
lcd.print("s:");
rememberTime = millis();
differenceTime = 100;
lcd.createChar(0, dino);
lcd.createChar(2, stoneDown);
lcd.createChar(9, clear);
stonePosition = 15;
}
void loop() {
//Obliczanie czasu
actualTime = millis();
// Odczyt z guzika
buttonState = digitalRead(buttonPin);
//Główna pętla gry
if(isPlaying == false)
{
// Dodatkowy poziom trudności
if(score >= 1 && score <= 99)
{
differenceTime = 100;
}
if(score >= 100 && score <= 199)
{
differenceTime = 50;
lcd.setCursor(2, 0);
lcd.print("Faster!");
}
if(score >= 200 && score <= 299)
{
differenceTime = 30;
lcd.setCursor(2, 0);
lcd.print("FASTER!");
}
// Obsługa guzika
if(buttonState == HIGH)
{
JumpDino();
}
else if (buttonState == LOW)
{
SpawnDino();
}
// Spawn kamieni
if(actualTime - rememberTime >= differenceTime)
{
rememberTime = actualTime;
stonePosition--;
SpawnStone(stonePosition);
if(stonePosition < 0)
{
stonePosition = 15;
}
}
// Punktacja
score = millis() / 100;
lcd.setCursor(13, 0);
lcd.print(score);
}
//LCD Clear po wygranej
if(score == 301 && blocker == true)
{
blocker = false;
lcd.clear();
}
//Informacja o zwycięstwie lub porażce
if(stonePosition == 0 && buttonState == LOW)
{
isPlaying = true;
lcd.setCursor(0, 0);
lcd.print("YOU LOST!");
return;
}
if(score > 300)
{
isPlaying = true;
lcd.setCursor(0, 0);
lcd.print("YOU WON!");
return;
}
}
// Dinozaur na dole lub u góry
void SpawnDino()
{
lcd.setCursor(0,1);
lcd.write(byte(0));
lcd.setCursor(0,0);
lcd.write(byte(9));
}
void JumpDino()
{
lcd.setCursor(0,0);
lcd.write(byte(0));
if(stonePosition != 0)
{
lcd.setCursor(0,1);
lcd.write(byte(9));
}
}
// Spawn kamieni - funkcja
int SpawnStone(int i)
{
lcd.setCursor(i,1);
lcd.write(byte(2));
lcd.setCursor(i+1,1);
lcd.write(byte(9));
}
我对所有的时间旅行者都这样做了。希望你喜欢:)