Jogo simples, com memória de melhor jogada e contagem de pontos.
Vídeo demonstrativo abaixo:
Pressione qualquer tecla e mantenha pressionada até que o computador faça a jogada. Repita a jogada o quanto puder. A jogada mais extensa é gravada na EEPROM e exibida como recorde no LCD.
Para Limpar a memoria, pressione as chaves 0 e 4 (as das extremidades) e, mantendo-as pressionadas, reinicie o Arduino, ate ouvir um beep e aparecer a mensagem de limpeza da memoria.
Abaixo o código, com métodos de som (utilizando buzzer).
Led's ligados às saídas A0 ~ A3 (constantes no código 14 aé 17) e chaves ligadas às entradas 6 ~ 9 (constantes no código 6 até 9);
Abaixo, diagrama de ligação:
Código Fonte:
/*
Jogo Simon para Arduino
Para iniciar, pressione e matenha pressionada qualquer tecla.
Para recomeçar pressione RESET
Para Limpar a memoria, pressione e mantenha pressionada as teclas
1 e 4, ate ouvir o beep.
*/
//Adiciona biblioteca para Cristal Liquido
#include <LiquidCrystal.h>
//Adiciona biblioteca para EEPROM
#include <EEPROM.h>
//Configura pinos ligados ao display LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//Quantidade de jogadas maxima
const int JOGADAS_SIZE = 100;
//Velocidade dos leds durante exibicao inicial
const int DELAY_APRESENTACAO = 150;
//
//Teclas
const int key1 = 6;
const int key2 = 7;
const int key3 = 8;
const int key4 = 9;
//
//Leds
const int led1 = A0; //14
const int led2 = A1; //15
const int led3 = A2; //16
const int led4 = A3; //17
//
//Pino ligado ao Buzzer
const int pin10 = 10;
//
//Tons emitidos pelo buzzer
const int som1 = 50;
const int som2 = 100;
const int som3 = 150;
const int som4 = 200;
//
//Vetor de jogadas do computador
int cpu[JOGADAS_SIZE]; //quantidade de jogadas
int tempoNivel = 250; //velocidade do jogo
//Variave de controle da jogada atual
int jogadaAtual = 0;
//Recorde
int recorde = 0;
//
boolean resultado = true;
// -led in 17 key 4 //ligacao das teclas e saidas (led e teclas)
// -led in 16 key 3
// -led in 15 key 1
// -led in 14 key 1
//
void setup(){
Serial.begin(9600);
lcd.begin(16, 2);
pinMode(key1, INPUT);
pinMode(key2, INPUT);
pinMode(key3, INPUT);
pinMode(key4, INPUT);
//
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
//
pinMode(10, OUTPUT);
limpaMemoria();
//
// como a entrada analogica 5 nao esta conectada
// o ruido vai fazer com que o metodo
// randomSeed(), que inicializa o gerador
// de numeros pseudo-aleatorios da funcao random()
randomSeed(analogRead(5));
carregaRecorde();
preencheVetor();
escreveVetor();
apresenta();
}
void loop(){
escreveLcd();
jogadaCpu();
resultado= lerTeclado();
if(resultado == false){
lcd.setCursor(0, 1);
lcd.print("Voce Falhou");
checaRecorde();
errou();
}
else{
delay(1000);
};
}
void limpaMemoria(){
if(digitalRead(key1)
&& digitalRead(key4)){
digitalWrite(pin10, HIGH);
delay(50);
digitalWrite(pin10,LOW);
lcd.clear();
lcd.print("Limpando Memor..");
for (int i = 0; i < 512; i++)
EEPROM.write(i, 0);
digitalWrite(pin10, HIGH);
lcd.clear();
lcd.print("Memoria Limpa!");
delay(2000);
digitalWrite(pin10,LOW);
}
}
void carregaRecorde(){
recorde = EEPROM.read(0);
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Recorde: ");
lcd.setCursor(11, 1);
lcd.print(recorde);
}
void checaRecorde(){
if(jogadaAtual > recorde){
recorde = jogadaAtual;
EEPROM.write(0, recorde);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Novo Recorde");
lcd.setCursor(14,0);
lcd.print(recorde);
}
}
void somOn(int s){
switch(s){
case 14:
analogWrite(pin10, som1);
break;
case 15:
analogWrite(pin10, som2);
break;
case 16:
analogWrite(pin10, som3);
break;
case 17:
analogWrite(pin10, som4);
break;
}
}
void somOff(){
analogWrite(pin10, 0);
}
void jogadaCpu(){
for(int j = 0; j<=jogadaAtual; j++){
somOff();
digitalWrite(cpu[j], LOW);
delay(tempoNivel);
digitalWrite(cpu[j], HIGH);
somOn(cpu[j]);
delay(tempoNivel);
digitalWrite(cpu[j], LOW);
somOff();
}
}
void preencheVetor(){
for(int x = 0; x < JOGADAS_SIZE; x++){
cpu[x] = random(14,18);
}
}
void escreveVetor(){
for(int x = 0; x < JOGADAS_SIZE; x++){
Serial.print(cpu[x]);
Serial.print(" - ");
}
Serial.print("\n");
}
void errou(){
analogWrite(pin10, 50);
delay(500);
analogWrite(pin10, 40);
delay(500);
analogWrite(pin10, 30);
delay(500);
analogWrite(pin10, 20);
delay(1000);
somOff();
while(true){
delay(DELAY_APRESENTACAO);
digitalWrite(14, HIGH);
digitalWrite(15, HIGH);
digitalWrite(16, HIGH);
digitalWrite(17, HIGH);
delay(DELAY_APRESENTACAO);
digitalWrite(14, LOW);
digitalWrite(15, LOW);
digitalWrite(16, LOW);
digitalWrite(17, LOW);
delay(DELAY_APRESENTACAO);
}
}
void apresenta(){
while(true){
if(digitalRead(key1)
||digitalRead(key2)
||digitalRead(key3)
||digitalRead(key4)){
delay(150);
if(!digitalRead(key1)
||!digitalRead(key2)
||!digitalRead(key3)
||!digitalRead(key4)){
return;
}
}
delay(DELAY_APRESENTACAO * 2);
for(int i = 14; i<=17; i++){
digitalWrite(i, HIGH);
delay(DELAY_APRESENTACAO);
}
for(int i = 14; i<=17; i++){
digitalWrite(i, LOW);
delay(DELAY_APRESENTACAO);
}
delay(DELAY_APRESENTACAO * 2);
for(int i = 17; i>=14; i--){
digitalWrite(i, HIGH);
delay(DELAY_APRESENTACAO);
}
for(int i = 17; i>=14; i--){
digitalWrite(i, LOW);
delay(DELAY_APRESENTACAO);
}
delay(DELAY_APRESENTACAO * 2);
}
}
boolean lerTeclado(){
int index = 0;
int jogadaPlayer = 0;
boolean jogou = false;
do{
do{
jogou = false;
while(digitalRead(key1)){
delay(150);
digitalWrite(14,HIGH);
somOn(14);
if(!digitalRead(key1)){
delay(150);
digitalWrite(14,LOW);
somOff();
jogadaPlayer = 14;
jogou = true;
Serial.print(jogadaPlayer) ;
Serial.print("-");
}
}
while(digitalRead(key2)){
delay(150);
digitalWrite(15,HIGH);
somOn(15);
if(!digitalRead(key2)){
delay(150);
digitalWrite(15,LOW);
somOff();
jogadaPlayer = 15;
jogou = true;
Serial.print(jogadaPlayer) ;
Serial.print("-");
}
}
while(digitalRead(key3)){
delay(150);
digitalWrite(16,HIGH);
somOn(16);
if(!digitalRead(key3)){
delay(150);
digitalWrite(16,LOW);
somOff();
jogadaPlayer = 16;
jogou = true;
Serial.print(jogadaPlayer) ;
Serial.print("-");
}
}
while(digitalRead(key4)){
delay(150);
digitalWrite(17,HIGH);
somOn(17);
if(!digitalRead(key4)){
delay(150);
digitalWrite(17,LOW);
somOff();
jogadaPlayer = 17;
jogou = true;
Serial.print(jogadaPlayer) ;
Serial.print("-");
}
}
}
while(jogadaPlayer == 0);
if(cpu[index] != jogadaPlayer){
Serial.print(cpu[index]);
Serial.print(jogadaPlayer);
return false;
}
jogadaPlayer = 0;
index++;
}
while(index<=jogadaAtual);
jogadaAtual++;
Serial.print("\n");
tempoNivel = tempoNivel-10; //torna o jogo mais rapido
return true;
}
void escreveLcd(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Pontos: ");
lcd.setCursor(13,0);
lcd.print(jogadaAtual);
}
Bom divertimento!

Nenhum comentário:
Postar um comentário