Você acha que tem boa memória? Que tal testar suas habilidades e ainda aprender a montar um projeto usando Arduino? Se está disposto, você irá aprender aqui como montar o jogo “Genius” no Arduino!
Já conhecia esse jogo antes? Se não, aqui está uma explicação rápida. Basicamente, o jogo consiste em memorizar uma sequência de cores que irão piscar aleatoriamente. No início, apenas uma cor irá piscar, mas, a cada rodada, mais uma cor é adicionada a sequência, tornando cada vez mais difícil para o jogador guardar a ordem das cores.
Eu mesmo tentei conseguir a maior pontuação possível nesse jogo. Será que você consegue bater meu recorde? Leia o post até o final e confira!
Os materiais utilizados nesse projeto são os seguintes:
A montagem do projeto está representada a seguir:
O código utilizado nesse projeto foi o seguinte:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 | #include <LiquidCrystal.h> // Definição de variáveis #define buz 7 #define ledG 8 #define ledR 9 #define ledY 10 #define ledB 13 #define pushG A0 #define pushR A1 #define pushY A2 #define pushB A3 // Declaração das variáveis do Display LCD LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { // Declaração dos pinos usados pinMode(pushG, INPUT); pinMode(pushR, INPUT); pinMode(pushY, INPUT); pinMode(pushB, INPUT); pinMode(ledG, OUTPUT); pinMode(ledR, OUTPUT); pinMode(ledY, OUTPUT); pinMode(ledB, OUTPUT); pinMode(buz, OUTPUT); randomSeed(analogRead(0)); // Garante que os números serão aleatórios quando o jogo é reiniciado } void loop() { lcd.begin(16, 2); int inicio = 1; // Botão de iniciar lcd.print("Vamos jogar?"); // Escreve no LCD // Inicia o jogo quando o botão do led verde for pressionado while(inicio!=1023){ // Como os botão estão ligados em portas analógicas, quando eles são pressionados, o valor de retorno é 1023 inicio = analogRead(pushG); // Lê o botão digitalWrite(ledG, HIGH); // Liga leds digitalWrite(ledR, HIGH); digitalWrite(ledY, HIGH); digitalWrite(ledB, HIGH); } lcd.clear(); // Apaga LCD digitalWrite(ledG, LOW); // Apaga leds digitalWrite(ledR, LOW); digitalWrite(ledY, LOW); digitalWrite(ledB, LOW); delay(1000); // Pausa de 1 segundo int acertou = 1; // Variável usada para determinar se o jogador acertou a sequência de cores ou não int luzes[200]; // Variável para guardar a sequência de cores int quant = 0; // Quantidade de cores na sequência int pont = 0; // Pontuação do jogador while(acertou == 1){ // Enquanto o jogador continuar acertando... // Escreve no LCD a pontuação do jogador lcd.print("Taca-lhe pau!!"); lcd.setCursor(0,1); lcd.print("Pontuacao: "); lcd.print(pont); lcd.setCursor(0,0); luzes[quant] = random(1, 5); // Escolhe aleatoriamente qual luz será a próxima a acender quant = quant + 1; // Adiciona 1 a quantidade de cores na sequência for(int i = 0; i < quant; i++){ // Loop para acender a sequência de luzes uma a uma if(luzes[i] == 1){ // Verifica se é esta a luz que deve acender digitalWrite(ledG, HIGH); // Se sim, liga o led correspondente tone(buz, 262, 500); // Toca o buzzer na frequência pré-determinada para essa cor delay(500); digitalWrite(ledG, LOW); // Depois de um tempo, apaga a luz delay(200); } // A mesma lógica é implementada para as demais luzes if(luzes[i] == 2){ digitalWrite(ledR, HIGH); tone(buz, 294, 500); delay(500); digitalWrite(ledR, LOW); delay(200); } if(luzes[i] == 3){ digitalWrite(ledY, HIGH); tone(buz, 330, 500); delay(500); digitalWrite(ledY, LOW); delay(200); } if(luzes[i] == 4){ digitalWrite(ledB, HIGH); tone(buz, 349, 500); delay(500); digitalWrite(ledB, LOW); delay(200); } } int aux = 0; // Variável para apontar qual luz deve acender dentro do vetor int terminou = 0; // Variável para verificar se o jogador já terminou a sequência de luzes while(terminou == 0 && acertou == 1){ // Enquanto ainda faltarem luzes para serem pressionadas e o jogador ainda não tiver perdido... int pg = analogRead(pushG); // Lê o botões de cada luz int pr = analogRead(pushR); int py = analogRead(pushY); int pb = analogRead(pushB); if(pg == 1023){ // Se o botão dessa luz for pressionado... digitalWrite(ledG, HIGH); // O led acende tone(buz, 262, 500); // O buzzer toca if(luzes[aux] == 1){ // Verifica se o jogador acertou a luz correta aux++; // Se sim, a próxima luz é apontada } else{ acertou = 0; // Se não, o jogador errou } while(pg == 1023){pg = analogRead(pushG);} // Enquanto o jogador estiver pressionando o botão da luz, o programa estaciona nesse ponto delay(500); digitalWrite(ledG, LOW); // A luz se apaga delay(500); } // A mesma lógica é implementada para todas as luzes if(pr == 1023){ digitalWrite(ledR, HIGH); tone(buz, 294, 500); if(luzes[aux] == 2){ aux++; } else{ acertou = 0; } while(pr == 1023){pr = analogRead(pushR);} delay(500); digitalWrite(ledR, LOW); delay(500); } if(py == 1023){ digitalWrite(ledY, HIGH); tone(buz, 330, 500); if(luzes[aux] == 3){ aux++; } else{ acertou = 0; } while(py == 1023){py = analogRead(pushY);} delay(500); digitalWrite(ledY, LOW); delay(500); } if(pb == 1023){ digitalWrite(ledB, HIGH); tone(buz, 349, 500); if(luzes[aux] == 4){ aux++; } else{ acertou = 0; } while(pb == 1023){pb = analogRead(pushB);} delay(500); digitalWrite(ledB, LOW); delay(500); } if(aux >= quant){ // Se o jogador já terminou a sequência... terminou = 1; pont++; // Sua pontuação sobe } } } // Se o jogador errou... tone(buz, 415, 3000); // O buzzer toca numa frequência diferente das luzes // Escreve-se no LCD que o jogador errou e sua pontuação final lcd.clear(); lcd.print("ERROU!!!"); lcd.setCursor(0,1); lcd.print("Resultado: "); lcd.print(pont); delay(3000); } |
O código em si é autoexplicativo, porém acho interessante dar uma contextualização geral ao leitor. Basicamente, o código seleciona aleatoriamente uma das quatro luzes para acender, em seguida o jogador deve pressionar o botão correspondente àquela luz. Caso o jogador acerte a luz piscada, uma nova luz escolhida aleatoriamente pisca em seguida da primeira, e o jogador deve acertar a sequência de luzes novamente. O jogo continua adicionando uma nova luz a sequência até que o jogador erre, e nesse momento, o jogo se encerra e a pontuação máxima do jogador é mostrada.
Tá na hora de colocar o projeto pra rodar. Vamos ver qual foi minha maior pontuação. Será que você consegue me superar?
Espero que tenha se divertido com esse game. Exercitar a memória é fundamental, assim como exercitar seus conhecimentos sobre o Arduino, que, além de ter várias funcionalidades importantes, também pode e deve ser utilizado em momentos de descontração.
Quer aprender a desenvolver mais jogos em Arduino? Confira nosso post relacionado e descubra mais!
Gostou do post? Avalie e deixe um comentário para sabermos o que achou.
Siga-nos também no Instagram e receba informações diárias sobre Arduino e eletrônica: @eletrogate.
Até a próxima!