renhao dai / Mbed 2 deprecated Joystick_snake_game

Dependencies:   N5110 mbed

main.cpp

Committer:
el14rd
Date:
2015-05-10
Revision:
9:c8ea9b4af873
Parent:
8:b01f638d23b4
Child:
10:67e13dfaa10d

File content as of revision 9:c8ea9b4af873:

#include "mbed.h"
#include "N5110.h"
#define DIRECTION_TOLERANCE 0.05


//pins in
N5110 lcd(p7,p8,p9,p10,p11,p13,p26);
InterruptIn button(p17);
DigitalIn buttonA(p19);
AnalogIn pot(p20);
AnalogIn xPot(p15);                   // connections for joystick
AnalogIn yPot(p16);
PwmOut buzzer(p21);
PwmOut blacklight(p26);
PwmOut led1(p24);
PwmOut led2(p23);
BusOut leds(LED4,LED3,LED2,LED1);

float ain;
int i;
int j;
int X;
int Y;
char buffer[14];

int snakeX[100];
int snakeY[100];

// timer to regularly read the joystick
Ticker pollJoystick;
// Serial for debug
Serial serial(USBTX,USBRX);

// create enumerated type (0,1,2,3 etc. for direction)
// could be extended for diagonals etc.
enum DirectionName {
    UP,
    DOWN,
    LEFT,
    RIGHT,
    CENTRE,
    UNKNOWN
};

// struct for Joystick
typedef struct JoyStick Joystick;
struct JoyStick {
    float x;    // current x value
    float x0;   // 'centred' x value
    float y;    // current y value
    float y0;   // 'centred' y value
    int button; // button state (assume pull-down used, so 1 = pressed, 0 = unpressed)
    DirectionName direction;  // current direction
};
// create struct variable
Joystick joystick;

//int buttonA = 0;
int pause = 0;
int buttonAFlag=0;
int buttonFlag = 0;
int printFlag = 0;
int nutFlag =1;
int lifeFlag =0;
float frequency[]= {659,554,659,554,550,494,554,587,494,659,554,440};
float beat[]= {1,1,1,1,1,0.5,0.5,1,1,1,1,2};
// function prototypes
//void setPixel(int x, int y);
//void clearPixel(int x, int y);


typedef struct Nut Nut;
struct Nut {
    int X;
    int Y;
};
Nut nut;

typedef struct Snake Snake;
struct Snake {
    int snakeX[100];
    int snakeY[100];
    int node;
    DirectionName direction;
};
Snake snake;

DirectionName snakeDirection;

void initNut()
{
    nut.X=rand()%84;
    nut.Y=rand()%48;
    //nutFlag=1;
}

void drawNut()
{
    //int X = rand()%84;
    //int Y = rand()%48;
    if(nutFlag==1) {
        lcd.drawCircle(nut.X,nut.Y,1,1);
    }
}

void moveSnake()
{

    if(joystick.direction == CENTRE) {
        //snake.snakeX[0]+=1;
        joystick.direction = CENTRE;
    }
    //else if(joystick.button == button){
    //  snake.snakeX[i]=snake.snakeX[i];
    // snake.snakeY[i]=snake.snakeY[i];
    // }
    else if(joystick.direction == UNKNOWN) {
        joystick.direction = UNKNOWN;
    } else if(joystick.direction != UNKNOWN&&joystick.direction != CENTRE) {

        if((joystick.direction == DOWN)&&(snake.direction!=LEFT)) {
            snake.direction= RIGHT;
            //snake.snakeX[0]+=1;

        } else if((joystick.direction == UP)&&(snake.direction!=RIGHT)) {
            snake.direction=LEFT;
            //snake.snakeX[0]-=1;
        } else if((joystick.direction == LEFT)&&(snake.direction!=DOWN)) {
            snake.direction=UP;
            //snake.snakeY[0]-=1;
        } else if((joystick.direction == RIGHT)&&(snake.direction!=UP)) {
            snake.direction=DOWN;
            //snake.snakeY[0]+=1;
        }

    }

}

