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 13:14:49 2015 +0000
Revision:
3:75399d0ba94e
Parent:
0:d53b17bb7ffa
Child:
4:32b02dd83c0d
Added restart button, fixed interrupts

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 3:75399d0ba94e 8 DigitalOut Simon::led[4] = {LED1, LED2, LED3, LED4};
tsoic 3:75399d0ba94e 9 PinDetect Simon::button[5] = {p12, p13, p14, p15, p16};
tsoic 0:d53b17bb7ffa 10
tsoic 0:d53b17bb7ffa 11 Simon::Simon() : queue(turn) {
tsoic 3:75399d0ba94e 12 LEDSBlink();
tsoic 3:75399d0ba94e 13 run = false;
tsoic 3:75399d0ba94e 14 button[0].attach_asserted(this, &Simon::keyPressedSt);
tsoic 3:75399d0ba94e 15 button[1].attach_asserted(this, &Simon::keyPressedNd);
tsoic 3:75399d0ba94e 16 button[2].attach_asserted(this, &Simon::keyPressedRd);
tsoic 3:75399d0ba94e 17 button[3].attach_asserted(this, &Simon::keyPressedTh);
tsoic 3:75399d0ba94e 18 button[4].attach_asserted(this, &Simon::ReStart);
tsoic 3:75399d0ba94e 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 3:75399d0ba94e 24
tsoic 3:75399d0ba94e 25 void Simon::gameStart(int first_turn) {
tsoic 3:75399d0ba94e 26 this -> first_turn = first_turn;
tsoic 3:75399d0ba94e 27 turn = first_turn;
tsoic 3:75399d0ba94e 28 while(1) {
tsoic 3:75399d0ba94e 29 while(run == true) {
tsoic 3:75399d0ba94e 30 newQueue();
tsoic 3:75399d0ba94e 31 showQueue();
tsoic 3:75399d0ba94e 32 run = userTurn();
tsoic 3:75399d0ba94e 33 }
tsoic 3:75399d0ba94e 34 }
tsoic 3:75399d0ba94e 35 }
tsoic 3:75399d0ba94e 36
tsoic 3:75399d0ba94e 37 int Simon::testQueue() {
tsoic 0:d53b17bb7ffa 38 if (queue[i] == test_val) {
tsoic 3:75399d0ba94e 39 led[queue[i]] = 1;
tsoic 0:d53b17bb7ffa 40 wait(0.2);
tsoic 3:75399d0ba94e 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 3:75399d0ba94e 47 void Simon::LEDSBlink() {
tsoic 3:75399d0ba94e 48 for(i = 0; i < 4; i++) led[i] = 1;
tsoic 3:75399d0ba94e 49 wait(0.4);
tsoic 3:75399d0ba94e 50 for(i = 0; i < 4; i++) led[i] = 0;
tsoic 0:d53b17bb7ffa 51 }
tsoic 0:d53b17bb7ffa 52
tsoic 3:75399d0ba94e 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 3:75399d0ba94e 60 led[queue[i]] = 1;
tsoic 0:d53b17bb7ffa 61 wait(0.5);
tsoic 3:75399d0ba94e 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 3:75399d0ba94e 68 LEDSBlink();
tsoic 0:d53b17bb7ffa 69 i = 0;
tsoic 3:75399d0ba94e 70 button_press = false;
tsoic 0:d53b17bb7ffa 71 while(i < turn){
tsoic 0:d53b17bb7ffa 72 if (button_press == 1) {
tsoic 3:75399d0ba94e 73 if (testQueue() == 0) {
tsoic 0:d53b17bb7ffa 74 i = turn;
tsoic 0:d53b17bb7ffa 75 button_press = 0;
tsoic 3:75399d0ba94e 76 LEDSBlink();/* Indication of Game Over */
tsoic 0:d53b17bb7ffa 77 return false;
tsoic 0:d53b17bb7ffa 78 }
tsoic 3:75399d0ba94e 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 3:75399d0ba94e 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 3:75399d0ba94e 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 3:75399d0ba94e 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 3:75399d0ba94e 104 void Simon::keyPressedTh() {
tsoic 0:d53b17bb7ffa 105 button_press = 1;
tsoic 0:d53b17bb7ffa 106 test_val = 3;
tsoic 3:75399d0ba94e 107 }
tsoic 3:75399d0ba94e 108
tsoic 3:75399d0ba94e 109 void Simon:: ReStart() {
tsoic 3:75399d0ba94e 110 run = true;
tsoic 3:75399d0ba94e 111 turn = first_turn;
tsoic 0:d53b17bb7ffa 112 }