jordan harper / Mbed 2 deprecated GameProject

Dependencies:   N5110 mbed

main.cpp

Committer:
jordaahh
Date:
2015-05-06
Revision:
29:f70d927c3e11
Parent:
26:53ab8f8615dd
Child:
30:e6f59801ea2a

File content as of revision 29:f70d927c3e11:

/**
@file main.cpp
 
@brief Game Algorithm implementation
 */

#include "main.h"

int main()
{
     //set_time(0); // enter unix time then delete from main function to set time
    power = 1;
    lcd.init(); 
    calibrateJoystick();  // get centred values of joystick
    pollJoystick.attach(&updateJoystick,1.0/15.0);  // read joystick 15 times per second
    wallMovement.attach(&flagForWall,0.2); // call function flagForWall to make flag=1, every 0.2 seconds
    wallMovement2.attach(&flagForWall2,0.2); // call function flagForWall2 to make flag=1, every 0.2 seconds
    wallMovement3.attach(&flagForWall3,0.2); // call function flagForWall3 to make flag=1, every 0.2 seconds
    flash.attach(&flagForFlash,1); // call function flagForWall3 to make flag=1, every 1 seconds
    menu();
}

void calibrateJoystick()
{
    button.mode(PullDown); // must not move while calibrating 
    joystick.x0 = xPot;  // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly)
    joystick.y0 = yPot;
}

void updateJoystick()
{

    joystick.x = xPot - joystick.x0; // reads current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
    joystick.y = yPot - joystick.y0;
    joystick.button = button;

    /* calculate direction depending on x,y values */
    /* tolerance allows a little lee-way in case joystick not exactly in the stated direction */
    if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
        joystick.direction = CENTRE;
    } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
        joystick.direction = UP;
    } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
        joystick.direction = DOWN;
    } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
        joystick.direction = RIGHT;
    } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
        joystick.direction = LEFT;
    } else if ( joystick.y > DIRECTION_TOLERANCE && joystick.x > DIRECTION_TOLERANCE) {
        joystick.direction = upRight;
    } else if ( joystick.y < DIRECTION_TOLERANCE && joystick.x > DIRECTION_TOLERANCE) {
        joystick.direction = downRight;
    } else if ( joystick.y > DIRECTION_TOLERANCE && joystick.x < DIRECTION_TOLERANCE) {
        joystick.direction = upLeft;
    } else if ( joystick.y < DIRECTION_TOLERANCE && joystick.x < DIRECTION_TOLERANCE) {
        joystick.direction = downLeft;
    }

    printFlag = 1; // set flag for printing 
}



void clearCells()
{
    for (int i = 0; i < nx ; i++) { // loops through cells in x direction first 
        for (int j = 0; j < ny ; j++) { // then moves in y direction 
            lcd.clearPixel(i,j); // clears each pixel that is checked 
        }
    }
    lcd.refresh(); // must refresh to write buffer display 
}


void flagForWall()
{
    FLAG=1;
}


void flagForWall2()
{
    FLAG2=1;
}


void flagForWall3()
{
    FLAG3=1;
}


void menu()
{
    int m = 0;

    char buffer[14]; // buffer used to store time string 

    while(1) {
        powerSave(); // call sleep function 
        clearCells();
        time_t seconds = time(NULL); // gets current time 
        strftime(buffer, 14 , "%H:%M", localtime(&seconds)); // send time string to buffer 

        lcd.printString(buffer,26,4); // show time on lcd screen 


        if ((joystick.direction == RIGHT)||(joystick.direction == upRight)||(joystick.direction == downRight)) {
            m++;
        }
        if ((joystick.direction == LEFT)||(joystick.direction == upLeft)||(joystick.direction == downLeft)) {
            m--;
        }
        if(m > 2) {
            m = 0;
        }
        if(m < 0) {
            m = 2;
        }
        switch (m) {
            case 0 :
                lcd.printString("<  Play Game >",0,2);
                wait(0.3);
                while(1) {
                    if(button == 1) {
                        clearCells();
                        playGame();
                        break;
                    } else {
                        break;
                    }
                }
                break;
            case 1 :
                lcd.printString("<  Settings  >",0,2);
                wait(0.3);
                while(1) {
                    if(button == 1) {
                        clearCells();
                        BandVMenu();
                        break;
                    } else {
                        break;
                    }
                }
                break;
            case 2 :
                lcd.printString("<  HighScore >",0,2);
                wait(0.3);
                while(1) {
                    if(button == 1) {
                        clearCells();
                        while(1) {
                            readDataFromFile();
                            lcd.printString("HighScore",16,0);
                            if(joystick.direction == DOWN) {
                                menu();
                            }
                        }
                    } else {
                        break;
                    }
                }
                break;

        }
    }
}


