My take on the classic Pac man game. Using mbed LPC 1768 and Nokia 5110 LCD Analog joystick used to control direction

Dependencies:   N5110 PowerControl mbed

main.cpp

Committer:
el13ks
Date:
2015-05-11
Revision:
28:c0e3de1fd2a6
Parent:
27:c1e337f1b99f

File content as of revision 28:c0e3de1fd2a6:

/**
@file main.cpp

@brief Program implementation

*/
#include "main.h"

// Function Prototypes
void pressStart();
void pause();
void winningcondition();
void losingcondition();
void  drawMap();
void  drawCoin();
void  drawGhost();
void  checkRight();
void  checkLeft();
void  checkDown();
void  checkUp();
void  Boundarycheck();
void  WastedCheck();
void  checkCoin();
void  creditscreen();
void writeScore();

void ghosttimerexpired()
{
    followflag=1;
}

void scoreexpired()
{
    scoreflag=1;
}

void ghostfollow()
{

    if( y<j) { // If ghost id above pacman, move downwards
        y++;
    }

    if(y>j) { // If ghost is  below pacman, move upwards
        y--;

    }
    if ( x>i) {// If ghost is to the right of pacman, move left
        x--;
    }
    if (x<i) {// If ghost is to the left of pacman, move right
        x++;
    }
}

void tune()
{

    for (int q=0; q<32; q++) {
        buzzer.period(1.0/(frequency[q])); // set PWM period
        buzzer=0.5; // set duty cycle
        wait(0.5*beat[q]); // hold for beat period
    }
    buzzer=0;
}

void  creditscreen()
{

    lcd.printString("Thank You",15,1);
    lcd.printString("For",25,20);
    lcd.printString("Playing",16,3);
}
void calibrateJoystick() // read default positions of the joystick to calibrate later readings
{
    button.mode(PullDown);
    // must not move during calibration
    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; // read 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; // read button state

    // 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 = LEFT;
    } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
        joystick.direction = RIGHT;
    } else {
        joystick.direction = UNKNOWN;
    }
}

void timerExpired() // ISR for timeout function
{
    timerflag=1;
}

void pressPause()// Interrupt Service Routine (ISR) for pause button
{
    buttonflag=!buttonflag;// set button flag
}