void initSnake()
{

    snake.snakeX[0] = 16; //coordinate of head
    snake.snakeY[0] = 10;
    snake.snakeX[1] = 14;
    snake.snakeY[1] = 10;
    snake.snakeX[2] = 12;
    snake.snakeY[2] = 10;
    snake.snakeX[3] = 10;
    snake.snakeY[3] = 10;
    snake.node = 6; //node of snake
    snake.direction = RIGHT;

}


void drawSnake()
{

    for(i=0; i<snake.node-1; i++) {
        lcd.drawCircle(snake.snakeX[i],snake.snakeY[i],1,1);
        //lcd.setPixel(snake.snakeX[i],snake.snakeY[i]);

    }

}

void startGmae()
{
    //nutFlag = 1;
    //lifeFlag = 0;
    //snake.direction=LEFT;

    if((snake.snakeX[0]==nut.X)&&(snake.snakeY[0]==nut.Y)) { // if snake got nut ||(snake.snakeX[0]==nut.X-1)&&(snake.snakeY[0]==nut.Y-1)||(snake.snakeY[0]==nut.Y+1)&&(snake.snakeY[0]==nut.Y+1
        snake.node+=1;
        nutFlag=0; // new nut appear
        buzzer.period(1/frequency[1]); // set PWM period
        buzzer=0.1; // set duty cycle
    }

    if((snake.snakeX[0]!=nut.X)||(snake.snakeY[0]!=nut.Y)) {
        buzzer=0;
    }

    if(nutFlag==0) { //set nut randomly
        nut.X = rand()%83;
        nut.Y = rand()%47;
        nutFlag = 1;
    }


    for(i=3; i<snake.node; i++) { //if snake collide itself snake die
        if(snake.snakeX[i]==snake.snakeX[0] && snake.snakeY[i]==snake.snakeY[0]) {
            lifeFlag=1;
        }
    }


    for(i=snake.node-1; i>0; i--) { //move snake
        if(snake.snakeX[0]>1||snake.snakeX[0]<83||snake.snakeY[0]>1||snake.snakeY[0]<47) {
            snake.snakeX[i]=snake.snakeX[i-1];
            snake.snakeY[i]=snake.snakeY[i-1];
        } else {
            snake.snakeX[i]=snake.snakeX[i];
            snake.snakeY[i]=snake.snakeY[i];
        }
    }


    if(snake.snakeX[0]<1||snake.snakeX[0]>83||snake.snakeY[0]<1||snake.snakeY[0]>47) {
        lifeFlag=1; // snake collide the corrider snake die
    }

}

void printScore()
{
    lcd.printString("Your Score is",0,0);
    int score=snake.node-6;
    int length = sprintf(buffer," SCORE=%2d ",score);
    lcd.printString(buffer,0,2 );
    lcd.printString("Press to start",0,4);
}

void buttonPressed()
{
    buttonFlag =1;
}

