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.
Desafio
DifícilTransforme-o no jogo completo:
const int MAX_STEPS = 20;,int sequence[MAX_STEPS];eint 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;
}
}
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