void pause()
{
    timer.attach(&timerExpired,15.0);// Call timeout after 15 seconds
    Jbutton.rise(&pressPause); // event generated on rising edge
    while (buttonflag) {
        lcd.clear();
        lcd.printString("Pause", 25,21);
        lcd.setBrightness(bright);
        while (timerflag) {// Device goes into sleep and lcd is powered down after 15 seconds in pause menu
            timer.detach();
            lcd.turnOff();
            Sleep();
            if (!buttonflag) { // Press button again to wake the device up
                timerflag=0;
                lcd.init();
                buttonflag=0;
            }
        }
    }

}
void drawPacman2()
{
    if(joystick.direction == RIGHT) {
        lcd.setPixel(i,j);
        lcd.setPixel(i+1,j);
        lcd.setPixel(i+2,j);
        lcd.setPixel(i+3,j);
        lcd.setPixel(i-1,j);
        lcd.setPixel(i-2,j);
        lcd.setPixel(i-3,j);
        lcd.setPixel(i,j+1);//Direction dependent(Up and Down)
        lcd.setPixel(i+1,j+1);//Direction dependent(Up and Down)
        lcd.setPixel(i+2,j+1);
        lcd.setPixel(i+3,j+1);
        lcd.setPixel(i-1,j+1);//Direction dependent(Up and Down)
        lcd.setPixel(i-2,j+1);
        lcd.setPixel(i-3,j+1);
        lcd.setPixel(i,j+2);//Direction dependent(Up and Down)
        lcd.setPixel(i+1,j+2);//Direction dependent(Up and Down)
        lcd.setPixel(i+2,j+2);
        lcd.setPixel(i-1,j+2);//Direction dependent(Up and Down)
        lcd.setPixel(i-2,j+2);
        lcd.setPixel(i-1,j+3);//Direction dependent(Up and Down)
        lcd.setPixel(i,j+3);//Direction dependent(Up and Down)
        lcd.setPixel(i+1,j+3);//Direction dependent(Up and Down)
        lcd.setPixel(i-2,j-1);
        lcd.setPixel(i-3,j-1);
        lcd.setPixel(i+3,j-1);
        lcd.setPixel(i+2,j-1);
        lcd.setPixel(i+2,j-2);
        lcd.setPixel(i-2,j-2);


    }   else if(joystick.direction == LEFT) {
        lcd.setPixel(i,j);
        lcd.setPixel(i+1,j);
        lcd.setPixel(i+2,j);
        lcd.setPixel(i+3,j);
        lcd.setPixel(i-1,j);
        lcd.setPixel(i-2,j);
        lcd.setPixel(i-3,j);
        lcd.setPixel(i,j-1);//Direction dependent(Up and Down)
        lcd.setPixel(i+1,j-1);//Direction dependent(Up and Down)
        lcd.setPixel(i+2,j+1);
        lcd.setPixel(i+3,j+1);
        lcd.setPixel(i-1,j-1);//Direction dependent(Up and Down)
        lcd.setPixel(i-2,j+1);
        lcd.setPixel(i-3,j+1);
        lcd.setPixel(i,j-2);//Direction dependent(Up and Down)
        lcd.setPixel(i+1,j-2);//Direction dependent(Up and Down)
        lcd.setPixel(i+2,j+2);
        lcd.setPixel(i-1,j-2);//Direction dependent(Up and Down)
        lcd.setPixel(i-2,j+2);
        lcd.setPixel(i-1,j-3);//Direction dependent(Up and Down)
        lcd.setPixel(i,j-3);//Direction dependent(Up and Down)
        lcd.setPixel(i+1,j-3);//Direction dependent(Up and Down)
        lcd.setPixel(i-2,j-1);
        lcd.setPixel(i-3,j-1);
        lcd.setPixel(i+3,j-1);
        lcd.setPixel(i+2,j-1);
        lcd.setPixel(i+2,j-2);
        lcd.setPixel(i-2,j-2);


    } else if(joystick.direction == UP) {
        lcd.setPixel(i,j);
        lcd.setPixel(i-1,j);//Direction dependent (left and right)
        lcd.setPixel(i-2,j);//Direction dependent (left and right)
        lcd.setPixel(i-3,j);//Direction dependent (left and right)
        lcd.setPixel(i,j+1);
        lcd.setPixel(i,j+2);
        lcd.setPixel(i,j+3);
        lcd.setPixel(i,j-1);
        lcd.setPixel(i,j-2);
        lcd.setPixel(i,j-3);
        lcd.setPixel(i-1,j+3);
        lcd.setPixel(i+1,j+3);
        lcd.setPixel(i,j-1);
        lcd.setPixel(i-2,j+2);
        lcd.setPixel(i-1,j+2);
        lcd.setPixel(i+2,j+2);
        lcd.setPixel(i+1,j+2);
        lcd.setPixel(i-1,j+1);//Direction dependent (left and right)
        lcd.setPixel(i-2,j+1);//Direction dependent (left and right)
        lcd.setPixel(i-3,j+1);//Direction dependent (left and right)
        lcd.setPixel(i-1,j-1);//Direction dependent (left and right)
        lcd.setPixel(i-2,j-1);//Direction dependent (left and right)
        lcd.setPixel(i-3,j-1);//Direction dependent (left and right)
        lcd.setPixel(i-1,j-2);
        lcd.setPixel(i-2,j-2);
        lcd.setPixel(i+1,j-2);
        lcd.setPixel(i+2,j-2);
        lcd.setPixel(i+1,j-3);
        lcd.setPixel(i-1,j-3);

    } else if (joystick.direction == DOWN) {
        lcd.setPixel(i,j);
        lcd.setPixel(i,j+1);
        lcd.setPixel(i,j+2);
        lcd.setPixel(i,j+3);
        lcd.setPixel(i,j-1);
        lcd.setPixel(i,j-2);
        lcd.setPixel(i,j-3);
        lcd.setPixel(i-1,j+3);
        lcd.setPixel(i+1,j+3);
        lcd.setPixel(i,j-1);
        lcd.setPixel(i-2,j+2);
        lcd.setPixel(i-1,j+2);
        lcd.setPixel(i+2,j+2);
        lcd.setPixel(i+1,j+2);
        lcd.setPixel(i-1,j-2);
        lcd.setPixel(i-2,j-2);
        lcd.setPixel(i+1,j-2);
        lcd.setPixel(i+2,j-2);
        lcd.setPixel(i+1,j-3);
        lcd.setPixel(i-1,j-3);
        lcd.setPixel(i+1,j);//Direction dependent(left and right)
        lcd.setPixel(i+2,j);//Direction dependent(left and right)
        lcd.setPixel(i+3,j);//Direction dependent (left and right)
        lcd.setPixel(i+1,j+1);//Direction dependent (left and right)
        lcd.setPixel(i+2,j+1);//Direction dependent (left and right)
        lcd.setPixel(i+3,j+1);//Direction dependent (left and right)
        lcd.setPixel(i+1,j-1);//Direction dependent (left and right)
        lcd.setPixel(i+2,j-1);//Direction dependent (left and right)
        lcd.setPixel(i+3,j-1);//Direction dependent (left and right)



    } else {
        lcd.setPixel(i,j);
        lcd.setPixel(i-1,j);//Direction dependent (left and right)
        lcd.setPixel(i-2,j);//Direction dependent (left and right)
        lcd.setPixel(i-3,j);//Direction dependent (left and right)
        lcd.setPixel(i,j+1);
        lcd.setPixel(i,j+2);
        lcd.setPixel(i,j+3);
        lcd.setPixel(i,j-1);
        lcd.setPixel(i,j-2);
        lcd.setPixel(i,j-3);
        lcd.setPixel(i-1,j+3);
        lcd.setPixel(i+1,j+3);
        lcd.setPixel(i,j-1);
        lcd.setPixel(i-2,j+2);
        lcd.setPixel(i-1,j+2);
        lcd.setPixel(i+2,j+2);
        lcd.setPixel(i+1,j+2);
        lcd.setPixel(i-1,j+1);//Direction dependent (left and right)
        lcd.setPixel(i-2,j+1);//Direction dependent (left and right)
        lcd.setPixel(i-3,j+1);//Direction dependent (left and right)
        lcd.setPixel(i-1,j-1);//Direction dependent (left and right)
        lcd.setPixel(i-2,j-1);//Direction dependent (left and right)
        lcd.setPixel(i-3,j-1);//Direction dependent (left and right)
        lcd.setPixel(i-1,j-2);
        lcd.setPixel(i-2,j-2);
        lcd.setPixel(i+1,j-2);
        lcd.setPixel(i+2,j-2);
        lcd.setPixel(i+1,j-3);
        lcd.setPixel(i-1,j-3);
    }
}
void drawGhost()
{
    lcd.setPixel(x,y);
    lcd.setPixel(x+2,y);
    lcd.setPixel(x-2,y);
    lcd.setPixel(x,y+1);
    lcd.setPixel(x,y-1);
    lcd.setPixel(x-1,y-1);
    lcd.setPixel(x-2,y-1);
    lcd.setPixel(x+1,y-1);
    lcd.setPixel(x+2,y-1);
    lcd.setPixel(x+2,y+1);
    lcd.setPixel(x+1,y+1);
    lcd.setPixel(x-1,y+1);
    lcd.setPixel(x-2,y+1);
    lcd.setPixel(x+2,y+2);
    lcd.setPixel(x-1,y+2);
    lcd.setPixel(x+1,y+2);
    lcd.setPixel(x+2,y-2);
    lcd.setPixel(x-1,y-2);
    lcd.setPixel(x+1,y-2);
    lcd.setPixel(x-2,y-2);
    lcd.setPixel(x-2,y+2);
}
void drawPacman()
{
    if(joystick.direction == RIGHT) {
        lcd.setPixel(i,j);
        lcd.setPixel(i-1,j);//Direction dependent (left and right)
        lcd.setPixel(i-2,j);//Direction dependent (left and right)
        lcd.setPixel(i-3,j);//Direction dependent (left and right)
        lcd.setPixel(i,j+1);
        lcd.setPixel(i,j+2);
        lcd.setPixel(i,j+3);
        lcd.setPixel(i,j-1);
        lcd.setPixel(i,j-2);
        lcd.setPixel(i,j-3);
        lcd.setPixel(i-1,j+3);
        lcd.setPixel(i+1,j+3);
        lcd.setPixel(i,j-1);
        lcd.setPixel(i-2,j+2);
        lcd.setPixel(i-1,j+2);
        lcd.setPixel(i+2,j+2);
        lcd.setPixel(i+1,j+2);
        lcd.setPixel(i-1,j+1);//Direction dependent (left and right)
        lcd.setPixel(i-2,j+1);//Direction dependent (left and right)
        lcd.setPixel(i-3,j+1);//Direction dependent (left and right)
        lcd.setPixel(i-1,j-1);//Direction dependent (left and right)
        lcd.setPixel(i-2,j-1);//Direction dependent (left and right)
        lcd.setPixel(i-3,j-1);//Direction dependent (left and right)
        lcd.setPixel(i-1,j-2);
        lcd.setPixel(i-2,j-2);
        lcd.setPixel(i+1,j-2);
        lcd.setPixel(i+2,j-2);
        lcd.setPixel(i+1,j-3);
        lcd.setPixel(i-1,j-3);


    }   else if(joystick.direction == LEFT) {
        lcd.setPixel(i,j);
        lcd.setPixel(i,j+1);
        lcd.setPixel(i,j+2);
        lcd.setPixel(i,j+3);
        lcd.setPixel(i,j-1);
        lcd.setPixel(i,j-2);
        lcd.setPixel(i,j-3);
        lcd.setPixel(i-1,j+3);
        lcd.setPixel(i+1,j+3);
        lcd.setPixel(i,j-1);
        lcd.setPixel(i-2,j+2);
        lcd.setPixel(i-1,j+2);
        lcd.setPixel(i+2,j+2);
        lcd.setPixel(i+1,j+2);
        lcd.setPixel(i-1,j-2);
        lcd.setPixel(i-2,j-2);
        lcd.setPixel(i+1,j-2);
        lcd.setPixel(i+2,j-2);
        lcd.setPixel(i+1,j-3);
        lcd.setPixel(i-1,j-3);
        lcd.setPixel(i+1,j);//Direction dependent(left and right)
        lcd.setPixel(i+2,j);//Direction dependent(left and right)
        lcd.setPixel(i+3,j);//Direction dependent (left and right)
        lcd.setPixel(i+1,j+1);//Direction dependent (left and right)
        lcd.setPixel(i+2,j+1);//Direction dependent (left and right)
        lcd.setPixel(i+3,j+1);//Direction dependent (left and right)
        lcd.setPixel(i+1,j-1);//Direction dependent (left and right)
        lcd.setPixel(i+2,j-1);//Direction dependent (left and right)
        lcd.setPixel(i+3,j-1);//Direction dependent (left and right)

    } else if(joystick.direction == UP) {
        lcd.setPixel(i,j);
        lcd.setPixel(i+1,j);
        lcd.setPixel(i+2,j);
        lcd.setPixel(i+3,j);
        lcd.setPixel(i-1,j);
        lcd.setPixel(i-2,j);
        lcd.setPixel(i-3,j);
        lcd.setPixel(i,j+1);//Direction dependent(Up and Down)
        lcd.setPixel(i+1,j+1);//Direction dependent(Up and Down)
        lcd.setPixel(i+2,j+1);
        lcd.setPixel(i+3,j+1);
        lcd.setPixel(i-1,j+1);//Direction dependent(Up and Down)
        lcd.setPixel(i-2,j+1);
        lcd.setPixel(i-3,j+1);
        lcd.setPixel(i,j+2);//Direction dependent(Up and Down)
        lcd.setPixel(i+1,j+2);//Direction dependent(Up and Down)
        lcd.setPixel(i+2,j+2);
        lcd.setPixel(i-1,j+2);//Direction dependent(Up and Down)
        lcd.setPixel(i-2,j+2);
        lcd.setPixel(i-1,j+3);//Direction dependent(Up and Down)
        lcd.setPixel(i,j+3);//Direction dependent(Up and Down)
        lcd.setPixel(i+1,j+3);//Direction dependent(Up and Down)
        lcd.setPixel(i-2,j-1);
        lcd.setPixel(i-3,j-1);
        lcd.setPixel(i+3,j-1);
        lcd.setPixel(i+2,j-1);
        lcd.setPixel(i+2,j-2);
        lcd.setPixel(i-2,j-2);


    } else if (joystick.direction == DOWN) {
        lcd.setPixel(i,j);
        lcd.setPixel(i+1,j);
        lcd.setPixel(i+2,j);
        lcd.setPixel(i+3,j);
        lcd.setPixel(i-1,j);
        lcd.setPixel(i-2,j);
        lcd.setPixel(i-3,j);
        lcd.setPixel(i,j-1);//Direction dependent(Up and Down)
        lcd.setPixel(i+1,j-1);//Direction dependent(Up and Down)
        lcd.setPixel(i+2,j+1);
        lcd.setPixel(i+3,j+1);
        lcd.setPixel(i-1,j-1);//Direction dependent(Up and Down)
        lcd.setPixel(i-2,j+1);
        lcd.setPixel(i-3,j+1);
        lcd.setPixel(i,j-2);//Direction dependent(Up and Down)
        lcd.setPixel(i+1,j-2);//Direction dependent(Up and Down)
        lcd.setPixel(i+2,j+2);
        lcd.setPixel(i-1,j-2);//Direction dependent(Up and Down)
        lcd.setPixel(i-2,j+2);
        lcd.setPixel(i-1,j-3);//Direction dependent(Up and Down)
        lcd.setPixel(i,j-3);//Direction dependent(Up and Down)
        lcd.setPixel(i+1,j-3);//Direction dependent(Up and Down)
        lcd.setPixel(i-2,j-1);
        lcd.setPixel(i-3,j-1);
        lcd.setPixel(i+3,j-1);
        lcd.setPixel(i+2,j-1);
        lcd.setPixel(i+2,j-2);
        lcd.setPixel(i-2,j-2);

    } else {
        lcd.setPixel(i,j);
        lcd.setPixel(i-1,j);//Direction dependent (left and right)
        lcd.setPixel(i-2,j);//Direction dependent (left and right)
        lcd.setPixel(i-3,j);//Direction dependent (left and right)
        lcd.setPixel(i,j+1);
        lcd.setPixel(i,j+2);
        lcd.setPixel(i,j+3);
        lcd.setPixel(i,j-1);
        lcd.setPixel(i,j-2);
        lcd.setPixel(i,j-3);
        lcd.setPixel(i-1,j+3);
        lcd.setPixel(i+1,j+3);
        lcd.setPixel(i,j-1);
        lcd.setPixel(i-2,j+2);
        lcd.setPixel(i-1,j+2);
        lcd.setPixel(i+2,j+2);
        lcd.setPixel(i+1,j+2);
        lcd.setPixel(i-1,j+1);//Direction dependent (left and right)
        lcd.setPixel(i-2,j+1);//Direction dependent (left and right)
        lcd.setPixel(i-3,j+1);//Direction dependent (left and right)
        lcd.setPixel(i-1,j-1);//Direction dependent (left and right)
        lcd.setPixel(i-2,j-1);//Direction dependent (left and right)
        lcd.setPixel(i-3,j-1);//Direction dependent (left and right)
        lcd.setPixel(i-1,j-2);
        lcd.setPixel(i-2,j-2);
        lcd.setPixel(i+1,j-2);
        lcd.setPixel(i+2,j-2);
        lcd.setPixel(i+1,j-3);
        lcd.setPixel(i-1,j-3);
    }
}

