A simple memory game for the mbed controller

Dependencies:   C12832_lcd mbed

Fork of HelloWorld by Simon Ford

Committer:
RaxXo
Date:
Fri Feb 14 00:36:26 2014 +0000
Revision:
2:1ebddf831e05
Parent:
0:fb6bbc10ffa0
Simon Game

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simon 0:fb6bbc10ffa0 1 #include "mbed.h"
RaxXo 2:1ebddf831e05 2 #include "C12832_lcd.h"
RaxXo 2:1ebddf831e05 3 #include <stdlib.h>
RaxXo 2:1ebddf831e05 4
RaxXo 2:1ebddf831e05 5
RaxXo 2:1ebddf831e05 6 #define MAX_ROUNDS 100
RaxXo 2:1ebddf831e05 7 #define SEED_COUNT 8
RaxXo 2:1ebddf831e05 8
RaxXo 2:1ebddf831e05 9 C12832_LCD lcd;
RaxXo 2:1ebddf831e05 10 DigitalOut led1(LED1);
RaxXo 2:1ebddf831e05 11 DigitalOut led2(LED2);
RaxXo 2:1ebddf831e05 12 DigitalOut led3(LED3);
RaxXo 2:1ebddf831e05 13 DigitalOut led4(LED4);
RaxXo 2:1ebddf831e05 14
RaxXo 2:1ebddf831e05 15 PwmOut spkr(p26);
RaxXo 2:1ebddf831e05 16
RaxXo 2:1ebddf831e05 17 DigitalIn down(p12);
RaxXo 2:1ebddf831e05 18 DigitalIn up(p15);
RaxXo 2:1ebddf831e05 19 DigitalIn left(p13);
RaxXo 2:1ebddf831e05 20 DigitalIn right(p16);
RaxXo 2:1ebddf831e05 21
RaxXo 2:1ebddf831e05 22 DigitalIn middle(p14);
RaxXo 2:1ebddf831e05 23
RaxXo 2:1ebddf831e05 24 void play(float val){
RaxXo 2:1ebddf831e05 25 spkr.period(1.0/val);
RaxXo 2:1ebddf831e05 26 spkr=0.5;
RaxXo 2:1ebddf831e05 27 wait(0.2);
RaxXo 2:1ebddf831e05 28 spkr=0.0;
RaxXo 2:1ebddf831e05 29 }
RaxXo 2:1ebddf831e05 30
RaxXo 2:1ebddf831e05 31
RaxXo 2:1ebddf831e05 32 void tone1(){
RaxXo 2:1ebddf831e05 33 lcd.fillcircle(63,25,5,1);
RaxXo 2:1ebddf831e05 34 play(2000);
RaxXo 2:1ebddf831e05 35 lcd.cls();
RaxXo 2:1ebddf831e05 36 }
RaxXo 2:1ebddf831e05 37
RaxXo 2:1ebddf831e05 38 void tone2(){
RaxXo 2:1ebddf831e05 39 lcd.locate(0,10);
RaxXo 2:1ebddf831e05 40 lcd.fillcircle(5,15,5,1);
RaxXo 2:1ebddf831e05 41 play(2250);
RaxXo 2:1ebddf831e05 42 lcd.cls();
RaxXo 2:1ebddf831e05 43 }
simon 0:fb6bbc10ffa0 44
RaxXo 2:1ebddf831e05 45 void tone3(){
RaxXo 2:1ebddf831e05 46 lcd.fillcircle(63,5,5,1);
RaxXo 2:1ebddf831e05 47 play(2500);
RaxXo 2:1ebddf831e05 48 lcd.cls();
RaxXo 2:1ebddf831e05 49 }
RaxXo 2:1ebddf831e05 50
RaxXo 2:1ebddf831e05 51 void tone4(){
RaxXo 2:1ebddf831e05 52 lcd.fillcircle(122,15,5,1);
RaxXo 2:1ebddf831e05 53 play(2650);
RaxXo 2:1ebddf831e05 54 lcd.cls();
RaxXo 2:1ebddf831e05 55 }
RaxXo 2:1ebddf831e05 56
RaxXo 2:1ebddf831e05 57
RaxXo 2:1ebddf831e05 58 int round = 1;
RaxXo 2:1ebddf831e05 59 int sequence[MAX_ROUNDS];
RaxXo 2:1ebddf831e05 60
RaxXo 2:1ebddf831e05 61 int seed(){
RaxXo 2:1ebddf831e05 62 lcd.cls();
RaxXo 2:1ebddf831e05 63 lcd.printf("Seed by moving the joystick in any direction");
RaxXo 2:1ebddf831e05 64 lcd.locate(0,20);
RaxXo 2:1ebddf831e05 65
RaxXo 2:1ebddf831e05 66 lcd.printf("%d",SEED_COUNT);
RaxXo 2:1ebddf831e05 67 lcd.locate(10,20);
RaxXo 2:1ebddf831e05 68 lcd.printf("times.");
RaxXo 2:1ebddf831e05 69
RaxXo 2:1ebddf831e05 70 int i=0;
RaxXo 2:1ebddf831e05 71 int x=1;
RaxXo 2:1ebddf831e05 72 while(i<SEED_COUNT){
RaxXo 2:1ebddf831e05 73 if(down){
RaxXo 2:1ebddf831e05 74 x=x*37;
RaxXo 2:1ebddf831e05 75 i++;
RaxXo 2:1ebddf831e05 76 }
RaxXo 2:1ebddf831e05 77 if(left){
RaxXo 2:1ebddf831e05 78 x=x*135;
RaxXo 2:1ebddf831e05 79 i++;
RaxXo 2:1ebddf831e05 80 }
RaxXo 2:1ebddf831e05 81 if(up){
RaxXo 2:1ebddf831e05 82 x=x+31;
RaxXo 2:1ebddf831e05 83 i++;
RaxXo 2:1ebddf831e05 84 }
RaxXo 2:1ebddf831e05 85 if(right){
RaxXo 2:1ebddf831e05 86 x=x+781;
RaxXo 2:1ebddf831e05 87 i++;
RaxXo 2:1ebddf831e05 88 }
RaxXo 2:1ebddf831e05 89 lcd.locate(0,20);
RaxXo 2:1ebddf831e05 90 lcd.printf("%d",SEED_COUNT-i);
RaxXo 2:1ebddf831e05 91 wait(0.2);
RaxXo 2:1ebddf831e05 92 }
RaxXo 2:1ebddf831e05 93 return x;
RaxXo 2:1ebddf831e05 94 }
simon 0:fb6bbc10ffa0 95
RaxXo 2:1ebddf831e05 96 int main(){
RaxXo 2:1ebddf831e05 97 srand(seed());
RaxXo 2:1ebddf831e05 98 lcd.cls();
RaxXo 2:1ebddf831e05 99 lcd.locate(0,0);
RaxXo 2:1ebddf831e05 100 lcd.printf("Game start!");
RaxXo 2:1ebddf831e05 101 wait(2);
RaxXo 2:1ebddf831e05 102 lcd.cls();
RaxXo 2:1ebddf831e05 103 int check = 0;
RaxXo 2:1ebddf831e05 104 bool failed = false;
RaxXo 2:1ebddf831e05 105 while(round<MAX_ROUNDS){
RaxXo 2:1ebddf831e05 106 bool done = false;
RaxXo 2:1ebddf831e05 107 lcd.cls();
RaxXo 2:1ebddf831e05 108
RaxXo 2:1ebddf831e05 109 //Play the generated sequence
RaxXo 2:1ebddf831e05 110 sequence[round-1] = rand() % 4;
RaxXo 2:1ebddf831e05 111 for(int i=0; i<round; i++){
RaxXo 2:1ebddf831e05 112 switch(sequence[i]){
RaxXo 2:1ebddf831e05 113 case 0:
RaxXo 2:1ebddf831e05 114 tone1();
RaxXo 2:1ebddf831e05 115 break;
RaxXo 2:1ebddf831e05 116 case 1:
RaxXo 2:1ebddf831e05 117 tone2();
RaxXo 2:1ebddf831e05 118 break;
RaxXo 2:1ebddf831e05 119 case 2:
RaxXo 2:1ebddf831e05 120 tone3();
RaxXo 2:1ebddf831e05 121 break;
RaxXo 2:1ebddf831e05 122 case 3:
RaxXo 2:1ebddf831e05 123 tone4();
RaxXo 2:1ebddf831e05 124 break;
RaxXo 2:1ebddf831e05 125 };
RaxXo 2:1ebddf831e05 126 wait(0.2);
RaxXo 2:1ebddf831e05 127 }
RaxXo 2:1ebddf831e05 128
RaxXo 2:1ebddf831e05 129 //Imitate the sequence
RaxXo 2:1ebddf831e05 130 check=0;
RaxXo 2:1ebddf831e05 131 while(!done){
RaxXo 2:1ebddf831e05 132 if(down){
RaxXo 2:1ebddf831e05 133 tone1();
RaxXo 2:1ebddf831e05 134 if(sequence[check] == 0){
RaxXo 2:1ebddf831e05 135 failed = false;
RaxXo 2:1ebddf831e05 136 check++;
RaxXo 2:1ebddf831e05 137 }else{
RaxXo 2:1ebddf831e05 138 failed = true;
RaxXo 2:1ebddf831e05 139 done = true;
RaxXo 2:1ebddf831e05 140 }
RaxXo 2:1ebddf831e05 141 }
RaxXo 2:1ebddf831e05 142 if(left){
RaxXo 2:1ebddf831e05 143 tone2();
RaxXo 2:1ebddf831e05 144 if(sequence[check] == 1){
RaxXo 2:1ebddf831e05 145 failed = false;
RaxXo 2:1ebddf831e05 146 check++;
RaxXo 2:1ebddf831e05 147 }else{
RaxXo 2:1ebddf831e05 148 failed = true;
RaxXo 2:1ebddf831e05 149 done = true;
RaxXo 2:1ebddf831e05 150 }
RaxXo 2:1ebddf831e05 151 }
RaxXo 2:1ebddf831e05 152 if(up){
RaxXo 2:1ebddf831e05 153 tone3();
RaxXo 2:1ebddf831e05 154 if(sequence[check] == 2){
RaxXo 2:1ebddf831e05 155 failed = false;
RaxXo 2:1ebddf831e05 156 check++;
RaxXo 2:1ebddf831e05 157 }else{
RaxXo 2:1ebddf831e05 158 failed = true;
RaxXo 2:1ebddf831e05 159 done = true;
RaxXo 2:1ebddf831e05 160 }
RaxXo 2:1ebddf831e05 161 }
RaxXo 2:1ebddf831e05 162 if(right){
RaxXo 2:1ebddf831e05 163 tone4();
RaxXo 2:1ebddf831e05 164 if(sequence[check] == 3){
RaxXo 2:1ebddf831e05 165 failed = false;
RaxXo 2:1ebddf831e05 166 check++;
RaxXo 2:1ebddf831e05 167 }else{
RaxXo 2:1ebddf831e05 168 failed = true;
RaxXo 2:1ebddf831e05 169 done = true;
RaxXo 2:1ebddf831e05 170 }
RaxXo 2:1ebddf831e05 171 }
RaxXo 2:1ebddf831e05 172 if(check==round)
RaxXo 2:1ebddf831e05 173 done = true;
RaxXo 2:1ebddf831e05 174 wait(0.2);
RaxXo 2:1ebddf831e05 175 }
RaxXo 2:1ebddf831e05 176 //Fail -> Restart
RaxXo 2:1ebddf831e05 177 if(done && failed){
RaxXo 2:1ebddf831e05 178 lcd.locate(0,0);
RaxXo 2:1ebddf831e05 179 lcd.printf("You lost on round %d, restarting!", round);
RaxXo 2:1ebddf831e05 180 wait(1);
RaxXo 2:1ebddf831e05 181 round=0;
RaxXo 2:1ebddf831e05 182 //Succeed -> Continue
RaxXo 2:1ebddf831e05 183 }else{
RaxXo 2:1ebddf831e05 184 lcd.locate(0,0);
RaxXo 2:1ebddf831e05 185 lcd.printf("Round %d cleared!", round);
RaxXo 2:1ebddf831e05 186
RaxXo 2:1ebddf831e05 187 }
RaxXo 2:1ebddf831e05 188 wait(1);
RaxXo 2:1ebddf831e05 189 round++;
simon 0:fb6bbc10ffa0 190 }
RaxXo 2:1ebddf831e05 191 }