void playGame()
{
    /* reset variables */
    i=24;
    j=42;
    x = 0;
    y = 0;
    z = 30;
    a = 0;
    b = 47;
    d = 30;
    f = 0;
    g = 0;
    h = 24;
    q = 83;
    w = 0;
    e = 24;
    score = 0;
    u = 0;

    lcd.printString("GO!",35,2);
    wait(1);
    while(1) {
        if(soundFlag==1) { // if mute hasn't been toggled in settings then the song will play 
            tone();
        }
        lcd.drawRect(i,j,2,2,0); // draws player object 
        clearCells();
        fallingWalls();
        boundries();
        playerMovement();
        
        if (lcd.getPixel(i,j)) { // if wall meets player object then there is a collision  
            scoreCheck();
            int m = 1;
            GameOverFlash(); // this means that it is game over 
            if (soundFlag == 1) {
                deadTone();
            }

            while(1) {
                clearCells();
                if ((joystick.direction == RIGHT)||(joystick.direction == upRight)||(joystick.direction == downRight)) { // reads joystick direction and counts down 
                    m--;
                }
                if ((joystick.direction == LEFT)||(joystick.direction == upLeft)||(joystick.direction == downLeft)) { // reads joystick direction and counts up 
                    m++;
                }
                if(m > 2) { // stops counter from going above total number of cases
                    m = 2;
                }
                if(m < 0) { // stops counter from going below zero
                    m = 0;
                }
                switch (m) { //switches to the case that the counter is on 
                    case 0 :
                        lcd.printString("YES",0,3);

                        while(1) {
                            if(button == 1) {
                                clearCells();
                                playGame();
                                break;
                            } else {
                                break;
                            }
                        }
                        break;
                    case 1 :
                        lcd.printString("Play Again?",9,1);
                        lcd.printString("Yes        No",0,3);
                        wait(0.3);

                        break;
                    case 2 :
                        lcd.printString("NO",70,3);

                        while(1) {
                            if(button == 1) {
                                clearCells();
                                lcd.printString("Leaving Game",0,2); 
                                wait(1.0);
                                menu();
                                break;
                            } else {
                                break;
                            }
                        }
                        break;
                }
            }
        }
        if (lcd.getPixel(i+2,j)) { // same as above but for different side of player object 

            scoreCheck();
            clearCells();
            int m = 1;
            GameOverFlash();
            if (soundFlag == 1) {
                deadTone();
            }

            while(1) {
                clearCells();
                if ((joystick.direction == RIGHT)||(joystick.direction == upRight)||(joystick.direction == downRight)) {
                    m--;
                }
                if ((joystick.direction == LEFT)||(joystick.direction == upLeft)||(joystick.direction == downLeft)) {
                    m++;
                }
                if(m > 2) {
                    m = 2;
                }
                if(m < 0) {
                    m = 0;
                }
                switch (m) {
                    case 0 :
                        lcd.printString("YES",0,3);

                        while(1) {
                            if(button == 1) {
                                clearCells();
                                playGame();
                                break;
                            } else {
                                break;
                            }
                        }
                        break;
                    case 1 :
                        lcd.printString("Play Again?",9,1);
                        lcd.printString("Yes        No",0,3);
                        wait(0.3);

                        break;
                    case 2 :
                        lcd.printString("NO",70,3);

                        while(1) {
                            if(button == 1) {
                                clearCells();
                                lcd.printString("Leaving Game",0,2);
                                wait(1.0);
                                menu();
                                break;
                            } else {
                                break;
                            }
                        }
                        break;
                }
            }
        }
        if (lcd.getPixel(i+2,j+2)) {
            scoreCheck(); 
            clearCells();
            int m = 1;
            GameOverFlash();
            if (soundFlag == 1) {
                deadTone();
            }

            while(1) {
                clearCells();
                if ((joystick.direction == RIGHT)||(joystick.direction == upRight)||(joystick.direction == downRight)) {
                    m--;
                }
                if ((joystick.direction == LEFT)||(joystick.direction == upLeft)||(joystick.direction == downLeft)) {
                    m++;
                }
                if(m > 2) {
                    m = 2;
                }
                if(m < 0) {
                    m = 0;
                }
                switch (m) {
                    case 0 :
                        lcd.printString("YES",0,3);

                        while(1) {
                            if(button == 1) {
                                clearCells();
                                playGame();
                                break;
                            } else {
                                break;
                            }
                        }
                        break;
                    case 1 :
                        lcd.printString("Play Again?",9,1);
                        lcd.printString("Yes        No",0,3);
                        wait(0.3);

                        break;
                    case 2 :
                        lcd.printString("NO",70,3);

                        while(1) {
                            if(button == 1) {
                                clearCells();
                                lcd.printString("Leaving Game",0,2); 
                                wait(1.0);
                                menu();
                                break;
                            } else {
                                break;
                            }
                        }
                        break;

                }
            }
        }
        if (lcd.getPixel(i,j+2)) {
            scoreCheck(); 
            clearCells();
            int m = 1;
            GameOverFlash();
            if (soundFlag == 1) {
                deadTone();
            }

            while(1) {
                clearCells();
                if ((joystick.direction == RIGHT)||(joystick.direction == upRight)||(joystick.direction == downRight)) {
                    m--;
                }
                if ((joystick.direction == LEFT)||(joystick.direction == upLeft)||(joystick.direction == downLeft)) {
                    m++;
                }
                if(m > 2) {
                    m = 2;
                }
                if(m < 0) {
                    m = 0;
                }
                switch (m) {
                    case 0 :
                        lcd.printString("YES",0,3);

                        while(1) {
                            if(button == 1) {
                                clearCells();
                                playGame();
                                break;
                            } else {
                                break;
                            }
                        }
                        break;
                    case 1 :
                        lcd.printString("Play Again?",9,1);
                        lcd.printString("Yes        No",0,3);
                        wait(0.3);

                        break;
                    case 2 :
                        lcd.printString("NO",70,3);

                        while(1) {
                            if(button == 1) {
                                clearCells();
                                lcd.printString("Leaving Game",0,2); 
                                wait(1.0);
                                menu();
                                break;
                            } else {
                                break;
                            }
                        }
                        break;

                }
            }
        }
    }
}


