Назад

Создаем игру Simon Says на Arduino с Velxio

Введение

Помните классическую игру Simon Says? Это идеальный проект для изучения массивов, конечных автоматов и обработки пользовательского ввода на Arduino. В этом руководстве мы создадим полнофункциональную игру Simon Says с использованием четырех светодиодов и четырех кнопок, полностью смоделированную прямо в вашем браузере с помощью Velxio. Никакого оборудования не требуется!

Схема подключения Simon Says на симуляторе Velxio

Обзор схемы

Давайте рассмотрим компоненты и то, как они подключены.

Компоненты

КомпонентIDНазначение
Arduino Unoarduino-unoМозг игры
Красный светодиодled-redВывод для красной последовательности
Зеленый светодиодled-greenВывод для зеленой последовательности
Синий светодиодled-blueВывод для синей последовательности
Желтый светодиодled-yellowВывод для желтой последовательности
Красная кнопкаbutton-redВвод пользователя для красного
Зеленая кнопкаbutton-greenВвод пользователя для зеленого
Синяя кнопкаbutton-blueВвод пользователя для синего
Желтая кнопкаbutton-yellowВвод пользователя для желтого

Подключение

Анод (A) каждого светодиода подключается к цифровому выводу Arduino, а катод (C) — к GND через токоограничивающий резистор (симулируется внутренне). Кнопки подключаются одним контактом (1.l) к цифровому выводу, а другим контактом (2.l) к GND, используя внутренние подтягивающие резисторы Arduino.

Все соединения с землей используют общий пин GND Arduino.

Разбор кода

Откройте редактор кода в Velxio, чтобы увидеть полный скетч.

Исходный код Simon Says в редакторе Monaco от Velxio

Константы и переменные

const int LED_PINS[] = {8, 9, 10, 11};
const int BUTTON_PINS[] = {2, 3, 4, 5};
const int NUM_LEDS = 4;

int sequence[100];
int sequenceLength = 0;
int currentStep = 0;

Мы определяем массивы для пинов светодиодов и кнопок, соответствующие схеме подключения. sequence хранит случайный шаблон (до 100 шагов). sequenceLength отслеживает, сколько шагов игрок должен повторить, а currentStep отслеживает прогресс игрока.

Настройка

void setup() {
  Serial.begin(9600);

  for (int i = 0; i < NUM_LEDS; i++) {
    pinMode(LED_PINS[i], OUTPUT);
    pinMode(BUTTON_PINS[i], INPUT_PULLUP);
  }

  randomSeed(millis());
  newGame();
}

Мы устанавливаем пины светодиодов как выходы, а пины кнопок как входы с внутренней подтяжкой (поэтому кнопки читаются как LOW при нажатии). randomSeed(millis()) гарантирует разную последовательность в каждой игре. newGame() запускает первый раунд.

Игровая логика

newGame() сбрасывает длину последовательности до 1, добавляет случайный шаг и воспроизводит последовательность.

void newGame() {
  sequenceLength = 1;
  currentStep = 0;
  addToSequence();
  playSequence();
}

void addToSequence() {
  sequence[sequenceLength - 1] = random(0, NUM_LEDS);
}

void playSequence() {
  for (int i = 0; i < sequenceLength; i++) {
    flashLED(sequence[i]);
    delay(500);
  }
}

void flashLED(int led) {
  digitalWrite(LED_PINS[led], HIGH);
  delay(300);
  digitalWrite(LED_PINS[led], LOW);
}

playSequence() проходит по сохраненной последовательности, зажигая каждый светодиод на 300 мс с интервалом 500 мс.

Основной цикл

void loop() {
  for (int i = 0; i < NUM_LEDS; i++) {
    if (digitalRead(BUTTON_PINS[i]) == LOW) {
      flashLED(i);

      if (i == sequence[currentStep]) {
        currentStep++;
        if (currentStep == sequenceLength) {
          delay(1000);
          sequenceLength++;
          currentStep = 0;
          addToSequence();
          playSequence();
        }
      } else {
        // Неправильная кнопка - игра окончена
        for (int j = 0; j < 3; j++) {
          for (int k = 0; k < NUM_LEDS; k++) {
            digitalWrite(LED_PINS[k], HIGH);
          }
          delay(200);
          for (int k = 0; k < NUM_LEDS; k++) {
            digitalWrite(LED_PINS[k], LOW);
          }
          delay(200);
        }
        newGame();
      }

      delay(300);
      while (digitalRead(BUTTON_PINS[i]) == LOW);
    }
  }
}

Цикл постоянно проверяет все кнопки. Когда кнопка нажата (LOW), он зажигает соответствующий светодиод. Если нажатая кнопка совпадает с ожидаемым шагом (sequence[currentStep]), мы продвигаемся дальше. Если игрок завершает последовательность, мы добавляем новый шаг и воспроизводим более длинную последовательность. Если ошибка, все светодиоды мигают три раза, и начинается новая игра.

Ключевые концепции

Частые ошибки и советы по отладке

Предлагаемые расширения

Попробуйте сами!

Готовы играть? Откройте живой пример на Velxio и запустите симуляцию. Нажимайте кнопки, чтобы повторить последовательность. Как далеко вы сможете зайти?

Запустить Simon Says на Velxio

Удачного конструирования!


Поделиться:
David Montero

Автор

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

Похожие статьи


Предыдущая статья
Демонстрация TFT-дисплея ILI9341: графика и анимация мяча на Arduino
Следующая статья
Циклическая смена цветов RGB-светодиода с Arduino на Velxio