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@3:75399d0ba94e, 2015-02-04 (annotated)
- 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?
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 | 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 | } |