void BandVMenu()
{
    int t = 0;
    while(1) {
        wait(0.2);
        clearCells();
        if ((joystick.direction == RIGHT)||(joystick.direction == upRight)||(joystick.direction == downRight)) {
            t++;
        }
        if ((joystick.direction == LEFT)||(joystick.direction == upLeft)||(joystick.direction == downLeft)) {
            t--;
        }
        if(t > 2) {
            t = 0;
        }
        if(t < 0) {
            t = 2;
        }
        if(joystick.direction == DOWN) {
            clearCells();
            lcd.printString("Returning",18,2);
            lcd.printString("to Menu",24,3);
            wait(0.5);
            menu();
        }
        switch (t) {
            case 0 :
                lcd.printString("< Brightness >",0,2);
                while(1) {
                    if(button == 1) {
                        brightness();
                        break;
                    } else {
                        break;
                    }
                }
                break;
            case 1 :
                lcd.printString("<   Volume   >",0,2);
                while(1) {
                    if(button == 1) {
                        volume();
                        break;
                    } else {
                        break;
                    }
                }
                break;
            case 2 :
                lcd.printString("<Instructions>",0,2);
                while(1) {
                    if(button == 1) {
                        instructions();
                        break;
                    } else {
                        break;
                    }
                }
                break;
        }
    }
}