void pressStart()  // ISR to Start game
{

    buttonflag1++;
}

void WastedMode()
{

    if (joystick.direction == UP) {
        i++;
    }
    if (joystick.direction == DOWN) {
        i--;
    }
    if (joystick.direction == LEFT) {
        j++;
    }
    if (joystick.direction == RIGHT) {
        j--;
    }
}
void startscreen()
{
    lcd.printString("Welcome to",15,1);
    lcd.printString("Pacman",20,2);
    lcd.printString("Press Start",6,3);
    button.rise(&pressStart); // event generated on rising edge
    PWM1.period_us(25);// Set time period
    if(buttonflag1==1) {
        lcd.clear();
        lcd.printString("Ready",21,2);
        PWM1 = 0.0;//Duty Cycle of Green pin
        PWM2 = 0.0;//Duty cycle of Yellow pin
        PWM3 = 0.5;//Duty Cycle of Red pin
        wait(1.0) ;
        lcd.clear();
        lcd.printString("Set",23,2);
        PWM1 = 0.5;//Duty Cycle of Yellow pin
        PWM2 = 0.0;//Duty cycle of Grren pin
        PWM3 = 0.0;//Duty Cycle of Red pin
        wait(1.0);
        lcd.clear();
        lcd.printString("Go!",23,2);
        PWM1 = 0.0;//Duty Cycle of Yellow pin
        PWM2 = 0.5;//Duty cycle of Green pin
        PWM3 = 0.0;//Duty Cycle of Red pin
        wait(1.0);
        lcd.clear();
        lcd.refresh();
        drawMap();
        buttonflag1++;
    }
    if(buttonflag1==0) {
        startscreen();
    }
}
void WastedCheck()
{

    if(w<=8) {
        WastedMode();
        drawPacman2();
    } else {
        Joystickcheck();
        drawPacman();
    }
}
void drawMap()
{

    lcd.drawRect(39,0,3,10,1);//x-coordinate (top-left),y-coordinate(top-left), width, height, fill - 0 transparent (w/outline), 1 filled black, 2 filled white (wo/outline)
    lcd.drawRect(40,40,2,7,1);// T-shaped obstacle Vertical
    lcd.drawRect(7,8,23,2,1);// Left hand "Hook" shaped obstacle horizontal
    lcd.drawRect(51,8,24,2,1);//Right hand "Hook" shaped obstacle horizontal
    lcd.drawRect(0,18,3,29,1);// left hand border
    lcd.drawRect(78,18,5,29,1);// Right hand border
    lcd.drawRect(11,18,3,21,1);//Left hand C shape obstacle vertical
    lcd.drawRect(27,11,3,18,1);// Left hand "Hook" shaped obstacle vertical
    lcd.drawRect(35,37,12,2,1);//T-shaped obstacle Horizontal
    lcd.drawRect(67,18,3,21,1);// Right hand C shaped obstacle vertical
    lcd.drawRect(51,11,3,18,1);//Right hand "Hook" shaped obstacle vertical
    lcd.drawRect(38,18,5,11,1);// Central block
    lcd.drawRect(15,18,4,2,1);//Left hand C shape obstacle horizontal
    lcd.drawRect(22,27,5,2,1);//Left hand "Hook" shaped obstacle
    lcd.drawRect(15,37,4,2,1);//Left hand C shape obstacle
    lcd.drawRect(55,27,3,2,1);// Right hand "Hook" shaped obstacle
    lcd.drawRect(63,18,4,2,1);//Right hand C shape obstacle horizontal
    lcd.drawRect(63,37,4,2,1);//Right hand C shape obstacle

}