void snakeModel()
{
    for(int i=0; i<25; i+=5) {
        lcd.clear();
        lcd.printString("Press to start",1,1);

        lcd.drawRect(44-i,21,1,1,1);
        lcd.drawRect(46-i,21,1,1,1);
        lcd.drawRect(48-i,21,1,1,1);

        lcd.drawRect(42-i,23,1,1,1);
        lcd.drawRect(44-i,23,1,1,1);
        lcd.drawRect(46-i,23,1,1,1);
        lcd.drawRect(48-i,23,1,1,1);

        lcd.drawRect(40-i,25,1,1,1);
        lcd.drawRect(42-i,25,1,1,1);
        lcd.drawRect(44-i,25,1,1,1);
        lcd.drawRect(46-i,25,1,1,1);
        lcd.drawRect(48-i,25,1,1,1);
        lcd.drawRect(50-i,25,1,1,1);

        lcd.drawRect(40-i,27,1,1,1);
        lcd.drawRect(42-i,27,1,1,1);
        lcd.drawRect(44-i,27,1,1,1);
        lcd.drawRect(46-i,27,1,1,1);
        lcd.drawRect(48-i,27,1,1,1);
        lcd.drawRect(50-i,27,1,1,1);//head

        lcd.drawRect(38-i,29,1,1,0); //tougue
        lcd.drawRect(40-i,31,1,1,0);

        lcd.drawRect(46-i,29,1,1,1);
        lcd.drawRect(48-i,29,1,1,1);
        lcd.drawRect(50-i,29,1,1,1);

        lcd.drawRect(46-i,31,1,1,1);
        lcd.drawRect(48-i,31,1,1,1);
        lcd.drawRect(50-i,31,1,1,1);

        lcd.drawRect(44-i,33,1,1,1);
        lcd.drawRect(46-i,33,1,1,1);
        lcd.drawRect(48-i,33,1,1,1);

        lcd.drawRect(44-i,35,1,1,1);
        lcd.drawRect(46-i,35,1,1,1);
        lcd.drawRect(48-i,35,1,1,1);

        lcd.drawRect(42-i,37,1,1,1);
        lcd.drawRect(44-i,37,1,1,1);
        lcd.drawRect(46-i,37,1,1,1);

        lcd.drawRect(42-i,39,1,1,1);
        lcd.drawRect(44-i,39,1,1,1);
        lcd.drawRect(46-i,39,1,1,1);

        lcd.drawRect(44-i,41,1,1,1);
        lcd.drawRect(46-i,41,1,1,1);
        lcd.drawRect(48-i,41,1,1,1);
        lcd.drawRect(50-i,41,1,1,1);//neck

        lcd.drawRect(80-i,41,1,1,1);//tail
        lcd.drawRect(82-i,41,1,1,1);
        lcd.drawRect(84-i,41,1,1,1);

        lcd.drawRect(82-i,39,1,1,1);
        lcd.drawRect(84-i,39,1,1,1);

        lcd.drawRect(82-i,37,1,1,1);

        lcd.drawRect(80-i,35,1,1,1);//tail

        lcd.drawRect(46-i,43,1,1,1);
        lcd.drawRect(48-i,43,1,1,1);
        lcd.drawRect(50-i,43,1,1,1);
        lcd.drawRect(52-i,43,1,1,1);
        lcd.drawRect(54-i,43,1,1,1);
        lcd.drawRect(56-i,43,1,1,1);
        lcd.drawRect(58-i,43,1,1,1);
        lcd.drawRect(60-i,43,1,1,1);
        lcd.drawRect(62-i,43,1,1,1);
        lcd.drawRect(64-i,43,1,1,1);
        lcd.drawRect(66-i,43,1,1,1);
        lcd.drawRect(68-i,43,1,1,1);
        lcd.drawRect(70-i,43,1,1,1);
        lcd.drawRect(72-i,43,1,1,1);
        lcd.drawRect(74-i,43,1,1,1);
        lcd.drawRect(76-i,43,1,1,1);
        lcd.drawRect(78-i,43,1,1,1);
        lcd.drawRect(80-i,43,1,1,1);
        lcd.drawRect(82-i,43,1,1,1);

        lcd.drawRect(48-i,45,1,1,1);
        lcd.drawRect(50-i,45,1,1,1);
        lcd.drawRect(52-i,45,1,1,1);
        lcd.drawRect(54-i,45,1,1,1);
        lcd.drawRect(56-i,45,1,1,1);
        lcd.drawRect(58-i,45,1,1,1);
        lcd.drawRect(60-i,45,1,1,1);
        lcd.drawRect(62-i,45,1,1,1);
        lcd.drawRect(64-i,45,1,1,1);
        lcd.drawRect(66-i,45,1,1,1);
        lcd.drawRect(68-i,45,1,1,1);
        lcd.drawRect(70-i,45,1,1,1);
        lcd.drawRect(72-i,45,1,1,1);
        lcd.drawRect(74-i,45,1,1,1);
        lcd.drawRect(76-i,45,1,1,1);
        lcd.drawRect(78-i,45,1,1,1);
        lcd.drawRect(80-i,45,1,1,1);
        wait(0.5);
        //lcd.refresh();
    }

}
//switch(snake.direction)
//{
// case RIGHT:snake.X[0]+=1;
//  break;    
//  case LEFT:snake.X[0]-=1;
//  break;     
//  case UP:snake.Y[0]-=1;
//  break;
//   case DOWN:snake.Y[0]+=1;
//  break;
// }