void brightness()
{
    while(1) {
        wait(0.2);
        clearCells();
        if ((joystick.direction == RIGHT)||(joystick.direction == upRight)||(joystick.direction == downRight)) {
            bright--;
        }
        if ((joystick.direction == LEFT)||(joystick.direction == upLeft)||(joystick.direction == downLeft)) {
            bright++;
        }
        if(bright > 3) {
            bright = 3;
        }
        if(bright < -3) {
            bright = -3;
        }
        switch (bright) {
            case 0 :
                lcd.printString("  Brightness ",0,2);
                lcd.printString(" ||||||",0,4);
                lcd.setBrightness(0.6);
                while(1) {
                    if(button == 1) {
                        BandVMenu();
                        break;
                    } else {
                        break;
                    }
                }
                break;
            case 1 :
                lcd.printString("  Brightness ",0,2);
                lcd.printString(" ||||||||",0,4);
                lcd.setBrightness(0.8);
                while(1) {
                    if(button == 1) {
                        BandVMenu();
                        break;
                    } else {
                        break;
                    }
                }
                break;
            case 2 :
                lcd.printString("  Brightness ",0,2);
                lcd.printString(" ||||||||||",0,4);
                lcd.setBrightness(0.9);
                while(1) {
                    if(button == 1) {
                        BandVMenu();
                        break;
                    } else {
                        break;
                    }
                }
                break;
            case 3 :
                lcd.printString("  Brightness ",0,2);
                lcd.printString(" ||||||||||||",0,4);
                lcd.setBrightness(1);
                while(1) {
                    if(button == 1) {
                        BandVMenu();
                        break;
                    } else {
                        break;
                    }
                }
                break;
            case -1 :
                lcd.printString("  Brightness ",0,2);
                lcd.printString(" ||||",0,4);
                lcd.setBrightness(0.4);
                while(1) {
                    if(button == 1) {
                        BandVMenu();
                        break;
                    } else {
                        break;
                    }
                }
                break;
            case -2 :
                lcd.printString("  Brightness ",0,2);
                lcd.printString(" ||",0,4);
                lcd.setBrightness(0.2);
                while(1) {
                    if(button == 1) {
                        BandVMenu();
                        break;
                    } else {
                        break;
                    }
                }
                break;
            case -3 :
                lcd.printString("  Brightness ",0,2);
                lcd.setBrightness(0);
                while(1) {
                    if(button == 1) {
                        BandVMenu();
                        break;
                    } else {
                        break;
                    }
                }
                break;
        }
    }
}


void volume()
{
    while(1) {
        wait(0.2);
        clearCells();
        if ((joystick.direction == RIGHT)||(joystick.direction == upRight)||(joystick.direction == downRight)) {
            vol--;
        }
        if ((joystick.direction == LEFT)||(joystick.direction == upLeft)||(joystick.direction == downLeft)) {
            vol++;
        }
        if(vol > 3) {
            vol = 3;
        }
        if(vol < -3) {
            vol = -3;
        }
        switch (vol) {
            case 0 :
                lcd.printString("    Volume   ",0,2);
                lcd.printString(" ||||||",0,4);
                while(1) {
                    if(button == 1) {
                        BandVMenu();
                        break;
                    } else {
                        break;
                    }
                }
                break;
            case 1 :
                lcd.printString("    Volume   ",0,2);
                lcd.printString(" ||||||||",0,4);
                while(1) {
                    if(button == 1) {
                        BandVMenu();
                        break;
                    } else {
                        break;
                    }
                }
                break;
            case 2 :
                lcd.printString("    Volume   ",0,2);
                lcd.printString(" ||||||||||",0,4);
                while(1) {
                    if(button == 1) {
                        BandVMenu();
                        break;
                    } else {
                        break;
                    }
                }
                break;
            case 3 :
                lcd.printString("    Volume   ",0,2);
                lcd.printString(" ||||||||||||",0,4);
                while(1) {
                    if(button == 1) {
                        BandVMenu();
                        break;
                    } else {
                        break;
                    }
                }
                break;
            case -1 :
                lcd.printString("    Volume   ",0,2);
                lcd.printString(" ||||",0,4);
                while(1) {
                    if(button == 1) {
                        BandVMenu();
                        break;
                    } else {
                        break;
                    }
                }
                break;
            case -2 :
                lcd.printString("    Volume   ",0,2);
                lcd.printString(" ||",0,4);
                while(1) {
                    if(button == 1) {
                        BandVMenu();
                        break;
                    } else {
                        break;
                    }
                }
                break;
            case -3 :
                lcd.printString("    Volume    ",0,2);
                lcd.printString(" MUTE",0,4);
                soundFlag = 0;
                while(1) {
                    if(button == 1) {
                        BandVMenu();
                        break;
                    } else {
                        break;
                    }
                }
                break;
        }
    }
}


