Проект Simon Says — невозможно перейти от случайных источников света к пользовательскому вводу.

input

Я новичок в использовании Arduino и пытаюсь сыграть в игру Simon Says. Прямо сейчас я не понимаю, почему моя программа не перейдет от активации случайных огней к пользовательскому вводу. В настоящее время он мигает всеми индикаторами три раза, как я хочу, но затем он будет мигать тремя случайными индикаторами, а затем сразу начнет мигать всеми индикаторами, справа налево (что является индикатором того, что была нажата неправильная кнопка).

Я работаю в Tinkercad/circuits.io и проверил физическую реализацию, и она в порядке. Я просто не могу понять код. Что-нибудь поможет, спасибо!

// Определение светодиодов и кнопок.
int leds[] = {12, 10, 7, 4};
int buttons[] = {11, 9, 6, 3};

const int max = 40;
int lightArr[max]; // Массив с полным набором светодиодов.
int currArr[max];
int gameState = 0;
int level = 1;
int count = 0; // Счетчик для каждой последовательности перебора
random array of ints (LEDs).
int buttonPressed = -1;
int correct = 1;

void setup() {
  pinMode(leds[0], OUTPUT);
  pinMode(leds[1], OUTPUT);
  pinMode(leds[2], OUTPUT);
  pinMode(leds[3], OUTPUT);
  pinMode(buttons[0], INPUT);
  pinMode(buttons[1], INPUT);
  pinMode(buttons[2], INPUT);
  pinMode(buttons[3], INPUT);
  randomSeed(analogRead(0));
  allOn();
}

void loop() {
  if (gameState == 0) {
    resetGame();
  } else if (gameState == 1) {
    play();
  } else if (gameState == 2) {
    gameOver(); 
  } 
}

void resetGame() {
  if (level == 1) {
  // Настройка последовательности случайных источников света.
    for (int i = 0; i < 40; i++) {
      lightArr[i] = random(0,4);
    }
  }
  level = 1; 
  gameState = 1;
}

void play() {
  while (correct == 1) {
    showPattern();
    int correct = userInput();
  }
}

void showPattern() {
  for (int i = 0; i < level; i++) {
    delay(500);
    digitalWrite(leds[lightArr[i]], 1);
    delay(500);
    digitalWrite(leds[lightArr[i]], 0);
    delay(500);
  }
}

int userInput() {
  for (int i = 0; i < level; i++) {
    int buttonPressed = readOneButton();
    digitalWrite(leds[buttonPressed], 1);
    delay(500);
    digitalWrite(leds[buttonPressed], 0);
    delay(500);
    if (lightArr[i] != buttonPressed) {
      // Пользовательская кнопка нажата.
      gameState = 2;
      correct = 0;
    }
  }
}

void gameOver() {
  for (int i = 0; i < 3; i++) {
    digitalWrite(leds[0], 1);
    delay(150);
    digitalWrite(leds[0], 0);  
    delay(150);
    digitalWrite(leds[1], 1);
    delay(150);
    digitalWrite(leds[1], 0);
    delay(150);
    digitalWrite(leds[2], 1);
    delay(150);
    digitalWrite(leds[2], 0);
    delay(150);
    digitalWrite(leds[3], 1);
    delay(150);
    digitalWrite(leds[3], 0);
    delay(150);
  }
  gameState = 0;
}

int readOneButton() {
  if (digitalRead(buttons[0])) {
    return 0; // Кнопка: красная
  } else if (digitalRead(buttons[1])) {
    return 1; // Кнопка: зеленая
  } else if (digitalRead(buttons[2])) {
    return 2; // Кнопка: синяя
  } else if (digitalRead(buttons[3])) {
    return 3; // Кнопка: желтая
  }
}

void allOn() {
  for (int i = 0; i < 3; i++) {
    digitalWrite(leds[0], 1);
    digitalWrite(leds[1], 1);
    digitalWrite(leds[2], 1);
    digitalWrite(leds[3], 1);
    delay(500);               
    digitalWrite(leds[0], 0);       
    digitalWrite(leds[1], 0);        
    digitalWrite(leds[2], 0);         
    digitalWrite(leds[3], 0);
    delay(500);
  }
}

, 👍0


1 ответ


Лучший ответ:

0
void play() {
  while (correct == 1) {
    showPattern();
    int correct = userInput();
  }
}

Почему вы создаете новую переменную с именем correct и помещаете в нее значение из формы userInput? Почему бы вам не поместить возврат от userInput в переменную с именем correct, которая у вас уже есть? Две переменные с одним и тем же именем в одной области действия НИКОГДА не являются хорошей идеей. Первоначальный правильный никогда не будет изменен здесь, так что это становится бесконечным циклом.

Далее посмотрите на readOneButton. Arduino потребуется всего несколько микросекунд, чтобы выполнить цикл for и всю функцию userInput. Если вы не будете супер-пупер быстро нажимать эту кнопку, он просто решит, что вы не нажимали никаких кнопок. У вас нет случая, чтобы кнопка не была нажата, поэтому он вернет 0. Вероятно, вам следует подождать, пока пользователь не нажмет кнопку, прежде чем решить, прав он или нет.

,