Menu
CoddyTech

Simon: O Jogo Completo

Parte da seção Projetos do Journey de Arduino da Coddy. Lição 16 de 24.

O Simon de verdade começa pequeno e vai crescendo. A rodada 1 toca uma cor. Cada vez que você repete uma rodada corretamente, o tabuleiro mantém as mesmas cores e adiciona mais uma no final, até você cometer um erro.

O array precisa de espaço para uma partida longa e de uma variável length para indicar quanto dele está sendo usado. Adicionar uma cor são duas linhas:

sequence[length] = random(4);
length++;

Use uma semente uma única vez, quando o jogo começar. playSequence() agora toca length cores em vez de quatro, e uma rodada termina quando step chega a length.

Um erro encerra o jogo com um som que claramente não é uma nota, de 110 Hz por um segundo, e exibe a pontuação: as rodadas concluídas, length - 1, já que a rodada perdida não conta.

O array tem 20 posições e o sketch nunca deve escrever além do seu fim, então um jogador que repita 20 cores vence.

challenge icon

Desafio

Difícil

Transforme-o no jogo completo:

  • const int MAX_STEPS = 20;, int sequence[MAX_STEPS]; e int length = 0;
  • um jogo começa com uma cor; cada rodada repetida corretamente adiciona uma cor e reproduz a sequência inteira
  • um erro: 110 Hz por 1000 ms, depois imprima Game over! Score: e a pontuação, e encerre o jogo
  • 20 cores repetidas corretamente: imprima You win! e encerre o jogo

Pressione Executar, veja até onde você consegue chegar e depois Verificar.

Experimente você mesmo

// Uma entrada por cor: vermelho, verde, azul, amarelo
const int ledPins[4] = {9, 10, 11, 12};
const int buttonPins[4] = {2, 3, 4, 5};
const int notes[4] = {262, 330, 392, 523};  // C, E, G e C agudo
const int buzzerPin = 8;

int lastState[4] = {HIGH, HIGH, HIGH, HIGH};  // a última leitura de cada botão

int sequence[4];       // as cores que a placa reproduz
bool playing = false;  // false até que um toque inicie o jogo
int step = 0;          // quantas cores o jogador repetiu

// Acenda a cor i e toque sua nota.
void lightOn(int i) {
  digitalWrite(ledPins[i], HIGH);
  tone(buzzerPin, notes[i]);
}

// Apague a cor i e pare o som.
void lightOff(int i) {
  digitalWrite(ledPins[i], LOW);
  noTone(buzzerPin);
}

// Reproduza a sequência: cada cor por 400 ms, seguida de 200 ms de silêncio.
void playSequence() {
  delay(500);
  for (int i = 0; i < 4; i++) {
    lightOn(sequence[i]);
    delay(400);
    lightOff(sequence[i]);
    delay(200);
  }
}

// Escolha uma nova sequência aleatória e reproduza-a.
void startGame() {
  randomSeed(micros());
  for (int i = 0; i < 4; i++) {
    sequence[i] = random(4);
  }
  playing = true;
  step = 0;
  playSequence();
}

// O jogador soltou o botão da cor i: ela é a próxima na sequência?
void checkPress(int i) {
  if (i != sequence[step]) {
    Serial.println("Wrong!");
    playing = false;
    return;
  }
  step++;
  if (step == 4) {
    Serial.println("Well done!");
    playing = false;
  }
}

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(ledPins[i], OUTPUT);
    pinMode(buttonPins[i], INPUT_PULLUP);
  }
  Serial.begin(9600);
}

void loop() {
  for (int i = 0; i < 4; i++) {
    int state = digitalRead(buttonPins[i]);
    if (state == LOW && lastState[i] == HIGH) {  // pressionado
      lightOn(i);
    }
    if (state == HIGH && lastState[i] == LOW) {  // soltou
      lightOff(i);
      if (playing == false) {
        startGame();
      } else {
        checkPress(i);
      }
    }
    lastState[i] = state;
  }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Projetos

Pratique por conta própria: Playground de Arduino