-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSimon-says.ino
139 lines (127 loc) · 4.47 KB
/
Simon-says.ino
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
/*Simon-Says (Gênio)
O jogo pode ser rodado com opção de alocação dinâmica ou estática de memória. A alocação estática, consome 11% de storage e 4% de memória dinâmica, enquanto a alocação dinâmica consome 15% de storage e
2% de memória dinâmica (Arduino Uno). As linhas de código referente a opção de memória estão marcadas com um comentáio, logo depois dos defines, (declaração do vetor que vai armazenar a sequência) e inicio da
função adicionaNovo() (inserção de um novo item na sequência). O jogo está originalmente setado com alocação estática.
Letícia Pegoraro Garcez 2019
*/
//entradas
#define led1 2
#define led2 3
#define led3 4
#define led4 5
#define btn1 8
#define btn2 9
#define btn3 10
#define btn4 11
#define sb 7
//sounds for each led and one for the wrong function.
#define SOUND1 1047
#define SOUND2 1175
#define SOUND3 1319
#define SOUND4 1397
#define SOUND_WRONG 2093
int posicoes;
//int *sequencia = (int*)malloc(sizeof(int));//ALOCAÇÃO DINÂMICA
int sequencia[30];//ALOCAÇÃO ESTÁTICA
void adicionaNovo (void);
void piscaLed(int n);
void playSequencia(void);
void confere(void);
void playWrong(void);
void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(btn1, INPUT);
pinMode(btn2, INPUT);
pinMode(btn3, INPUT);
pinMode(btn4, INPUT);
pinMode(sb, OUTPUT);
}
void loop() {
adicionaNovo();//Insere a sequência
delay(700);
confere();//Confere a sequência.
delay(800);
}
void adicionaNovo(void) {
/*
sequencia = (int*) realloc (sequencia,(posicoes+1)*sizeof(int));
if(sequencia == NULL){//caso ocorra algum problema
playWrong();
}
*///ALOCAÇÃO DINÂMICA
if (posicoes != 0) { //Exibir o que tenho armazenado no vetor
playSequencia();
}
randomSeed(millis());//A seed do random vira o tempo atual de execução, o que faz com que as sequencias possam ser diferentes
sequencia[posicoes] = random(1, 5); //Gera um random entre 1 e 4
piscaLed(sequencia[posicoes]);
posicoes++;
}
void piscaLed (int n) { //Os valores 1,2,3,4 são associados ás saídas.
switch (n) {
case 1:
digitalWrite(led1, HIGH);
tone(sb, SOUND1);
delay(500);
noTone(sb);
digitalWrite(led1, LOW);
break;
case 2:
digitalWrite(led2, HIGH);
tone(sb, SOUND2);
delay(500);
digitalWrite(led2, LOW);
noTone(sb);
break;
case 3:
digitalWrite(led3, HIGH);
tone(sb, SOUND3);
delay(500);
digitalWrite(led3, LOW);
noTone(sb);
break;
case 4:
digitalWrite(led4, HIGH);
tone(sb, SOUND4);
delay(500);
noTone(sb);
digitalWrite(led4, LOW);
}
}
void playSequencia(void) { //sem o que explicar aqui.
for (int contador = 0; contador < posicoes; contador++) {
piscaLed(sequencia[contador]);
delay(500);
}
}
void confere(void) {
int contador = 0;
while (contador < posicoes) { //Enquanto eu não tiver dado entrada para todos os elementos da sequência ele continua esperando.
if ((digitalRead(btn1) && sequencia[contador] == 1) || (digitalRead(btn2) && sequencia[contador] == 2) || (digitalRead(btn3) && sequencia[contador] == 3) || (digitalRead(btn4) && sequencia[contador] == 4)) {
//Se o botão apertado corresponder a cor certa, ele fica esperando a entrada da próxima posição.
piscaLed(sequencia[contador]);//Acende o led correto
contador++;
}
else if ((digitalRead(btn1) && sequencia[contador] != 1) || (digitalRead(btn2) && sequencia[contador] != 2) || (digitalRead(btn3) && sequencia[contador] != 3) || (digitalRead(btn4) && sequencia[contador] != 4)) {
//Aqui precisa ser else if é pro programa esperar a entrada, do contrário simplesmente toca o wrong assim que o primeiro led correto é apertado.
playWrong();//Se o botão é diferente do que ele estava esperando ele roda a função de finalizar o jogo. Nessa função ele zera a quantidade de posições, o que sai do loop automaticamente.
}
}
}
void playWrong (void) {
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
tone(sb, SOUND_WRONG);
delay(1500);//Deixa os leds e o som ligados um pouco
noTone(sb);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
posicoes = 0;//Zera o número de posições, então ele vai começar a preencher o vetor novamente do zero na próxima iteração do void loop
}