void checkRight()
{


    int r = 0;//Variable for right movement check
    if(lcd.getPixel (i+3,j))//Check 4 pixels to the right
        r++;
    if(lcd.getPixel (i+4,j))//Check 5 pixels to the right
        r++;
    if (r==2) { // Condition for solid obstacles
        i--;

    }
}
void checkLeft()
{
    int l = 0 ; // Variable for left movement check
    if(lcd.getPixel (i-3,j))//Check 4 pixels to the left
        l++;
    if(lcd.getPixel (i-4,j))//Check 5 pixels to the left
        l++;
    if (l==2) { // Condition for solid obstacles
        i++;


    }
}
void checkUp()
{
    int u=0;
    if(lcd.getPixel (i,j-3))//Check 4 pixels above
        u++;
    if(lcd.getPixel (i,j-4))//Check 5 pixels above
        u++;
    if(lcd.getPixel (i+1,j-4))
        u++;
    if(lcd.getPixel (i-1,j-4))
        u++;
    if(lcd.getPixel (i-2,j-4))
        u++;
    if (u>=4) { // Condition for solid obstacles
        j++;
    }
}
void checkDown()
{
    int d=0;
    if(lcd.getPixel (i,j+3))//Check 4 pixels below
        d++;
    if(lcd.getPixel (i,j+4))//Check 5 pixels below
        d++;
    if(lcd.getPixel (i+1,j+4))
        d++;
    if(lcd.getPixel (i-1,j+4))
        d++;
    if(lcd.getPixel (i-2,j+4))
        d++;
    if (d>=4) { // Condition for solid obstacles
        j--;
    }
}
void drawCoin(void)
{
    for (int k=0; k<28; k++) {
        lcd.drawCircle(coins[k][0], coins[k][1],2,0);
    }
}
void checkCoin()
{
    for (int c=0; c<28; c++) {
        if(i==coins[c][0]&& j==coins[c][1]) {
            coins[c][0]=90;
            coins[c][1]=50;
           
            w--;
        }
    }
}
void Joystickcheck()
{
    if (joystick.direction == UP) {
        j--;
    }
    if (joystick.direction == DOWN) {
        j++;
    }
    if (joystick.direction == LEFT) {
        i--;
    }
    if (joystick.direction == RIGHT) {
        i++;
    }

}
void Boundarycheck()   // Set boundary conditions so that ghost and pacman cannot move off screen
{
    if (i<3) {
        i=3;
    }
    if (j<3) {
        j=3;
    }
    if (j>44) {
        j=44;
    }
    if (i>80) {
        i=80;
    }
}
void winningcondition()   // Player wins if all coins are eaten
{
    if(w==0) {
        win=true;
    }
}

