Rhythm game with mbed

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed wave_player

Revision:
0:40c6dc4c379b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhythm.cpp	Tue Nov 01 02:11:22 2016 +0000
@@ -0,0 +1,685 @@
+#include "mbed.h"
+#include "uLCD_4DGL.h"
+#include <stdlib.h>
+#include "rhythm.h"
+#include "SDFileSystem.h"
+#include "wave_player.h"
+
+Rhythm::Rhythm() 
+{
+sd = new SDFileSystem(p5, p6, p7, p8, "sd");
+DACout = new AnalogOut(p18);
+waver = new wave_player(DACout);
+uLCD = new uLCD_4DGL(p13,p14,p12);
+Up = new DigitalIn(p24);
+Left = new DigitalIn(p26);
+Right = new DigitalIn(p28);
+Center = new DigitalIn(p25);
+Down = new DigitalIn(p27);
+up = false;
+down = false;
+left = false;
+right = false;
+center = false;
+score = 0;
+endloop = 0; 
+random_number = 0;
+shape_color = 0;
+average_reaction_time = 0;
+}
+
+void Rhythm::drawBorder() {
+    //Left side 1
+    uLCD->line(0, 0, 10, 16, RED);
+    uLCD->line(10, 16, 0, 32, GREEN);
+    uLCD->line(0, 32, 10, 48, BLUE);
+    uLCD->line(10, 48, 0, 64, RED);
+    uLCD->line(0, 64, 10, 80, GREEN);
+    uLCD->line(10, 80, 0, 96, BLUE);
+    uLCD->line(0, 96, 10, 112, RED);
+    uLCD->line(10, 112, 0, 128, GREEN);
+    //Left side 2
+    uLCD->line(10, 0, 0, 16, GREEN);
+    uLCD->line(0, 16, 10, 32, BLUE);
+    uLCD->line(10, 32, 0, 48, RED);
+    uLCD->line(0, 48, 10, 64, GREEN);
+    uLCD->line(10, 64, 0, 80, BLUE);
+    uLCD->line(0, 80, 10, 96, RED);
+    uLCD->line(10, 96, 0, 112, GREEN);
+    uLCD->line(0, 112, 10, 128, BLUE);
+    //Bottom 1
+    uLCD->line(0, 128, 16, 118, BLUE);
+    uLCD->line(16, 118, 32, 128, RED);
+    uLCD->line(32, 128, 48, 118, GREEN);
+    uLCD->line(48, 118, 64, 128, BLUE);
+    uLCD->line(64, 128, 80, 118, RED);
+    uLCD->line(80, 118, 96, 128, GREEN);
+    uLCD->line(96, 128, 112, 118, BLUE);
+    uLCD->line(112, 118, 128, 128, RED);
+    //Bottom 2
+    uLCD->line(0, 118, 16, 128, RED);
+    uLCD->line(16, 128, 32, 118, GREEN);
+    uLCD->line(32, 118, 48, 128, BLUE);
+    uLCD->line(48, 128, 64, 118, RED);
+    uLCD->line(64, 118, 80, 128, GREEN);
+    uLCD->line(80, 128, 96, 118, BLUE);
+    uLCD->line(96, 118, 112, 128, RED);
+    uLCD->line(112, 128, 128, 118, GREEN);
+    //Right side 1
+    uLCD->line(128, 128, 118, 112, GREEN);
+    uLCD->line(118, 112, 128, 96, BLUE);
+    uLCD->line(128, 96, 118, 80, RED);
+    uLCD->line(118, 80, 128, 64, GREEN);
+    uLCD->line(128, 64, 118, 48, BLUE);
+    uLCD->line(118, 48, 128, 32, RED);
+    uLCD->line(128, 32, 118, 16, GREEN);
+    uLCD->line(118, 16, 128, 0, BLUE);
+    //Right side 2
+    uLCD->line(118, 128, 128, 112, BLUE);
+    uLCD->line(128, 112, 118, 96, RED);
+    uLCD->line(118, 96, 128, 80, GREEN);
+    uLCD->line(128, 80, 118, 64, BLUE);
+    uLCD->line(118, 64, 128, 48, RED);
+    uLCD->line(128, 48, 118, 32, GREEN);
+    uLCD->line(118, 32, 128, 16, BLUE);
+    uLCD->line(128, 16, 118, 0, RED);
+    //Top 1
+    uLCD->line(128, 0, 112, 10, RED);
+    uLCD->line(112, 10, 96, 0, GREEN);
+    uLCD->line(96, 0, 80, 10, BLUE);
+    uLCD->line(80, 10, 64, 0, RED);
+    uLCD->line(64, 0, 48, 10, GREEN);
+    uLCD->line(48, 10, 32, 0, BLUE);
+    uLCD->line(32, 0, 16, 10, RED);
+    uLCD->line(16, 10, 0, 0, GREEN);
+    //Top 2
+    uLCD->line(128, 10, 112, 0, GREEN);
+    uLCD->line(112, 0, 96, 10, BLUE);
+    uLCD->line(96, 10, 80, 0, RED);
+    uLCD->line(80, 0, 64, 10, GREEN);
+    uLCD->line(64, 10, 48, 0, BLUE);
+    uLCD->line(48, 0, 32, 10, RED);
+    uLCD->line(32, 10, 16, 0, GREEN);
+    uLCD->line(16, 0, 0, 10, BLUE);
+}
+
+void Rhythm::drawLevel1Screen() {
+    uLCD->cls();
+    drawBorder();
+    uLCD->text_string("Level 1", 6, 6, FONT_7X8, BLUE);
+}
+
+void Rhythm::drawLevel2Screen() {
+    uLCD->cls();
+    drawBorder();
+    uLCD->text_string("Level 2", 6, 6, FONT_7X8, GREEN);
+}    
+
+void Rhythm::drawLevel3Screen() {
+    uLCD->cls();
+    drawBorder();
+    uLCD->text_string("Level 3", 6, 6, FONT_7X8, RED);
+}
+
+void Rhythm::drawEndScreen() {
+    uLCD->cls();
+    drawBorder();
+    uLCD->text_string("Thank You", 5, 7, FONT_7X8, 0xFFFF00);
+    uLCD->text_string("For Playing", 4, 9, FONT_7X8, 0xFFFF00);
+    for (int i = 0; i < 3; i++) {
+        playMusicEnd();
+    }
+}
+
+void Rhythm::generateRandomColor() {
+    random_number = rand() % 6;
+    if (random_number == 0) {
+        shape_color = 0xFF0000;
+    } else if (random_number == 1) {
+        shape_color = 0x00FF00;
+    } else if (random_number == 2) {
+        shape_color = 0x0000FF;
+    } else if (random_number == 3) {
+        shape_color = 0xFFFF00;
+    } else if (random_number == 4) {
+        shape_color = 0x00FFFF;
+    } else if (random_number == 5) {
+        shape_color = 0xFF00FF;
+    }
+}
+
+void Rhythm::drawUpArrow() {
+    uLCD->cls();
+    generateRandomColor();
+    uLCD->filled_rectangle(60, 52, 68, 76, shape_color); 
+    for (int n = 0; n < 9; n++) {
+        uLCD->line(56 + n, 52 - n, 72 - n, 52 - n, shape_color);
+    }
+    up = true;
+    down = false;
+    left = false;
+    right = false;
+    center = false;
+}
+
+void Rhythm::drawDownArrow() {
+    uLCD->cls();
+    generateRandomColor();
+    uLCD->filled_rectangle(60, 52, 68, 76, shape_color); 
+    for (int n = 0; n < 9; n++) {
+        uLCD->line(56 + n, 76 + n, 72 - n, 76 + n, shape_color);
+    }
+    up = false;
+    down = true;
+    left = false;
+    right = false;
+    center = false;
+}
+
+void Rhythm::drawLeftArrow() {
+    uLCD->cls();
+    generateRandomColor();
+    uLCD->filled_rectangle(52, 60, 76, 68, shape_color); 
+    for (int n = 0; n < 9; n++) {
+        uLCD->line(52 - n, 56 + n, 52 - n, 72 - n, shape_color);
+    }
+    up = false;
+    down = false;
+    left = true;
+    right = false;
+    center = false;
+    
+}
+
+void Rhythm::drawRightArrow() {
+    uLCD->cls();
+    generateRandomColor();
+    uLCD->filled_rectangle(52, 60, 76, 68, shape_color); 
+    for (int n = 0; n < 9; n++) {
+        uLCD->line(76 + n, 56 + n, 76 + n, 72 - n, shape_color);
+    }
+    up = false;
+    down = false;
+    left = false;
+    right = true;
+    center = false;
+    
+}
+
+void Rhythm::drawCenterCircle() {
+    uLCD->cls();
+    generateRandomColor();
+    uLCD->filled_circle(64, 64, 15, shape_color); 
+    up = false;
+    down = false;
+    left = false;
+    right = false;
+    center = true;
+    
+}
+
+void Rhythm::getArrowDirection()
+{
+int randgen = rand() % 5;   
+if(randgen == 0)
+{
+drawUpArrow();
+}
+else if(randgen == 1)
+{
+drawDownArrow(); 
+}
+else if(randgen == 2)
+{
+drawLeftArrow();
+}
+else if(randgen == 3)
+{
+drawRightArrow();
+}
+else if(randgen == 4)
+{
+drawCenterCircle();  
+}
+t.start();
+endloop++;
+}
+
+
+void Rhythm::level1()
+{
+drawLevel1Screen();
+wait(2.0);
+getArrowDirection();
+while(endloop <= 10)
+{
+if(up && Up->read() == 0 && t.read() <= 3.0)
+{
+reaction_times[endloop - 1] = t.read();
+score++;
+t.stop();
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if(down && Down->read() == 0 && t.read() <= 3.0)
+{
+reaction_times[endloop - 1] = t.read();
+score++;
+t.stop();
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if(left && Left->read() == 0 && t.read() <= 3.0)
+{
+reaction_times[endloop - 1] = t.read();
+score++;
+t.stop();
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}  
+getArrowDirection();
+}
+else if(right && Right->read() == 0 && t.read() <= 3.0)
+{
+reaction_times[endloop - 1] = t.read();
+score++;
+t.stop();
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if(center && Center->read() == 0 && t.read() <= 3.0)
+{
+reaction_times[endloop - 1] = t.read();
+score++;
+t.stop();
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if (up && (Down->read() == 0 || Left->read() == 0 || Right->read() == 0 || Center->read() == 0)&& t.read() < 3.0)
+{
+reaction_times[endloop - 1] = t.read();
+t.stop();    
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if (down && (Up->read() == 0 || Left->read() == 0 || Right->read() == 0 || Center->read() == 0)&& t.read() < 3.0)
+{
+reaction_times[endloop - 1] = t.read();
+t.stop();    
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if (left && (Down->read() == 0 || Up->read() == 0 || Right->read() == 0 || Center->read() == 0)&& t.read() < 3.0)
+{
+reaction_times[endloop - 1] = t.read();
+t.stop();    
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if (right && (Down->read() == 0 || Left->read() == 0 || Up->read() == 0 || Center->read() == 0)&& t.read() < 3.0)
+{
+reaction_times[endloop - 1] = t.read();
+t.stop();    
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if (center && (Down->read() == 0 || Left->read() == 0 || Right->read() == 0 || Up->read() == 0) && t.read() < 3.0)
+{
+reaction_times[endloop - 1] = t.read();
+t.stop();    
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if( t.read() >= 3.0)
+{
+reaction_times[endloop - 1] = t.read();
+t.stop();
+t.reset();
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+}
+endloop = 0;
+computeAverageReactionTime();
+drawResultsScreen();
+}
+
+void Rhythm::level2()
+{
+drawLevel2Screen();
+wait(2.0);
+getArrowDirection();
+while(endloop <= 10)
+{
+if(up && Up->read() == 0 && t.read() <= 2.0)
+{
+reaction_times[endloop - 1] = t.read();
+score++;
+t.stop();
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if(down && Down->read() == 0 && t.read() <= 2.0)
+{
+reaction_times[endloop - 1] = t.read();
+score++;
+t.stop();
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if(left && Left->read() == 0 && t.read() <= 2.0)
+{
+reaction_times[endloop - 1] = t.read();
+score++;
+t.stop();
+t.reset();
+wait(0.3);  
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if(right && Right->read() == 0 && t.read() <= 2.0)
+{
+reaction_times[endloop - 1] = t.read();
+score++;
+t.stop();
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if(center && Center->read() == 0 && t.read() <= 2.0)
+{
+reaction_times[endloop - 1] = t.read();
+score++;
+t.stop();
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if (up && (Down->read() == 0 || Left->read() == 0 || Right->read() == 0 || Center->read() == 0)&& t.read() < 2.0)
+{
+reaction_times[endloop - 1] = t.read();
+t.stop();    
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if (down && (Up->read() == 0 || Left->read() == 0 || Right->read() == 0 || Center->read() == 0)&& t.read() < 2.0)
+{
+reaction_times[endloop - 1] = t.read();
+t.stop();    
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if (left && (Down->read() == 0 || Up->read() == 0 || Right->read() == 0 || Center->read() == 0)&& t.read() < 2.0)
+{
+reaction_times[endloop - 1] = t.read();
+t.stop();    
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if (right && (Down->read() == 0 || Left->read() == 0 || Up->read() == 0 || Center->read() == 0)&& t.read() < 2.0)
+{
+reaction_times[endloop - 1] = t.read();
+t.stop();    
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if (center && (Down->read() == 0 || Left->read() == 0 || Right->read() == 0 || Up->read() == 0) && t.read() < 2.0)
+{
+reaction_times[endloop - 1] = t.read();
+t.stop();    
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if( t.read() >= 2.0)
+{
+reaction_times[endloop - 1] = t.read();
+t.stop();
+t.reset();
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+}
+endloop = 0;
+computeAverageReactionTime();
+drawResultsScreen();
+}
+
+void Rhythm::level3()
+{
+drawLevel3Screen();
+wait(2.0);
+getArrowDirection();
+while(endloop <= 10)
+{
+if(up && Up->read() == 0 && t.read() <= 1.0)
+{
+reaction_times[endloop - 1] = t.read();
+score++;
+t.stop();
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if(down && Down->read() == 0 && t.read() <= 1.0)
+{
+reaction_times[endloop - 1] = t.read();
+score++;
+t.stop();
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if(left && Left->read() == 0 && t.read() <= 1.0)
+{
+reaction_times[endloop - 1] = t.read();
+score++;
+t.stop();
+t.reset();
+wait(0.3);  
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if(right && Right->read() == 0 && t.read() <= 1.0)
+{
+reaction_times[endloop - 1] = t.read();
+score++;
+t.stop();
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if(center && Center->read() == 0 && t.read() <= 1.0)
+{
+reaction_times[endloop - 1] = t.read();
+score++;
+t.stop();
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if (up && (Down->read() == 0 || Left->read() == 0 || Right->read() == 0 || Center->read() == 0)&& t.read() < 1.0)
+{
+reaction_times[endloop - 1] = t.read();
+t.stop();    
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if (down && (Up->read() == 0 || Left->read() == 0 || Right->read() == 0 || Center->read() == 0)&& t.read() < 1.0)
+{
+reaction_times[endloop - 1] = t.read();
+t.stop();    
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if (left && (Down->read() == 0 || Up->read() == 0 || Right->read() == 0 || Center->read() == 0)&& t.read() < 1.0)
+{
+reaction_times[endloop - 1] = t.read();
+t.stop();    
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if (right && (Down->read() == 0 || Left->read() == 0 || Up->read() == 0 || Center->read() == 0)&& t.read() < 1.0)
+{
+reaction_times[endloop - 1] = t.read();
+t.stop();    
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if (center && (Down->read() == 0 || Left->read() == 0 || Right->read() == 0 || Up->read() == 0) && t.read() < 1.0)
+{
+reaction_times[endloop - 1] = t.read();
+t.stop();    
+t.reset();
+wait(0.3);
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+else if( t.read() >= 1.0)
+{
+reaction_times[endloop - 1] = t.read();
+t.stop();
+t.reset();
+if (endloop == 10) {break;}
+getArrowDirection();
+}
+}
+endloop = 0;
+computeAverageReactionTime();
+drawResultsScreen();
+}
+
+void Rhythm::drawTitleScreen() {
+uLCD->cls();
+uLCD->background_color(BLACK);
+uLCD->text_bold(ON);
+uLCD->text_string("MBED Rhythm", 2, 4, FONT_7X8, WHITE);
+uLCD->text_string("Down - Level 1", 2, 6, FONT_7X8, BLUE);
+uLCD->text_string("Up - Level 2", 2, 8, FONT_7X8, GREEN);
+uLCD->text_string("Right - Level 3", 2, 10, FONT_7X8, RED);
+playMusicIntro();
+while(1)
+{
+if (Down->read() == 0) {
+    level1();
+    break;
+} else if (Up->read() == 0) {
+    level2();
+    break;
+} else if (Right->read() == 0) {
+    level3();
+    break;
+}
+}
+}
+
+void Rhythm::computeAverageReactionTime() {
+    float sum = 0;
+    for (int i = 0; i < 10; i++) {
+        sum = sum + reaction_times[i];
+    }
+    average_reaction_time = sum / 10.0;
+}
+
+void Rhythm::drawResultsScreen() {
+    uLCD->cls();
+    uLCD->text_string("Results", 1, 1, FONT_7X8, WHITE);
+    uLCD->set_font(FONT_7X8);
+    uLCD->locate(1, 3);
+    uLCD->color(GREEN);
+    uLCD->printf("Score: %d", score);
+    uLCD->locate(1, 5);
+    uLCD->color(0xFFCA00);
+    uLCD->printf("Average Reaction  Time: %1.3f sec", average_reaction_time);
+    uLCD->locate(1, 8);
+    uLCD->color(0xFF00FF);
+    uLCD->printf("Would you like to play again?");
+    uLCD->locate(1, 11);
+    uLCD->color(BLUE);
+    uLCD->printf("Up - Yes");
+    uLCD->locate(1, 13);
+    uLCD->color(RED);
+    uLCD->printf("Down - No");
+    score = 0;
+    for (int i = 0; i < 10; i++) {
+        reaction_times[i] = 0;
+    }
+    average_reaction_time = 0;
+    playMusicResults();
+    while (1) {
+    if (Up->read() == 0) {
+        drawTitleScreen();
+    } else if (Down->read() == 0) {
+        drawEndScreen();
+    }
+    }
+}
+
+void Rhythm::playMusicIntro()
+{
+FILE *wave_file;
+wave_file = fopen("/sd/wavfiles/WW_PressStart.wav","r");
+waver->play(wave_file);
+fclose(wave_file);
+}
+
+void Rhythm::playMusicEnd()
+{
+FILE *wave_file;
+wave_file = fopen("/sd/wavfiles/WW_Get_Rupee_Red.wav","r");
+waver->play(wave_file);
+fclose(wave_file);
+}
+
+void Rhythm::playMusicResults()
+{
+FILE *wave_file;
+wave_file = fopen("/sd/wavfiles/WW_ChuChu_Wobble.wav","r");
+waver->play(wave_file);
+fclose(wave_file);
+}
\ No newline at end of file