would be Simon game, as a demonstrator for buttons debouncing and \"collecting\" ---

Committer:
wek
Date:
Tue Dec 14 00:45:37 2010 +0000
Revision:
2:fe450a70f8a4
Parent:
1:3acf57259c58
Finally, the real Simon game. Enjoy! ;-)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wek 2:fe450a70f8a4 1 #include "mbed.h"
wek 2:fe450a70f8a4 2 #include "DebounceIn_.h"
wek 2:fe450a70f8a4 3 #include <stdlib.h>
wek 2:fe450a70f8a4 4 #include <stdbool.h>
wek 2:fe450a70f8a4 5
wek 2:fe450a70f8a4 6
wek 2:fe450a70f8a4 7 DebounceIn button1(p15);
wek 2:fe450a70f8a4 8 DebounceIn button2(p16);
wek 2:fe450a70f8a4 9 DebounceIn button3(p17);
wek 2:fe450a70f8a4 10 DebounceIn button4(p21);
wek 2:fe450a70f8a4 11
wek 2:fe450a70f8a4 12 class CSimonButton {
wek 2:fe450a70f8a4 13 _Bool pressed;
wek 2:fe450a70f8a4 14 int button;
wek 2:fe450a70f8a4 15 public:
wek 2:fe450a70f8a4 16 CSimonButton();
wek 2:fe450a70f8a4 17 _Bool IsPressed(void);
wek 2:fe450a70f8a4 18 int GetButton(void) {return button;};
wek 2:fe450a70f8a4 19 void Handle(void);
wek 2:fe450a70f8a4 20 void Reset(void); // {pressed = 0;};
wek 2:fe450a70f8a4 21 };
wek 2:fe450a70f8a4 22
wek 2:fe450a70f8a4 23 void CSimonButton::Reset(void) {
wek 2:fe450a70f8a4 24 pressed = 0;
wek 2:fe450a70f8a4 25 button1.pressed = 0;
wek 2:fe450a70f8a4 26 button2.pressed = 0;
wek 2:fe450a70f8a4 27 button3.pressed = 0;
wek 2:fe450a70f8a4 28 button4.pressed = 0;
wek 2:fe450a70f8a4 29 }
wek 2:fe450a70f8a4 30
wek 2:fe450a70f8a4 31 CSimonButton::CSimonButton() {
wek 2:fe450a70f8a4 32 button1.mode(PullUp);
wek 2:fe450a70f8a4 33 button2.mode(PullUp);
wek 2:fe450a70f8a4 34 button3.mode(PullUp);
wek 2:fe450a70f8a4 35 button4.mode(PullUp);
wek 2:fe450a70f8a4 36 Reset(); // pressed = 0;
wek 2:fe450a70f8a4 37 }
wek 2:fe450a70f8a4 38
wek 2:fe450a70f8a4 39 _Bool CSimonButton::IsPressed(void) {
wek 2:fe450a70f8a4 40 _Bool tmp;
wek 2:fe450a70f8a4 41
wek 2:fe450a70f8a4 42 tmp = pressed;
wek 2:fe450a70f8a4 43 pressed = 0;
wek 2:fe450a70f8a4 44 return tmp;
wek 2:fe450a70f8a4 45 }
wek 2:fe450a70f8a4 46
wek 2:fe450a70f8a4 47 void CSimonButton::Handle(void) {
wek 2:fe450a70f8a4 48 if (button1.pressed) {
wek 2:fe450a70f8a4 49 button1.pressed = 0;
wek 2:fe450a70f8a4 50 pressed = 1;
wek 2:fe450a70f8a4 51 button = 1;
wek 2:fe450a70f8a4 52 }
wek 2:fe450a70f8a4 53 if (button2.pressed) {
wek 2:fe450a70f8a4 54 button2.pressed = 0;
wek 2:fe450a70f8a4 55 pressed = 1;
wek 2:fe450a70f8a4 56 button = 2;
wek 2:fe450a70f8a4 57 }
wek 2:fe450a70f8a4 58 if (button3.pressed) {
wek 2:fe450a70f8a4 59 button3.pressed = 0;
wek 2:fe450a70f8a4 60 pressed = 1;
wek 2:fe450a70f8a4 61 button = 3;
wek 2:fe450a70f8a4 62 }
wek 2:fe450a70f8a4 63 if (button4.pressed) {
wek 2:fe450a70f8a4 64 button4.pressed = 0;
wek 2:fe450a70f8a4 65 pressed = 1;
wek 2:fe450a70f8a4 66 button = 4;
wek 2:fe450a70f8a4 67 }
wek 2:fe450a70f8a4 68
wek 2:fe450a70f8a4 69 }
wek 2:fe450a70f8a4 70
wek 2:fe450a70f8a4 71 CSimonButton simonButton;
wek 2:fe450a70f8a4 72
wek 2:fe450a70f8a4 73 BusOut leds(LED1, LED2, LED3, LED4);
wek 2:fe450a70f8a4 74
wek 2:fe450a70f8a4 75 #define SIMON_MIN_SEQUENCE 3
wek 2:fe450a70f8a4 76 #define SIMON_MAX_SEQUENCE 10
wek 2:fe450a70f8a4 77 int simonPuzzle[SIMON_MAX_SEQUENCE]; // storage for the current puzzle
wek 2:fe450a70f8a4 78 int simonLevel; // current level
wek 2:fe450a70f8a4 79
wek 2:fe450a70f8a4 80
wek 2:fe450a70f8a4 81 int Random(int bound) {
wek 2:fe450a70f8a4 82 return rand() % bound;
wek 2:fe450a70f8a4 83 }
wek 2:fe450a70f8a4 84
wek 2:fe450a70f8a4 85 void InitSimon(void) {
wek 2:fe450a70f8a4 86 // prepare puzzle array
wek 2:fe450a70f8a4 87 for (int i = 0; i < SIMON_MAX_SEQUENCE; i++) {
wek 2:fe450a70f8a4 88 simonPuzzle[i] = Random(4);
wek 2:fe450a70f8a4 89 }
wek 2:fe450a70f8a4 90 simonLevel = SIMON_MIN_SEQUENCE;
wek 2:fe450a70f8a4 91 // visual: rapid blinking
wek 2:fe450a70f8a4 92 for (int i = 0; i < 10; i++) {
wek 2:fe450a70f8a4 93 leds.write(0x0F);
wek 2:fe450a70f8a4 94 wait(0.1);
wek 2:fe450a70f8a4 95 leds.write(0);
wek 2:fe450a70f8a4 96 wait(0.1);
wek 2:fe450a70f8a4 97 }
wek 2:fe450a70f8a4 98 wait(1.0);
wek 2:fe450a70f8a4 99 }
wek 2:fe450a70f8a4 100
wek 2:fe450a70f8a4 101 void PresentSimon(void) { // present the puzzle up to current simonLevel
wek 2:fe450a70f8a4 102 for (int i = 0; i < simonLevel; i++) {
wek 2:fe450a70f8a4 103 leds.write(1 << simonPuzzle[i]);
wek 2:fe450a70f8a4 104 wait(0.3);
wek 2:fe450a70f8a4 105 leds.write(0);
wek 2:fe450a70f8a4 106 wait(0.3);
wek 2:fe450a70f8a4 107 }
wek 2:fe450a70f8a4 108 }
wek 2:fe450a70f8a4 109
wek 2:fe450a70f8a4 110 _Bool AnswerSimon(void) {
wek 2:fe450a70f8a4 111 int i = 0;
wek 2:fe450a70f8a4 112 int button;
wek 2:fe450a70f8a4 113 simonButton.Reset();
wek 2:fe450a70f8a4 114 while (i < simonLevel) {
wek 2:fe450a70f8a4 115 simonButton.Handle();
wek 2:fe450a70f8a4 116 if (simonButton.IsPressed()) {
wek 2:fe450a70f8a4 117 button = simonButton.GetButton() - 1;
wek 2:fe450a70f8a4 118 leds.write(1 << button);
wek 2:fe450a70f8a4 119 wait(0.3);
wek 2:fe450a70f8a4 120 leds.write(0);
wek 2:fe450a70f8a4 121 if (button != simonPuzzle[i]) {
wek 2:fe450a70f8a4 122 return 0;
wek 2:fe450a70f8a4 123 } else {
wek 2:fe450a70f8a4 124 i++;
wek 2:fe450a70f8a4 125 }
wek 2:fe450a70f8a4 126 }
wek 2:fe450a70f8a4 127 }
wek 2:fe450a70f8a4 128 wait(0.5);
wek 2:fe450a70f8a4 129 return 1;
wek 2:fe450a70f8a4 130 }
wek 2:fe450a70f8a4 131
wek 2:fe450a70f8a4 132 void WinCeremony(void) {
wek 2:fe450a70f8a4 133 for (int i = 0; i < 200; i++) {
wek 2:fe450a70f8a4 134 leds.write(Random(0x10));
wek 2:fe450a70f8a4 135 wait(0.03);
wek 2:fe450a70f8a4 136 }
wek 2:fe450a70f8a4 137 leds.write(0);
wek 2:fe450a70f8a4 138 wait(2.0);
wek 2:fe450a70f8a4 139 }
wek 2:fe450a70f8a4 140
wek 2:fe450a70f8a4 141 void YesCeremony(void) {
wek 2:fe450a70f8a4 142 for (int i = 0; i < 3; i++) {
wek 2:fe450a70f8a4 143 leds.write(0x0F);
wek 2:fe450a70f8a4 144 wait(0.2);
wek 2:fe450a70f8a4 145 leds.write(0);
wek 2:fe450a70f8a4 146 wait(0.1);
wek 2:fe450a70f8a4 147 }
wek 2:fe450a70f8a4 148 wait(1.0);
wek 2:fe450a70f8a4 149 }
wek 2:fe450a70f8a4 150
wek 2:fe450a70f8a4 151
wek 2:fe450a70f8a4 152 void NoCeremony(void) {
wek 2:fe450a70f8a4 153 for (int i = 0; i < 3; i++) {
wek 2:fe450a70f8a4 154 leds.write(0x01); wait(0.1);
wek 2:fe450a70f8a4 155 leds.write(0x02); wait(0.1);
wek 2:fe450a70f8a4 156 leds.write(0x04); wait(0.1);
wek 2:fe450a70f8a4 157 leds.write(0x08); wait(0.1);
wek 2:fe450a70f8a4 158 leds.write(0x04); wait(0.1);
wek 2:fe450a70f8a4 159 leds.write(0x02); wait(0.1);
wek 2:fe450a70f8a4 160 }
wek 2:fe450a70f8a4 161 wait(1.0);
wek 2:fe450a70f8a4 162 }
wek 2:fe450a70f8a4 163 int main() {
wek 2:fe450a70f8a4 164 _Bool answer;
wek 2:fe450a70f8a4 165
wek 2:fe450a70f8a4 166 while (1) {
wek 2:fe450a70f8a4 167
wek 2:fe450a70f8a4 168 InitSimon();
wek 2:fe450a70f8a4 169 do {
wek 2:fe450a70f8a4 170 PresentSimon();
wek 2:fe450a70f8a4 171 answer = AnswerSimon();
wek 2:fe450a70f8a4 172 if (answer) {
wek 2:fe450a70f8a4 173 simonLevel++;
wek 2:fe450a70f8a4 174 if (simonLevel == SIMON_MAX_SEQUENCE) {
wek 2:fe450a70f8a4 175 WinCeremony();
wek 2:fe450a70f8a4 176 answer = 0;
wek 2:fe450a70f8a4 177 } else {
wek 2:fe450a70f8a4 178 YesCeremony();
wek 2:fe450a70f8a4 179 }
wek 2:fe450a70f8a4 180 } else {
wek 2:fe450a70f8a4 181 NoCeremony();
wek 2:fe450a70f8a4 182 }
wek 2:fe450a70f8a4 183 } while (answer);
wek 2:fe450a70f8a4 184 }
wek 2:fe450a70f8a4 185 }
wek 2:fe450a70f8a4 186