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

Revision:
1:fb29354d9073
Parent:
0:d53b17bb7ffa
Child:
2:0b6e10420ce2
--- a/Simon.cpp	Tue Feb 03 13:01:28 2015 +0000
+++ b/Simon.cpp	Wed Feb 04 09:12:38 2015 +0000
@@ -5,80 +5,77 @@
 #include <cstdlib>
 
 
-DigitalOut Simon::leds[4] = {LED1, LED2, LED3, LED4}; 
-PinDetect Simon::button[4] = {p12, p13, p14, p15};
+DigitalOut Simon::led[4] = {LED1, LED2, LED3, LED4}; 
+PinDetect Simon::button[5] = {p12, p13, p14, p15, p16};
 
 Simon::Simon() : queue(turn) {   
-    LEDSOn();
-    wait(0.4);
-    LEDSOff();
-    for(i = 0; i < 4; i++) {
+    LEDSBlink();
+    button_press = false;
+    run = false;
+    button[0].attach_asserted(this, &Simon::keyPressedSt);
+    button[1].attach_asserted(this, &Simon::keyPressedNd); 
+    button[2].attach_asserted(this, &Simon::keyPressedRd);
+    button[3].attach_asserted(this, &Simon::keyPressedTh);
+    button[4].attach_asserted(this, &Simon::ReStart);
+    for(i = 0; i < 5; i++) {
         button[i].mode( PullDown );
-        switch (i) {
-            case 0:
-            button[i].attach_asserted(this, &Simon::keyPressedSt); 
-            break;
-            case 1:
-            button[i].attach_asserted(this, &Simon::keyPressedNd);
-            break;
-            case 2:
-            button[i].attach_asserted(this, &Simon::keyPressedRd);
-            break;
-            case 3:
-            button[i].attach_asserted(this, &Simon::keyPressedTh);
-            break;    
-        }
         button[i].setSampleFrequency();
     }
 }
-int Simon::TestQueue(int i) {
+
+void Simon::gameStart(int firstTurn) {
+    turn = firstTurn;
+    while(1) {
+        while(run == true) {
+            newQueue();
+            showQueue();
+            run = userTurn(); 
+        }
+    }
+}   
+
+int Simon::testQueue() {
     if (queue[i] == test_val) {
-        leds[queue[i]] = 1;
+        led[queue[i]] = 1;
         wait(0.2);
-        leds[queue[i]] = 0;
+        led[queue[i]] = 0;
         return 1;
     }
     else return 0;   
 } 
 
-void Simon::LEDSOn() {
-    for(i = 0; i < 4; i++)  leds[i] = 1;
+void Simon::LEDSBlink() {
+    for(i = 0; i < 4; i++)  led[i] = 1;
+    wait(0.4);
+    for(i = 0; i < 4; i++)  led[i] = 0;
 }
 
-void Simon::LEDSOff() {
-    for(i = 0; i < 4; i++)  leds[i] = 0;
-}
-
-void Simon::newQueue() {   
+void Simon::newQueue() {  
     for(i = 0; i < turn; i++) queue[i] = rand() % 4;                  
 }
 
 void Simon::showQueue() {
      wait(0.2);
      for(i = 0; i < turn; i++) {
-        leds[queue[i]] = 1;
+        led[queue[i]] = 1;
         wait(0.5);
-        leds[queue[i]] = 0;
+        led[queue[i]] = 0;
         wait(0.1);   
     }   
 }
 
 bool Simon::userTurn() {
-    LEDSOn();
-    wait(0.5);
-    LEDSOff();
+    LEDSBlink();
     i = 0;
     while(i < turn){
         if (button_press == 1) {
-            if (TestQueue(i) == 0) {
+            if (testQueue() == 0) {
                 i = turn;
                 button_press = 0;
-                LEDSOn();/* Indication of Game Over */
-                wait(0.4);
-                LEDSOff();
+                LEDSBlink();/* Indication of Game Over */
                 return false;
             }  
-            else if (TestQueue(i) == 1) {
+            else if (testQueue() == 1) {
                 i++;
                 button_press = 0;
             }
@@ -88,22 +85,26 @@
     return true;  
 } 
 
-void Simon::keyPressedSt(void) {
+void Simon::keyPressedSt() {
     button_press = 1;
     test_val = 0;
 }
 
-void Simon::keyPressedNd(void) {
+void Simon::keyPressedNd() {
     button_press = 1;
     test_val = 1;
 }
 
-void Simon::keyPressedRd(void) {
+void Simon::keyPressedRd() {
     button_press = 1;
     test_val = 2;    
 }
 
-void Simon::keyPressedTh(void) {
+void Simon::keyPressedTh() {
     button_press = 1;
     test_val = 3;  
+}
+
+void Simon:: ReStart() {
+    run = true;        
 }
\ No newline at end of file