void writeDataToFile()
{
    time_t seconds = time(NULL); // get current time 
    char buffer2[14]; // buffer used to store time string 
    strftime(buffer2, 14, " %d/%m/%y", localtime(&seconds)); // displays unix time in day/ month/ year format and sends it to buffer 

    FILE *fp = fopen("/local/score.txt", "w"); // open file called 'score.txt' 
/* if the file doesn't exist it is created, if it exists, data is updated */
    fprintf(fp,"%i%s",score,buffer2); // print integer for score and date to file 
    fclose(fp); // close file 
}


void readDataFromFile()
{
    int score1; // states the score to be read from the file is an integer value 
    char buffer2recieved[14]; // buffer to recieve the string of data read from the text file

    FILE *fp2 = fopen("/local/score.txt", "r"); // open 'score.txt' 
    fscanf (fp2,"%i%s",&score1,buffer2recieved); // scans text file for an integer followed by a string 
    fclose(fp2); // close file 

    char Points[14]; // buffer to store score value
    sprintf(Points,"%i",score1); // send score to buffer (Points) 
    lcd.printString(Points,39,2); // print score on LCD 
    lcd.printString(buffer2recieved,18,4); // print date on LCD 

}



void tone()
{

    if(FLAG3==1) {
        FLAG3 = 0;
        buz.period(1/(frequency[u])); // set PWM period
        buz=0.2;
        u++;
    }
    if( u > 30) {
        u = 0;
    }

}


void deadTone()
{
    int l = 0;
    while(1) {
        if(FLAG3==1) {
            FLAG3 = 0;
            buz.period(1/(frequency2[l])); // set PWM period
            buz=0.2;
            l++;
        }
        if( l > 6) {
            break;
        }
    }
}


void scoreCheck()
{
    int score1;

    FILE *fp2 = fopen("/local/score.txt", "r");
    fscanf (fp2,"%i",&score1);
    fclose(fp2); 

    if(score1 < score) {
        writeDataToFile(); // if the score is bigger then the data is written to the file and overwrites the previous data 
    }
}


void flagForFlash()
{
    flashFlag = 1;
}


void GameOverFlash()
{
    int flash = 0;
    while(1) {
        if (flashFlag==1) { // flag equals one every second  
            flashFlag = 0; // flag is reset  
            lcd.printString("Game Over!",12,2); // print phrase  
            flash++; // adds one to counter 
        }
        if (flash > 3) { // moves onto next function when counter gets to 3 
            break;
        }
    }
}


void powerSave()
{
    if(joystick.direction == CENTRE) {
        if (flashFlag==1) {
            flashFlag = 0;
            sleepCounter++;
        }
        if(sleepCounter > 20) {
            Sleep(); // put mbed into sleep mode 
            lcd.turnOff(); // turn LCD off 
            while(1) {
            if (button ==1) {
                lcd.init(); // turn LCD back on 
                sleepCounter = 0;
                menu();
                break;
                }
                }
        }

    } else {
        sleepCounter = 0;
    }
}