void losingcondition()   //Player loses if pacman is eaten by ghost
{
    if (i==x && j==y) {
        win = false;
        lose = true;
    }
}

void writeScore()
{

    FILE* fp = fopen("/local/pacmanScore.txt","w"); // open file
    fprintf(fp,"%i",e); // print string to file
    fclose(fp); // close file
}

void readScore()
{
    FILE* File2 = fopen ("/local/pacmanScore.txt","r"); // open file for reading

    fscanf(File2,"%i",&score1);
    sprintf(buffer1,"%i",score1);
    fclose(File2); // close file

    //lcd.printString(buffer1,10,0); // display read data value
}
void compareScore()
{
    readScore();
    if(e>=score1) {

        lcd.printString("Yay!!",25,0);
        lcd.printString("New High Score",0,1);
        writeScore();
        readScore();
        lcd.printString(buffer1,25,4);
    }
    if (e<score1) {
        sprintf(buffer,"Score=%i",e);
        readScore();
        lcd.printString("High Score=",0,0);
        lcd.printString(buffer1,0,1); // display read data value
        lcd.printString("Your",0,3);
        lcd.printString(buffer,0,4);
    }
}
int main()
{

    lcd.init();
    calibrateJoystick();  // get centred values of joystick
    pollJoystick.attach(&updateJoystick,1.0/10.0);  // read joystick 10 times per second
    PHY_PowerDown();
    ghost.attach(&ghosttimerexpired,0.2);
    score.attach(&scoreexpired,1.0);
    tune();
    while(win==false&& lose==false) {
        startscreen();
        lcd.setBrightness(bright);
        lcd.clear();
        pause();
        winningcondition();
        losingcondition();
        drawMap();
        drawCoin();
        drawGhost();
        checkRight();
        checkLeft();
        checkDown();
        checkUp();
        Boundarycheck();
        WastedCheck();
        checkCoin();
        if (followflag) {
            followflag=0;
            ghostfollow();
        }
        if (scoreflag) {
            scoreflag=0;
            e--;
        }
        lcd.refresh();
        wait_ms(35);

    }
    if (win==true) {
        lcd.setBrightness(bright);
        lcd.clear();
        lcd.printString("Well Done!", 25,21);
        tune();
        lcd.clear();
        compareScore();
        wait(5.0);
        lcd.clear();
        creditscreen();
    }
    if (lose==true) {
        lcd.setBrightness(bright);
        lcd.clear();
        lcd.printString("Game Over",10,3);
        tune();
        lcd.clear();
        creditscreen();
    }
}