A simple Simon Says game using a Grove Base Shield, 3 Grove LED Bars, 1 Grove Buzzer, and 3 Grove Buttons.
Components Used
Platform: ST-Nucleo-F401RE
Component Configuration
LED_Bar mid(D6, D5); //D5 LED_Bar right(D8, D7); //D7 LED_Bar left(D4, D3); //D3 InterruptIn button_left(A2); InterruptIn button_mid(A1); InterruptIn button_right(A0); DigitalOut buzzer(D2);
Gallery
Diff: main.cpp
- Revision:
- 4:9950f9ec46cf
- Parent:
- 3:96879db74ec8
- Child:
- 5:b6f37ce2a9a3
--- a/main.cpp Thu Aug 18 16:47:00 2016 +0000
+++ b/main.cpp Thu Aug 18 19:43:09 2016 +0000
@@ -4,13 +4,15 @@
LED_Bar top(D6, D5);
LED_Bar right(D8, D7);
LED_Bar left(D4, D3);
-DigitalIn button_left(A2);
-DigitalIn button_top(A1);
-DigitalIn button_right(A0);
+InterruptIn button_left(A2);
+InterruptIn button_top(A1);
+InterruptIn button_right(A0);
DigitalOut buzzer(D2);
Ticker input_timer;
int input[50];
+int input_index;
int sequence[] = {3, 2, 1, 3, 2, 1};
+int sequence_size;
int level_index = 0;
void level() {
@@ -26,7 +28,7 @@
/* simon says loop: turn on corresponding LED Bars according to the #
in the sequence array (1=right, 2=top, 3=left) */
void simon_loop() {
- for(int i = 0; i < (sizeof(sequence)/sizeof(sequence[0])); i++) {
+ for(int i = 0; i < sequence_size; i++) {
if (sequence[i] == 1) {
right.setLevel(10);
wait(0.4);
@@ -45,40 +47,50 @@
}
}
+void right_input() {
+ input[input_index] = 1;
+ while(button_right) {
+ right.setLevel(10);
+ }
+ right.setLevel(0);
+ return;
+}
+
+void top_input() {
+ input[input_index] = 2;
+ while(button_top) {
+ top.setLevel(10);
+ }
+ top.setLevel(0);
+ return;
+}
+
+void left_input() {
+ input[input_index] = 3;
+ while(button_left) {
+ left.setLevel(10);
+ }
+ left.setLevel(0);
+ return;
+}
+
/* gather user input based on buttons pressed, then store button # into
the input array (1=button_right, 2=button_top, 3=button_left) */
void input_loop() {
- for(int j = 0; j < (sizeof(sequence)/sizeof(sequence[0])); j++) {
- wait(0.4);
- if (button_top) {
- input[j] = 2;
- while(button_top){
- top.setLevel(10);
- };
- top.setLevel(0);
- }
- if (button_right) {
- input[j] = 1;
- while(button_right){
- right.setLevel(10);
- };
- right.setLevel(0);
- }
- if (button_left) {
- input[j] = 3;
- while(button_left){
- left.setLevel(10);
- };
- left.setLevel(0);
- }
+ button_right.rise(&right_input);
+ button_top.rise(&top_input);
+ button_left.rise(&left_input);
+ while(1) {
+ wait(0.2);
+ if (input_index <= sequence_size) { continue; }
+ else { return; }
}
- return;
}
/* compare input array to simon says sequence array, if they are a match
return true, if they are not a match return false */
bool win_or_lose() {
- for(int k = 0; k < (sizeof(sequence)/sizeof(sequence[0])); k++) {
+ for(int k = 0; k < sequence_size; k++) {
if (input[k] == sequence[k]) { continue; }
else { return false; }
}
@@ -115,6 +127,8 @@
}
void start_game() {
+ input_index = 0;
+ sequence_size = sizeof(sequence)/sizeof(sequence[0]);
top.setLevel(0);
right.setLevel(0);
left.setLevel(0);
@@ -122,6 +136,7 @@
//level();
wait(0.3);
simon_loop();
+ wait(0.3);
input_loop();
wait(0.2);
bool winner = win_or_lose();
Jenny Plunkett