void boundries()
{
    if( j > 45) { 
        j = 45;
    }
    if( i > 81) {
        i = 81;
    }
    if( j < 0) {
        j = 0;
    }
    if( i < 0) {
        i = 0;
    }
}


void playerMovement()
{

    if (printFlag) {  // if flag set, clear flag and implicate joystick functions 
        printFlag = 0;
        /* check joystick direction */
        if (joystick.direction == UP) {
            j--;
        }
        if (joystick.direction == DOWN) {
            j++;
        }
        if (joystick.direction == LEFT) {
            i++;
        }
        if (joystick.direction == RIGHT) {
            i--;
        }
        if (joystick.direction == upRight) {
            j--;
            i--;
        }
        if (joystick.direction == downRight) {
            j++;
            i--;
        }
        if (joystick.direction == upLeft) {
            j--;
            i++;
        }
        if (joystick.direction == downLeft) {
            j++;
            i++;
        }
        if (joystick.direction == CENTRE) {
            i=i;
            j=j;
        }
    }
}


void fallingWalls()
{
      lcd.drawLine(x,y,z,y,1); // draws a line at the top of the screen to symbolise a wall 
        lcd.drawLine(z+10,y,83,y,1); // there is a gap in the wall which is 10 pixels wide and the objective of the game is to pass through it 
        if(FLAG==1) { // the flag changes every 0.2 seconds 
            FLAG=0;
            y++;  // everytime the flag changes to one it is reset and the wall moves down by one pixel 
        }
        if(y > 47) { // when the wall reaches the bottom a new wall is generated at the top 
            y = 0;
            z = rand()%74; // the gap in the is moved to a random postion in the new wall 
            score++; // score increases by one everytime a wall falling from the top reaches the bottom of the screen 
        }
        /* there are 6 levels of difficulty */
        if(( score > 1)&&(score < 5)) {
            lcd.drawLine(a,b,d,b,1); 
            lcd.drawLine(d+10,b,83,b,1); 
            if(FLAG3==1) {
                FLAG3=0;
                b--;  
            }
        }
        if(b < 0) { 
            b = 47;
            d = rand()%74;
        }
        if(( score > 5)&&(score < 9)) {
            lcd.drawLine(f,g,f,h,1);
            lcd.drawLine(f,h+10,f,47,1);
            if(FLAG2==1) {
                FLAG2=0;
                f++;  
            }
        }
        if( f > 83) { 
            f = 0;
            h = rand()%38;
        }
        if(( score > 10)&&(score < 15)) {
            lcd.drawLine(q,w,q,e,1); 
            lcd.drawLine(q,e+10,q,47,1); 
            if(FLAG3==1) {
                FLAG3=0;
                q--;  
            }
        }
        if(q < 0) { 
            q = 83;
            e = rand()%38;
        }
        if( score > 15) {
            lcd.drawLine(q,w,q,e,1); 
            lcd.drawLine(q,e+10,q,47,1); 
            if(FLAG3==1) {
                FLAG3=0;
                q--;  
            }
        }
        if( score > 20) {
            lcd.drawLine(a,b,d,b,1); 
            lcd.drawLine(d+10,b,83,b,1); 
            if(FLAG2==1) {
                FLAG2=0;
                b--;  
            }
        }
        }
     
void instructions()
{
    while(1) 
    {
        lcd.printString("Welcome :-)",9,0);
        lcd.printString("Select using",6,1);
        lcd.printString("joystickButton",0,2); 
        lcd.printString("Press >",27,4);
        wait(0.5);
        if(button) { // press joystick button to continue
            clearCells();
            while(1)
            {
                lcd.printString("Return to menu",0,0);
                lcd.printString("by moving the",3,1);
                lcd.printString("JS downward",9,2);
                if(joystick.direction == DOWN) { // direct joystick down to continue
                    menu();
                    break;
                    }
                    }
                    }
                    }
                    }