Boas Tardes,

Eu e um colega meu estamos a realizar um código arduíno que contenha o jogo Simon Says implícito, desde já temos os seguintes problemas aos quais ainda não conseguimos obter nenhuma resposta. 

Problemas que queríamos resolver:

  1. Associar o botão a cada LED em questão, fazendo com que quando eu toco no botão este acenda o LED e depois o apague de forma a formar a sequência aleatória produzida pelo computador num instante inicial.
  2. Dada uma sequência ao acaso ao clicar num LED errado ele vá para o estado GAMEOVER e quando clicando nos botões certos o jogo prosseguir.

/-------------Variaveis--/--------------

//--------------Estados-----------------

#define MENU 0
#define GAMESTART 1
#define LEDSON 2
#define PLAYERACTION 3
#define GAMEOVER 4

//----------------Pins------------------

#define pinLDR A0
const int pinLED1 = 9;
const int pinLED2 = 10;
const int pinLED3 = 6;
const int pinbuzzer = 5;
const int pinbotao1 = 7;
const int pinbotao2 = 8;
const int pinbotao3 = 12;
const int pinbotao4 = 13;

//----------Outras Variaveis------------

#define n_neper 2.718281828459045235360287471352
int i = 1;
int var = 0;
int delayvariable, randomvariable, ledintensity, lumpercent, estado, tecla;
double log_e;

void setup()
{
Serial.begin(9600);
pinMode(pinLED1, OUTPUT);
pinMode(pinLED2, OUTPUT);
pinMode(pinLED3, OUTPUT);
pinMode(pinbotao1, INPUT);
pinMode(pinbotao2, INPUT);
pinMode(pinbotao3, INPUT);
pinMode(pinbotao4, INPUT);
}

//criaram-se estas funçoes com o intuito de simplificar o codigo posteriormente, fazendo apenas referencia as mesmas
void LED1()
{
analogWrite(pinLED1, ledintensity);
tone(pinbuzzer, 262, delayvariable);
delay(delayvariable);
analogWrite(pinLED1, 0);
}

void LED2()
{
analogWrite(pinLED2, ledintensity);
tone(pinbuzzer, 294, delayvariable);
delay(delayvariable);
analogWrite(pinLED2, 0);
}

void LED3()
{
analogWrite(pinLED3, ledintensity);
tone(pinbuzzer, 330, delayvariable);
delay(delayvariable);
analogWrite(pinLED3, 0);
}

int act_LerTecla()
{
tecla=act_LerNumero();
while(tecla < 0 && tecla > 1)
{
Serial.println("Try again.");tecla=act_LerNumero();
}
return tecla;
}

int act_LerNumero()
{
while (Serial.available()){Serial.read();};
while (Serial.available()==0){};
return Serial.parseInt();
}

//funçao que permite a ativaçao de qualquer LED
void activateLED()
{
lumpercent = (analogRead(pinLDR)/1023.0)*100.0; //valor lido a nivel do LDR, expresso em percentagem
log_e = pow(n_neper, ((log(255)/100)*lumpercent));
Serial.println(lumpercent);
ledintensity = log_e; //valor que vai permitir obter o valor de dutycycle que vai ser atribuido aos LEDS (em funçao de lumpercent calculado acima)
Serial.println(ledintensity);
delayvariable = (1/(0.002*i))+100; //determina o tempo que o LED vai ficar ligado aquando da sequencia em jogo (diminui com o aumento do i)
randomvariable = random(0,100); //obtençao de um valor pseudo-aleatorio, que permitira escolher o LED que vai acender na sequencia do jogo
if (randomvariable < 33)
{
LED1();
}
else if (randomvariable > 33 && randomvariable < 66)
{
LED2();
}
else
{
LED3();
}
}

//funçao que apresenta o automato em si
void automaton()
{
switch(estado)
{
case MENU:
Serial.println("=================================================================");
Serial.println("=======================Introduza um valor========================");
Serial.println("0 -> Mantém-se no Menu; 1 -> Inicia o jogo.");
Serial.println("=================================================================");
tecla=act_LerTecla();
switch(tecla){
case 0: estado = MENU; break;
case 1: estado = GAMESTART; break;
default: estado = MENU; break;}
break;
case GAMESTART:
Serial.println("==================O jogo vai ter início em...===================");
Serial.println("==============================3...==============================");
delay(1000);
Serial.println("==============================2...==============================");
delay(1000);
Serial.println("==============================1...==============================");
delay(1000);
Serial.println("==============================Já!===============================");
estado = LEDSON; //passa-se ao estado LEDSON para que se acenda uma sequencia de LEDs
break;
case LEDSON:
var = 0; //a variavel var é 0, para que o while seja processado i vezes
while(var < i) //o codigo abaixo e lido enquanto var for menor que i
{
activateLED(); //liga-se (e desliga-se) um LED "aleatoriamente"
var = var + 1; //soma-se 1 a var, para que o while nao seja um ciclo infinito (pretende-se correr este ciclo i vezes)
}
estado = PLAYERACTION; //passa-se para o estado PLAYERACTION onde aguardamos que sejam pressionados os botoes
break;
case PLAYERACTION:
/*if
{
estado = GAMEOVER; //passa-se ao estado GAMEOVER
}
if
{
i = i + 1; //soma-se 1 a i
estado = LEDSON; //passa-se ao estado LEDSON para que se acenda uma sequencia de LEDs de novo
}*/
break;
case GAMEOVER:
Serial.println("============================Perdeu!============================");
delay(50);
Serial.println("========================Tente novamente========================");
delay(500);
estado = MENU; //volta-se ao estado MENU, pois o jogador perdeu
break;
}
}

void loop()
{
activateLED();
delay(200);
}

Cumps,

Exibições: 325

Anexos

Responder esta

Respostas a este tópico

Já conseguimos resolver o problema neste momento estamos a tentar implementar a função array no código 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço