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:
Wed Feb 04 10:35:15 2015 +0000
Revision:
2:0b6e10420ce2
Parent:
1:fb29354d9073
Added Start/Restart, ; fixed interrupt button.

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