Simple Simon says mbed game which makes random queue, shows it with onboard LEDs and takes user input with push buttons.

Dependencies:   PinDetect mbed beep

Committer:
tsoic
Date:
Tue Feb 10 12:37:56 2015 +0000
Revision:
5:94c215df2b7c
Parent:
4:32b02dd83c0d
Added piezo speaker and sound effects

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tsoic 0:d53b17bb7ffa 1 #include "mbed.h"
tsoic 0:d53b17bb7ffa 2 #include "PinDetect.h"
tsoic 0:d53b17bb7ffa 3 #include "Simon.h"
tsoic 4:32b02dd83c0d 4 #include "Piezo.h"
tsoic 0:d53b17bb7ffa 5 #include <vector>
tsoic 0:d53b17bb7ffa 6 #include <cstdlib>
tsoic 0:d53b17bb7ffa 7
tsoic 4:32b02dd83c0d 8 DigitalOut Simon::led[4] = {LED1, LED2, LED3, LED4};
tsoic 3:75399d0ba94e 9 PinDetect Simon::button[5] = {p12, p13, p14, p15, p16};
tsoic 4:32b02dd83c0d 10
tsoic 0:d53b17bb7ffa 11 Simon::Simon() : queue(turn) {
tsoic 4:32b02dd83c0d 12 piezo.NoteC4();
tsoic 4:32b02dd83c0d 13 wait(0.4);
tsoic 4:32b02dd83c0d 14 piezo.NoteB4();
tsoic 3:75399d0ba94e 15 LEDSBlink();
tsoic 3:75399d0ba94e 16 run = false;
tsoic 3:75399d0ba94e 17 button[0].attach_asserted(this, &Simon::keyPressedSt);
tsoic 3:75399d0ba94e 18 button[1].attach_asserted(this, &Simon::keyPressedNd);
tsoic 3:75399d0ba94e 19 button[2].attach_asserted(this, &Simon::keyPressedRd);
tsoic 3:75399d0ba94e 20 button[3].attach_asserted(this, &Simon::keyPressedTh);
tsoic 3:75399d0ba94e 21 button[4].attach_asserted(this, &Simon::ReStart);
tsoic 3:75399d0ba94e 22 for(i = 0; i < 5; i++) {
tsoic 0:d53b17bb7ffa 23 button[i].mode( PullDown );
tsoic 0:d53b17bb7ffa 24 button[i].setSampleFrequency();
tsoic 0:d53b17bb7ffa 25 }
tsoic 0:d53b17bb7ffa 26 }
tsoic 3:75399d0ba94e 27
tsoic 3:75399d0ba94e 28 void Simon::gameStart(int first_turn) {
tsoic 3:75399d0ba94e 29 this -> first_turn = first_turn;
tsoic 3:75399d0ba94e 30 turn = first_turn;
tsoic 3:75399d0ba94e 31 while(1) {
tsoic 3:75399d0ba94e 32 while(run == true) {
tsoic 3:75399d0ba94e 33 newQueue();
tsoic 3:75399d0ba94e 34 showQueue();
tsoic 3:75399d0ba94e 35 run = userTurn();
tsoic 3:75399d0ba94e 36 }
tsoic 3:75399d0ba94e 37 }
tsoic 3:75399d0ba94e 38 }
tsoic 3:75399d0ba94e 39
tsoic 3:75399d0ba94e 40 int Simon::testQueue() {
tsoic 0:d53b17bb7ffa 41 if (queue[i] == test_val) {
tsoic 4:32b02dd83c0d 42 piezo.NoteFor(queue[i]);
tsoic 3:75399d0ba94e 43 led[queue[i]] = 1;
tsoic 0:d53b17bb7ffa 44 wait(0.2);
tsoic 3:75399d0ba94e 45 led[queue[i]] = 0;
tsoic 0:d53b17bb7ffa 46 return 1;
tsoic 0:d53b17bb7ffa 47 }
tsoic 0:d53b17bb7ffa 48 else return 0;
tsoic 0:d53b17bb7ffa 49 }
tsoic 0:d53b17bb7ffa 50
tsoic 3:75399d0ba94e 51 void Simon::LEDSBlink() {
tsoic 3:75399d0ba94e 52 for(i = 0; i < 4; i++) led[i] = 1;
tsoic 3:75399d0ba94e 53 wait(0.4);
tsoic 3:75399d0ba94e 54 for(i = 0; i < 4; i++) led[i] = 0;
tsoic 0:d53b17bb7ffa 55 }
tsoic 0:d53b17bb7ffa 56
tsoic 3:75399d0ba94e 57 void Simon::newQueue() {
tsoic 0:d53b17bb7ffa 58 for(i = 0; i < turn; i++) queue[i] = rand() % 4;
tsoic 0:d53b17bb7ffa 59 }
tsoic 0:d53b17bb7ffa 60
tsoic 0:d53b17bb7ffa 61 void Simon::showQueue() {
tsoic 0:d53b17bb7ffa 62 wait(0.2);
tsoic 0:d53b17bb7ffa 63 for(i = 0; i < turn; i++) {
tsoic 4:32b02dd83c0d 64 piezo.NoteFor(queue[i]);
tsoic 3:75399d0ba94e 65 led[queue[i]] = 1;
tsoic 0:d53b17bb7ffa 66 wait(0.5);
tsoic 3:75399d0ba94e 67 led[queue[i]] = 0;
tsoic 0:d53b17bb7ffa 68 wait(0.1);
tsoic 0:d53b17bb7ffa 69 }
tsoic 0:d53b17bb7ffa 70 }
tsoic 0:d53b17bb7ffa 71
tsoic 0:d53b17bb7ffa 72 bool Simon::userTurn() {
tsoic 0:d53b17bb7ffa 73 i = 0;
tsoic 3:75399d0ba94e 74 button_press = false;
tsoic 0:d53b17bb7ffa 75 while(i < turn){
tsoic 0:d53b17bb7ffa 76 if (button_press == 1) {
tsoic 3:75399d0ba94e 77 if (testQueue() == 0) {
tsoic 0:d53b17bb7ffa 78 i = turn;
tsoic 0:d53b17bb7ffa 79 button_press = 0;
tsoic 4:32b02dd83c0d 80 LEDSBlink();
tsoic 4:32b02dd83c0d 81 piezo.NoteB4();
tsoic 4:32b02dd83c0d 82 wait(0.3);
tsoic 4:32b02dd83c0d 83 piezo.NoteC4();
tsoic 0:d53b17bb7ffa 84 return false;
tsoic 0:d53b17bb7ffa 85 }
tsoic 3:75399d0ba94e 86 else if (testQueue() == 1) {
tsoic 0:d53b17bb7ffa 87 i++;
tsoic 0:d53b17bb7ffa 88 button_press = 0;
tsoic 0:d53b17bb7ffa 89 }
tsoic 0:d53b17bb7ffa 90 }
tsoic 0:d53b17bb7ffa 91 }
tsoic 0:d53b17bb7ffa 92 this -> turn++;
tsoic 4:32b02dd83c0d 93 wait(0.5);
tsoic 0:d53b17bb7ffa 94 return true;
tsoic 0:d53b17bb7ffa 95 }
tsoic 0:d53b17bb7ffa 96
tsoic 3:75399d0ba94e 97 void Simon::keyPressedSt() {
tsoic 0:d53b17bb7ffa 98 button_press = 1;
tsoic 0:d53b17bb7ffa 99 test_val = 0;
tsoic 0:d53b17bb7ffa 100 }
tsoic 0:d53b17bb7ffa 101
tsoic 4:32b02dd83c0d 102 void Simon::keyPressedNd() {
tsoic 0:d53b17bb7ffa 103 button_press = 1;
tsoic 0:d53b17bb7ffa 104 test_val = 1;
tsoic 0:d53b17bb7ffa 105 }
tsoic 0:d53b17bb7ffa 106
tsoic 3:75399d0ba94e 107 void Simon::keyPressedRd() {
tsoic 0:d53b17bb7ffa 108 button_press = 1;
tsoic 0:d53b17bb7ffa 109 test_val = 2;
tsoic 0:d53b17bb7ffa 110 }
tsoic 0:d53b17bb7ffa 111
tsoic 3:75399d0ba94e 112 void Simon::keyPressedTh() {
tsoic 0:d53b17bb7ffa 113 button_press = 1;
tsoic 0:d53b17bb7ffa 114 test_val = 3;
tsoic 3:75399d0ba94e 115 }
tsoic 3:75399d0ba94e 116
tsoic 3:75399d0ba94e 117 void Simon:: ReStart() {
tsoic 3:75399d0ba94e 118 run = true;
tsoic 3:75399d0ba94e 119 turn = first_turn;
tsoic 0:d53b17bb7ffa 120 }