//end of while(joystick.direction = UNKNOWN)


// read default positions of the joystick to calibrate later readings
void calibrateJoystick()
{
    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()
{
    //led1=1;
    // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
    joystick.x = xPot - joystick.x0;
    joystick.y = yPot - joystick.y0;
    // read button state
    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;
        //LIGHT LED2
    } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
        joystick.direction = RIGHT;
        //LIGHT LED3
    } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
        joystick.direction = LEFT;
    } else {
        joystick.direction = UNKNOWN;
    }
    // set flag for printing
    printFlag = 1;
}

void updateSnake()
{
    // get direction of joystick and update snake
    if (snake.direction == LEFT) {
        snake.snakeX[0]-=1;
        //LED1
        if(snake.snakeX[0]<1) {
            snake.snakeX[0]=1;

        }//will stop at the top edge

    }
    if (snake.direction == RIGHT) {
        snake.snakeX[0]+=1;
        //LED2
        if(snake.snakeX[0]>83) {
            snake.snakeX[0]=83;
        }//will stop at the bottom edge
    }
    if (snake.direction == UP) {
        snake.snakeY[0]-=1;
        if(snake.snakeY[0]>47) {
            snake.snakeY[0]=47;
        }//will stop at the left edge

    }
    if (snake.direction == DOWN) {
        snake.snakeY[0]+=1;
        if(snake.snakeY[0]<1) {
            snake.snakeY[0]=1;
        }//will stop at the right edge

    }
    if(snake.direction == CENTRE) {
        snake.snakeX[0]+=1;
    }
    if(snake.direction == UNKNOWN) {
        snake.snakeX[0]+=1;
    }
}


//main code
int main()
{
    //led1=1;
    lcd.init();
    lcd.setBrightness(0.5); // put LED backlight on 50%
    calibrateJoystick();  // get centred values of joystick
    pollJoystick.attach(&updateJoystick,1.0/10.0);  // read joystick 10 times per second
    lcd.refresh();
    initNut();
    initSnake();
    button.rise(&buttonPressed);
    buttonA.mode(PullDown);
//infinite while loop
    while(1) {
        led2=1;
        if(buttonFlag==0) { //joystick button unpressed
            lcd.printString("Press to start",1,1);
            snakeModel();
        } else {

            leds = 0;

            if(buttonA) { // if button pressed, toggle pause
                wait_ms(50);
                pause = !pause;
                leds = 15;
                led2=0;
                led1=1;
            }

            while(pause) {
                leds = 3;
                if(buttonA) { // if button pressed, toggle pause
                    wait_ms(50);
                    pause = 0;
                    leds = 1;
                    led2=1;
                    led1=0;

                }
            }
        }


        lcd.clear();
        lifeFlag=0;
        updateSnake();
        drawSnake();
        drawNut();
        moveSnake();
        startGmae();
        lcd.refresh();
        wait(0.08);
        //pauseGame();
        //if (buttonFlag==1){
        //while(1){
        // buttonFlag =0;
        //if(buttonFlag ==1)
        // break;
        //}
        // }
        if(lifeFlag==1) {
            lcd.clear();
            lcd.refresh();
            printScore();
            for(int i=0; i<=11; i++) {
                buzzer.period(1/(frequency[i])); // set PWM period
                buzzer=0.1; // set duty cycle
                wait(0.5*beat[i]);
            }
            buzzer=0;
        }
        led1=1;
         ain = pot.read();
        lcd.setBrightness(ain);
        lcd.refresh();  

    }

    
}