Uses a randomly generated pattern that is output in the forms of colors on the RGB LED. The user matches this pattern and, if correct, the pattern increases by one in length. If the user beats the high score they will be prompted to input their initials for the high score screen.

Dependencies:   4DGL-uLCD-SE DebounceIn mbed

Committer:
coyle19
Date:
Tue Oct 20 00:37:02 2015 +0000
Revision:
0:2e7acdee8267
RGB LED Pattern Matching Game

Who changed what in which revision?

UserRevisionLine numberNew contents of line
coyle19 0:2e7acdee8267 1 #include "mbed.h"
coyle19 0:2e7acdee8267 2 #include "DebounceIn.h"
coyle19 0:2e7acdee8267 3 #include <cstring>
coyle19 0:2e7acdee8267 4 #include <string>
coyle19 0:2e7acdee8267 5 #include "uLCD_4DGL.h"
coyle19 0:2e7acdee8267 6
coyle19 0:2e7acdee8267 7 #define SEQ_LEN 20
coyle19 0:2e7acdee8267 8
coyle19 0:2e7acdee8267 9 DigitalOut LED_RED(p17);
coyle19 0:2e7acdee8267 10 DigitalOut LED_GREEN(p18);
coyle19 0:2e7acdee8267 11 DigitalOut LED_BLUE(p19);
coyle19 0:2e7acdee8267 12 AnalogIn randSeed(p20);
coyle19 0:2e7acdee8267 13 uLCD_4DGL myLCD(p9,p10,p11);
coyle19 0:2e7acdee8267 14
coyle19 0:2e7acdee8267 15 DigitalOut myled(LED1);
coyle19 0:2e7acdee8267 16
coyle19 0:2e7acdee8267 17 char letters[26] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z'};
coyle19 0:2e7acdee8267 18 int scores[3] = {7, 5, 3};
coyle19 0:2e7acdee8267 19 string names[3] = {"Comp1", "Comp2", "Comp3"};
coyle19 0:2e7acdee8267 20
coyle19 0:2e7acdee8267 21
coyle19 0:2e7acdee8267 22 int invert(int value);
coyle19 0:2e7acdee8267 23 void inputName(int);
coyle19 0:2e7acdee8267 24 void pb1_hit_callback(void);
coyle19 0:2e7acdee8267 25 void pb2_hit_callback(void);
coyle19 0:2e7acdee8267 26 void pb3_hit_callback(void);
coyle19 0:2e7acdee8267 27 void pb4_hit_callback(void);
coyle19 0:2e7acdee8267 28 void createSequence(int *Sequence, int length);
coyle19 0:2e7acdee8267 29 void startScreen();
coyle19 0:2e7acdee8267 30 void displayHighScores();
coyle19 0:2e7acdee8267 31
coyle19 0:2e7acdee8267 32 DebounceIn pb1(p21);
coyle19 0:2e7acdee8267 33 DebounceIn pb2(p22);
coyle19 0:2e7acdee8267 34 DebounceIn pb3(p23);
coyle19 0:2e7acdee8267 35 //DebounceIn pb4(p24);
coyle19 0:2e7acdee8267 36
coyle19 0:2e7acdee8267 37 // array for pattern
coyle19 0:2e7acdee8267 38 int Sequence[SEQ_LEN];
coyle19 0:2e7acdee8267 39
coyle19 0:2e7acdee8267 40 int main()
coyle19 0:2e7acdee8267 41 {
coyle19 0:2e7acdee8267 42 pb1.mode(PullUp);
coyle19 0:2e7acdee8267 43 pb2.mode(PullUp);
coyle19 0:2e7acdee8267 44 pb3.mode(PullUp);
coyle19 0:2e7acdee8267 45 //pb4.mode(PullUp);
coyle19 0:2e7acdee8267 46 while(1) {
coyle19 0:2e7acdee8267 47 //loop
coyle19 0:2e7acdee8267 48 myLCD.cls();
coyle19 0:2e7acdee8267 49 startScreen();
coyle19 0:2e7acdee8267 50 int val1, val2, val3,Num;
coyle19 0:2e7acdee8267 51 int length = 1;
coyle19 0:2e7acdee8267 52 int Tally = 0;
coyle19 0:2e7acdee8267 53 int j = 0;
coyle19 0:2e7acdee8267 54 while(1) {
coyle19 0:2e7acdee8267 55 //declares the arrays used for the game
coyle19 0:2e7acdee8267 56 int Sequence[length];
coyle19 0:2e7acdee8267 57 int Score[length];
coyle19 0:2e7acdee8267 58 int Imput[length];
coyle19 0:2e7acdee8267 59 createSequence(Sequence, length);
coyle19 0:2e7acdee8267 60 wait(1);
coyle19 0:2e7acdee8267 61 //creats a random sequence of size length
coyle19 0:2e7acdee8267 62 for(int i=0; i<length; i++) {
coyle19 0:2e7acdee8267 63 Num = Sequence[i];
coyle19 0:2e7acdee8267 64 if(Num == 0) {
coyle19 0:2e7acdee8267 65 LED_RED = 1;
coyle19 0:2e7acdee8267 66 Score[i] = 0;
coyle19 0:2e7acdee8267 67 wait(0.4);
coyle19 0:2e7acdee8267 68 LED_RED = 0;
coyle19 0:2e7acdee8267 69 wait(0.4);
coyle19 0:2e7acdee8267 70 }
coyle19 0:2e7acdee8267 71 if(Num == 1) {
coyle19 0:2e7acdee8267 72 LED_GREEN = 1;
coyle19 0:2e7acdee8267 73 Score[i] = 1;
coyle19 0:2e7acdee8267 74 wait(0.4);
coyle19 0:2e7acdee8267 75 LED_GREEN = 0;
coyle19 0:2e7acdee8267 76 wait(0.4);
coyle19 0:2e7acdee8267 77 }
coyle19 0:2e7acdee8267 78 if(Num == 2) {
coyle19 0:2e7acdee8267 79 LED_BLUE = 1;
coyle19 0:2e7acdee8267 80 Score[i] = 2;
coyle19 0:2e7acdee8267 81 wait(0.4);
coyle19 0:2e7acdee8267 82 LED_BLUE = 0;
coyle19 0:2e7acdee8267 83 wait(0.4);
coyle19 0:2e7acdee8267 84 }
coyle19 0:2e7acdee8267 85 }
coyle19 0:2e7acdee8267 86 // allows the user to imput the random pattern
coyle19 0:2e7acdee8267 87 while(1) {
coyle19 0:2e7acdee8267 88 // pushbuttons pull low when pressed, so invert them
coyle19 0:2e7acdee8267 89 val1 = invert(pb1.read());
coyle19 0:2e7acdee8267 90 val2 = invert(pb2.read());
coyle19 0:2e7acdee8267 91 val3 = invert(pb3.read());
coyle19 0:2e7acdee8267 92 //val4 = invert(pb4.read());
coyle19 0:2e7acdee8267 93
coyle19 0:2e7acdee8267 94 if(val1) {
coyle19 0:2e7acdee8267 95 pb1_hit_callback();
coyle19 0:2e7acdee8267 96 Imput[j] = 0;
coyle19 0:2e7acdee8267 97 j=j+1;
coyle19 0:2e7acdee8267 98 }
coyle19 0:2e7acdee8267 99 if(val2) {
coyle19 0:2e7acdee8267 100 pb2_hit_callback();
coyle19 0:2e7acdee8267 101 Imput[j] = 1;
coyle19 0:2e7acdee8267 102 j=j+1;
coyle19 0:2e7acdee8267 103 }
coyle19 0:2e7acdee8267 104 if(val3) {
coyle19 0:2e7acdee8267 105 pb3_hit_callback();
coyle19 0:2e7acdee8267 106 Imput[j] = 2;
coyle19 0:2e7acdee8267 107 j=j+1;
coyle19 0:2e7acdee8267 108 }
coyle19 0:2e7acdee8267 109 if(j == length) {
coyle19 0:2e7acdee8267 110 j = 0;
coyle19 0:2e7acdee8267 111 break;
coyle19 0:2e7acdee8267 112 }
coyle19 0:2e7acdee8267 113 }
coyle19 0:2e7acdee8267 114
coyle19 0:2e7acdee8267 115 // if wrong end the game
coyle19 0:2e7acdee8267 116 for(int i=0; i<length; i++) {
coyle19 0:2e7acdee8267 117 if(Score[i] != Imput[i]) {
coyle19 0:2e7acdee8267 118 inputName(Tally);
coyle19 0:2e7acdee8267 119 length = 1;
coyle19 0:2e7acdee8267 120 Tally = 0;
coyle19 0:2e7acdee8267 121 displayHighScores();
coyle19 0:2e7acdee8267 122 wait(4);
coyle19 0:2e7acdee8267 123 startScreen();
coyle19 0:2e7acdee8267 124 break;
coyle19 0:2e7acdee8267 125 }
coyle19 0:2e7acdee8267 126 //if correct add to score and add one to sequence size
coyle19 0:2e7acdee8267 127 if(i == length - 1) {
coyle19 0:2e7acdee8267 128 Tally = Tally + 1;
coyle19 0:2e7acdee8267 129 length++;
coyle19 0:2e7acdee8267 130 break;
coyle19 0:2e7acdee8267 131 }
coyle19 0:2e7acdee8267 132 } // end of For
coyle19 0:2e7acdee8267 133 } // End of While
coyle19 0:2e7acdee8267 134 }//End of First While
coyle19 0:2e7acdee8267 135 }//End of Main
coyle19 0:2e7acdee8267 136
coyle19 0:2e7acdee8267 137 //function to perform bitwise inversion
coyle19 0:2e7acdee8267 138 int invert(int value)
coyle19 0:2e7acdee8267 139 {
coyle19 0:2e7acdee8267 140 if (value == 0) {
coyle19 0:2e7acdee8267 141 return 1;
coyle19 0:2e7acdee8267 142 } else {
coyle19 0:2e7acdee8267 143 return 0;
coyle19 0:2e7acdee8267 144 }
coyle19 0:2e7acdee8267 145 }
coyle19 0:2e7acdee8267 146
coyle19 0:2e7acdee8267 147 //create a sequence and store in Sequence[]
coyle19 0:2e7acdee8267 148 void createSequence(int *Sequence, int length)
coyle19 0:2e7acdee8267 149 {
coyle19 0:2e7acdee8267 150 srand((int ) (randSeed * 50000)); // seed the pseudo-random number generator with electrical noise from a pin
coyle19 0:2e7acdee8267 151 for(int i=0; i<length; i++) {
coyle19 0:2e7acdee8267 152 Sequence[i] = rand() % 3;
coyle19 0:2e7acdee8267 153 }
coyle19 0:2e7acdee8267 154 }
coyle19 0:2e7acdee8267 155
coyle19 0:2e7acdee8267 156 //functions to call when a pushbutton is pressed
coyle19 0:2e7acdee8267 157 void pb1_hit_callback (void)
coyle19 0:2e7acdee8267 158 {
coyle19 0:2e7acdee8267 159 LED_RED = 1;
coyle19 0:2e7acdee8267 160 wait(0.2);
coyle19 0:2e7acdee8267 161 LED_RED = 0;
coyle19 0:2e7acdee8267 162 wait(0.2);
coyle19 0:2e7acdee8267 163 }
coyle19 0:2e7acdee8267 164 void pb2_hit_callback (void)
coyle19 0:2e7acdee8267 165 {
coyle19 0:2e7acdee8267 166 LED_GREEN = 1;
coyle19 0:2e7acdee8267 167 wait(0.2);
coyle19 0:2e7acdee8267 168 LED_GREEN = 0;
coyle19 0:2e7acdee8267 169 wait(0.2);
coyle19 0:2e7acdee8267 170 }
coyle19 0:2e7acdee8267 171 void pb3_hit_callback (void)
coyle19 0:2e7acdee8267 172 {
coyle19 0:2e7acdee8267 173 LED_BLUE = 1;
coyle19 0:2e7acdee8267 174 wait(0.2);
coyle19 0:2e7acdee8267 175 LED_BLUE = 0;
coyle19 0:2e7acdee8267 176 wait(0.2);
coyle19 0:2e7acdee8267 177 }
coyle19 0:2e7acdee8267 178
coyle19 0:2e7acdee8267 179 void startScreen()
coyle19 0:2e7acdee8267 180 {
coyle19 0:2e7acdee8267 181 myLCD.cls();
coyle19 0:2e7acdee8267 182 myLCD.text_width(2);
coyle19 0:2e7acdee8267 183 myLCD.text_height(2);
coyle19 0:2e7acdee8267 184 myLCD.text_string("PRESS OK", 1, 2, FONT_7X8, GREEN);
coyle19 0:2e7acdee8267 185 myLCD.text_string("TO START", 1, 3, FONT_7X8, GREEN);
coyle19 0:2e7acdee8267 186 int Start;
coyle19 0:2e7acdee8267 187 int a = 0;
coyle19 0:2e7acdee8267 188 while(1) {
coyle19 0:2e7acdee8267 189 Start = invert(pb1.read());
coyle19 0:2e7acdee8267 190 if(Start) {
coyle19 0:2e7acdee8267 191 displayHighScores();
coyle19 0:2e7acdee8267 192 a++;
coyle19 0:2e7acdee8267 193 }
coyle19 0:2e7acdee8267 194 if(a == 1) {
coyle19 0:2e7acdee8267 195 a = 0;
coyle19 0:2e7acdee8267 196 wait(.5);
coyle19 0:2e7acdee8267 197 break;
coyle19 0:2e7acdee8267 198 }
coyle19 0:2e7acdee8267 199 }
coyle19 0:2e7acdee8267 200 return;
coyle19 0:2e7acdee8267 201 }
coyle19 0:2e7acdee8267 202
coyle19 0:2e7acdee8267 203 void displayHighScores()
coyle19 0:2e7acdee8267 204 {
coyle19 0:2e7acdee8267 205 int max = 0;
coyle19 0:2e7acdee8267 206 int min = 0;
coyle19 0:2e7acdee8267 207 for (int i = 0; i < 3; ++i) {
coyle19 0:2e7acdee8267 208 if (scores[min] > scores[i]) min = i;
coyle19 0:2e7acdee8267 209 if (scores[max] < scores[i]) max = i;
coyle19 0:2e7acdee8267 210 }
coyle19 0:2e7acdee8267 211 int mid;
coyle19 0:2e7acdee8267 212
coyle19 0:2e7acdee8267 213 int sum = max + min;
coyle19 0:2e7acdee8267 214 if (max == min) {
coyle19 0:2e7acdee8267 215 mid = 1;
coyle19 0:2e7acdee8267 216 max = 2;
coyle19 0:2e7acdee8267 217 } else if (sum == 1) {
coyle19 0:2e7acdee8267 218 mid = 2;
coyle19 0:2e7acdee8267 219 } else if (sum == 2) {
coyle19 0:2e7acdee8267 220 mid = 1;
coyle19 0:2e7acdee8267 221 } else if (sum == 3) {
coyle19 0:2e7acdee8267 222 mid = 0;
coyle19 0:2e7acdee8267 223 }
coyle19 0:2e7acdee8267 224 myLCD.cls();
coyle19 0:2e7acdee8267 225 myLCD.printf("HIGH SCORES\n");
coyle19 0:2e7acdee8267 226 string s1 = string(names[max]);
coyle19 0:2e7acdee8267 227 myLCD.printf("1. %s - %d\n", string(names[max]), scores[max]);
coyle19 0:2e7acdee8267 228 myLCD.printf("2. %s - %d\n", string(names[mid]), scores[mid]);
coyle19 0:2e7acdee8267 229 myLCD.printf("3. %s - %d\n", string(names[min]), scores[min]);
coyle19 0:2e7acdee8267 230
coyle19 0:2e7acdee8267 231 //myLCD.text_string("HIGH SCORES", 1, 1, FONT_7X8, RED);
coyle19 0:2e7acdee8267 232 //myLCD.text_string("HALLO", 1, 2, FONT_7X8, RED);
coyle19 0:2e7acdee8267 233
coyle19 0:2e7acdee8267 234 /*myLCD.text_string(("1. %s - %d", names[max], scores[max]), 1, 2, FONT_7X8, WHITE);
coyle19 0:2e7acdee8267 235 myLCD.text_string(("2. %s - %d", names[mid], scores[mid]), 1, 3, FONT_7X8, WHITE);
coyle19 0:2e7acdee8267 236 myLCD.text_string(("3. %s - %d", names[min], scores[min]), 1, 4, FONT_7X8, WHITE);*/
coyle19 0:2e7acdee8267 237
coyle19 0:2e7acdee8267 238 return;
coyle19 0:2e7acdee8267 239
coyle19 0:2e7acdee8267 240 }
coyle19 0:2e7acdee8267 241
coyle19 0:2e7acdee8267 242 void inputName(int score)
coyle19 0:2e7acdee8267 243 {
coyle19 0:2e7acdee8267 244
coyle19 0:2e7acdee8267 245
coyle19 0:2e7acdee8267 246 bool bigger = false;
coyle19 0:2e7acdee8267 247 for (int i = 0; i < 3; ++i) {
coyle19 0:2e7acdee8267 248 if (scores[i] < score) {
coyle19 0:2e7acdee8267 249 bigger = true;
coyle19 0:2e7acdee8267 250 }
coyle19 0:2e7acdee8267 251 }
coyle19 0:2e7acdee8267 252
coyle19 0:2e7acdee8267 253 if (bigger != true) {
coyle19 0:2e7acdee8267 254 return;
coyle19 0:2e7acdee8267 255 }
coyle19 0:2e7acdee8267 256
coyle19 0:2e7acdee8267 257 int letterPointer = 0;
coyle19 0:2e7acdee8267 258 int namePointer = 0;
coyle19 0:2e7acdee8267 259 int okay;
coyle19 0:2e7acdee8267 260 int forward;
coyle19 0:2e7acdee8267 261 int backward;
coyle19 0:2e7acdee8267 262 char name[3] = {'A', 'A', 'A'};
coyle19 0:2e7acdee8267 263 myLCD.cls();
coyle19 0:2e7acdee8267 264 myLCD.printf("Score: \t %d", score);
coyle19 0:2e7acdee8267 265 myLCD.text_width(4);
coyle19 0:2e7acdee8267 266 myLCD.text_height(4);
coyle19 0:2e7acdee8267 267
coyle19 0:2e7acdee8267 268 while(1) {
coyle19 0:2e7acdee8267 269
coyle19 0:2e7acdee8267 270 char c = letters[letterPointer];
coyle19 0:2e7acdee8267 271 myLCD.text_string(&c, 2, 2, FONT_7X8, RED);
coyle19 0:2e7acdee8267 272 //myLCD.text_string(name, 1, 1, FONT_7X8, RED);
coyle19 0:2e7acdee8267 273
coyle19 0:2e7acdee8267 274 okay = invert(pb1.read());
coyle19 0:2e7acdee8267 275 forward = invert(pb2.read());
coyle19 0:2e7acdee8267 276 backward = invert(pb3.read());
coyle19 0:2e7acdee8267 277 if (backward) {
coyle19 0:2e7acdee8267 278 if (letterPointer == 0) {
coyle19 0:2e7acdee8267 279 wait(0.2);
coyle19 0:2e7acdee8267 280 letterPointer = 25;
coyle19 0:2e7acdee8267 281
coyle19 0:2e7acdee8267 282 } else {
coyle19 0:2e7acdee8267 283 wait(0.2);
coyle19 0:2e7acdee8267 284 --letterPointer;
coyle19 0:2e7acdee8267 285 }
coyle19 0:2e7acdee8267 286 }
coyle19 0:2e7acdee8267 287 if (forward) {
coyle19 0:2e7acdee8267 288 if (letterPointer == 25) {
coyle19 0:2e7acdee8267 289 wait(0.2);
coyle19 0:2e7acdee8267 290 letterPointer = 0;
coyle19 0:2e7acdee8267 291 } else {
coyle19 0:2e7acdee8267 292 wait(0.2);
coyle19 0:2e7acdee8267 293 ++letterPointer;
coyle19 0:2e7acdee8267 294 }
coyle19 0:2e7acdee8267 295 }
coyle19 0:2e7acdee8267 296 if (okay) {
coyle19 0:2e7acdee8267 297 wait(0.2);
coyle19 0:2e7acdee8267 298 name[namePointer] = letters[letterPointer];
coyle19 0:2e7acdee8267 299 myLCD.text_string(&c, 2, 2, FONT_7X8, BLUE);
coyle19 0:2e7acdee8267 300
coyle19 0:2e7acdee8267 301 if (namePointer < 2) {
coyle19 0:2e7acdee8267 302 ++namePointer;
coyle19 0:2e7acdee8267 303 } else {
coyle19 0:2e7acdee8267 304 int mini = 0;
coyle19 0:2e7acdee8267 305 for (int i = 0; i < 3; ++i) {
coyle19 0:2e7acdee8267 306 if (scores[mini] > scores[i]) mini = i;
coyle19 0:2e7acdee8267 307 }
coyle19 0:2e7acdee8267 308 names[mini] = name;
coyle19 0:2e7acdee8267 309 scores[mini] = score;
coyle19 0:2e7acdee8267 310 myLCD.text_string(name, 1, 2, FONT_7X8, GREEN);
coyle19 0:2e7acdee8267 311 return;
coyle19 0:2e7acdee8267 312 }
coyle19 0:2e7acdee8267 313
coyle19 0:2e7acdee8267 314 }
coyle19 0:2e7acdee8267 315 }
coyle19 0:2e7acdee8267 316 }