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
Simon.cpp@1:fb29354d9073, 2015-02-04 (annotated)
- Committer:
- tsoic
- Date:
- Wed Feb 04 09:12:38 2015 +0000
- Revision:
- 1:fb29354d9073
- Parent:
- 0:d53b17bb7ffa
- Child:
- 2:0b6e10420ce2
Added Start/Restart button
Who changed what in which revision?
User | Revision | Line number | New 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 | button_press = false; |
tsoic | 1:fb29354d9073 | 14 | run = false; |
tsoic | 1:fb29354d9073 | 15 | button[0].attach_asserted(this, &Simon::keyPressedSt); |
tsoic | 1:fb29354d9073 | 16 | button[1].attach_asserted(this, &Simon::keyPressedNd); |
tsoic | 1:fb29354d9073 | 17 | button[2].attach_asserted(this, &Simon::keyPressedRd); |
tsoic | 1:fb29354d9073 | 18 | button[3].attach_asserted(this, &Simon::keyPressedTh); |
tsoic | 1:fb29354d9073 | 19 | button[4].attach_asserted(this, &Simon::ReStart); |
tsoic | 1:fb29354d9073 | 20 | for(i = 0; i < 5; i++) { |
tsoic | 0:d53b17bb7ffa | 21 | button[i].mode( PullDown ); |
tsoic | 0:d53b17bb7ffa | 22 | button[i].setSampleFrequency(); |
tsoic | 0:d53b17bb7ffa | 23 | } |
tsoic | 0:d53b17bb7ffa | 24 | } |
tsoic | 1:fb29354d9073 | 25 | |
tsoic | 1:fb29354d9073 | 26 | void Simon::gameStart(int firstTurn) { |
tsoic | 1:fb29354d9073 | 27 | turn = firstTurn; |
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 | 0:d53b17bb7ffa | 70 | while(i < turn){ |
tsoic | 0:d53b17bb7ffa | 71 | if (button_press == 1) { |
tsoic | 1:fb29354d9073 | 72 | if (testQueue() == 0) { |
tsoic | 0:d53b17bb7ffa | 73 | i = turn; |
tsoic | 0:d53b17bb7ffa | 74 | button_press = 0; |
tsoic | 1:fb29354d9073 | 75 | LEDSBlink();/* Indication of Game Over */ |
tsoic | 0:d53b17bb7ffa | 76 | return false; |
tsoic | 0:d53b17bb7ffa | 77 | } |
tsoic | 1:fb29354d9073 | 78 | else if (testQueue() == 1) { |
tsoic | 0:d53b17bb7ffa | 79 | i++; |
tsoic | 0:d53b17bb7ffa | 80 | button_press = 0; |
tsoic | 0:d53b17bb7ffa | 81 | } |
tsoic | 0:d53b17bb7ffa | 82 | } |
tsoic | 0:d53b17bb7ffa | 83 | } |
tsoic | 0:d53b17bb7ffa | 84 | this -> turn++; |
tsoic | 0:d53b17bb7ffa | 85 | return true; |
tsoic | 0:d53b17bb7ffa | 86 | } |
tsoic | 0:d53b17bb7ffa | 87 | |
tsoic | 1:fb29354d9073 | 88 | void Simon::keyPressedSt() { |
tsoic | 0:d53b17bb7ffa | 89 | button_press = 1; |
tsoic | 0:d53b17bb7ffa | 90 | test_val = 0; |
tsoic | 0:d53b17bb7ffa | 91 | } |
tsoic | 0:d53b17bb7ffa | 92 | |
tsoic | 1:fb29354d9073 | 93 | void Simon::keyPressedNd() { |
tsoic | 0:d53b17bb7ffa | 94 | button_press = 1; |
tsoic | 0:d53b17bb7ffa | 95 | test_val = 1; |
tsoic | 0:d53b17bb7ffa | 96 | } |
tsoic | 0:d53b17bb7ffa | 97 | |
tsoic | 1:fb29354d9073 | 98 | void Simon::keyPressedRd() { |
tsoic | 0:d53b17bb7ffa | 99 | button_press = 1; |
tsoic | 0:d53b17bb7ffa | 100 | test_val = 2; |
tsoic | 0:d53b17bb7ffa | 101 | } |
tsoic | 0:d53b17bb7ffa | 102 | |
tsoic | 1:fb29354d9073 | 103 | void Simon::keyPressedTh() { |
tsoic | 0:d53b17bb7ffa | 104 | button_press = 1; |
tsoic | 0:d53b17bb7ffa | 105 | test_val = 3; |
tsoic | 1:fb29354d9073 | 106 | } |
tsoic | 1:fb29354d9073 | 107 | |
tsoic | 1:fb29354d9073 | 108 | void Simon:: ReStart() { |
tsoic | 1:fb29354d9073 | 109 | run = true; |
tsoic | 0:d53b17bb7ffa | 110 | } |