ELEC2645 (2015/16)
/
el14ws_Project
Snake Game
Fork of ProjectSnake by
Diff: main.cpp
- Revision:
- 0:4b8288518876
- Child:
- 1:44cc07feab7e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed May 04 17:31:50 2016 +0000 @@ -0,0 +1,805 @@ +#include "mbed.h" +#include "N5110.h" +#define DIRECTION_TOLERANCE 0.05// change this to alter tolerance of joystick direction + +DigitalIn button(PTB11);// connections for joystick +AnalogIn xPot(PTB2); +AnalogIn yPot(PTB3); +Ticker pollJoystick;// timer to regularly read the joystick +// Serial for debug +Serial serial(USBTX,USBRX);// Serial for debug +// create enumerated type (0,1,2,3 etc. for direction) +// could be extended for diagonals etc. +enum DirectionName { + UP, + DOWN, + LEFT, + RIGHT, + CENTRE, + UNKNOWN +}; +typedef struct JoyStick Joystick;// struct for 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 +}; +Joystick joystick;// create struct variable +int printFlag = 0; + +// VCC, SCE, RST, D/C, MOSI, SCLK, LED +N5110 lcd( PTE26, PTA0, PTC4, PTD0, PTD2, PTD1, PTC3); +DigitalIn buttonA(PTB18); +int ni = 84; +int x = 0; +int x1 = 0; +int x2 = 0; +int x3 = 0; +int x4 = 0; +int x5 = 0; +int x6 = 0; +int x7 = 0; +int x8 = 0; +int x9 = 0; +int x10 = 0; +int x11 = 0; +int x12 = 0; +int x13 = 0; +int x14 = 0; +int x15 = 0; +int x16 = 0; +int x17 = 0; +int x18 = 0; +int x19 = 0; +int x20 = 0; +int x21 = 0; +int x22 = 0; +int x23 = 0; +int x24 = 0; +int y = 0; +int y1 = 1; +int y2 = 2; +int y3 = 3; +int y4 = 4; +int y5 = 5; +int y6 = 6; +int y7 = 7; +int y8 = 8; +int y9 = 9; +int y10 = 10; +int y11 = 11; +int y12 = 12; +int y13 = 13; +int y14 = 14; +int y15 = 15; +int y16 = 16; +int y17 = 17; +int y18 = 18; +int y19 = 19; +int y20 = 20; +int y21 = 21; +int y22 = 22; +int y23 = 23; +int y24 = 24; +int change = 1; +int n[84][48]; +int array[48][84]; +int nj = 48; +int cells[84][48]; +int Score = 0; +int randX; +int randY; +char str[64]; +int pause=0; + +void Menu(); //Start screen +void Welcomescreen(); //Prints Welcome to snake on screen +void clearCells(); //Clears Screen +void checkerBoard(); //produces checkers before game begins +void DrawArray(); //Sets the pixel depending on whether 0 or higher than 1 +void ClearArray();//Checks over each individual pixel and if its 0 it will clear +void GenerateFood();//Generates food at random places +void MakeSnake(); //sets the pixels for the snake +void SnakeGame(); // Game Rules +void MoveSnake(); //moving the snake using the joy stick +void calibrateJoystick(); +void updateJoystick(); +void SnakeGrowing(); +void GameOver();//Game ends +void drawLine(); +void calibrateJoystick(); +void updateJoystick(); + +int main() +{ + buttonA.mode(PullDown); + calibrateJoystick(); // get centred values of joystick + pollJoystick.attach(&updateJoystick,1.0/10.0); // read joystick 10 times per second + calibrateJoystick(); + updateJoystick(); + lcd.init(); + Welcomescreen(); + lcd.clear(); + GenerateFood(); + DrawArray(); + Menu(); + while(1) { + + MakeSnake(); + ClearArray(); + DrawArray(); + } +} +//menu screen +void Menu() +{ + // first need to initialise display + + lcd.clear(); + lcd.printString("Press Button",6,1); + lcd.printString("To",35,3); + lcd.printString("START",27,5); + wait(0.3); + + while(1) { + if (buttonA==1) { + lcd.clear(); + checkerBoard(); + wait(0.5); + lcd.clear(); + + + while(1) { + + wait(0.005); + SnakeGame(); + if (buttonA==1) { + pause=0; + Menu(); + } + + if (button==1) { + pause=0; + lcd.clear(); + sprintf(str,"%d",Score); + lcd.printString(str,37,2); + wait(1); + } + } + } + } +} + +void Welcomescreen() // Display welcome screen +{ + lcd.printString("Welcome",20,1); // display Welcome + wait(0.1); + lcd.printString("To",35,3); // display To + wait(0.1); + lcd.printString("SNAKE",27,5); // display Snake + wait(1); +} + +void checkerBoard() +{ +// + for (int i = 0; i < ni ; i+=2) { + for (int j = 0; j < nj ; j+=2) { + lcd.setPixel(i,j); + } + } + lcd.refresh(); +} + +void DrawArray() +{ + for(int x=0; x<84; x++) { + for (int y=0; y<48; y++) { + if(array[y][x]>=1) { + lcd.setPixel(x,y); + } else { + lcd.clearPixel(x,y); + } + } + } + lcd.refresh(); +} + +void ClearArray() +{ + for(int x=0; x<84; x++) { + for(int y=0; y<48; y++) { + if (array[y][x]==0) { + lcd.clearPixel(x,y); + } else { + lcd.setPixel(x,y); + } + } + } + lcd.refresh(); +} + +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;// read button state + joystick.button = button; // calculate direction depending on x,y values + if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) { // tolerance allows a little lee-way in case joystick not exactly in the stated direction + joystick.direction = CENTRE; + } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) { + joystick.direction = LEFT; + } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) { + joystick.direction = RIGHT; + } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) { + joystick.direction = DOWN; + } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) { + joystick.direction = UP; + } else { + joystick.direction = UNKNOWN; + } + printFlag = 1;// set flag for printing +} + +void GenerateFood() +{ + randX = rand() %83; //make random number between 0 - 84 + randY = rand() %47; //make random number between 0 - 48 + while(array[randY][randX]) { + randX= rand() %83; + randY= rand() %47; + } + array[randY][randX]= 5; +} +void MakeSnake() +{ + array[y+36][x+5]= 1; + array[y1+36][x1+5]= 1; + array[y2+36][x2+5]= 1; + array[y3+36][x3+5]= 1; + array[y4+36][x4+5]= 1; + array[y5+36][x5+5]= 0; + array[y6+36][x6+5]= 0; + array[y7+36][x7+5]= 0; + array[y8+36][x7+5]= 0; + array[y9+36][x9+5]= 0; + array[y10+36][x10+5]= 0; + array[y11+36][x11+5]= 0; + array[y12+36][x12+5]= 0; + array[y13+36][x13+5]= 0; + array[y14+36][x14+5]= 0; + array[y15+36][x15+5]= 0; + array[y16+36][x16+5]= 0; + array[y17+36][x17+5]= 0; + array[y18+36][x18+5]= 0; + array[y19+36][x19+5]= 0; + array[y20+36][x20+5]= 0; + array[y21+36][x21+5]= 0; + array[y22+36][x22+5]= 0; + array[y23+36][x23+5]= 0; + array[y24+36][x24+5]= 0; +} + +void SnakeGame() +{ + MakeSnake(); + ClearArray(); + DrawArray(); + SnakeGrowing(); + if(pause==0) { + MoveSnake(); + } + if(y+36==randY && x+5==randX) { + GenerateFood(); + + Score= Score+10; + } + +} +void MoveSnake() +{ + array[y+36][x+5]= 0; + + array[y1+36][x1+5]= 0; + + array[y2+36][x2+5]= 0; + + array[y3+36][x3+5]= 0; + + array[y4+36][x4+5]= 0; + + array[y5+36][x5+5]= 0; + + array[y6+36][x6+5]= 0; + + array[y7+36][x7+5]= 0; + + array[y8+36][x8+5]= 0; + + array[y9+36][x9+5]= 0; + + array[y10+36][x10+5]= 0; + + array[y11+36][x11+5]= 0; + + array[y12+36][x12+5]= 0; + + array[y13+36][x13+5]= 0; + + array[y14+36][x14+5]= 0; + + array[y15+36][x15+5]= 0; + + array[y16+36][x16+5]= 0; + + array[y17+36][x17+5]= 0; + + array[y18+36][x18+5]= 0; + + array[y19+36][x19+5]= 0; + + array[y20+36][x20+5]= 0; + + array[y21+36][x21+5]= 0; + + array[y22+36][x22+5]= 0; + + array[y23+36][x23+5]= 0; + + array[y24+36][x24+5]= 0; + + x24=x23; + y24=y23; + x23=x22; + y23=y22; + x22=x21; + y22=y21; + x21=x20; + y21=y20; + x20=x19; + y20=y19; + x19=x18; + y19=y18; + x18=x17; + y18=y17; + x17=x16; + y17=y16; + x16=x15; + y16=y15; + x15=x14; + y15=y14; + x14=x13; + y14=y13; + x13=x12; + y13=y12; + x12=x11; + y12=y11; + x11=x10; + y11=y10; + x10=x9; + y10=y9; + x9=x8; + y9=y8; + x8=x7; + y8=y7; + x7=x6; + y7=y6; + x6=x5; + y6=y5; + x5=x4; + y5=y4; + x4=x3; + y4=y3; + x3=x2; + y3=y2; + x2=x1; + y2=y1; + x1 = x; + y1 = y; + if (joystick.direction == CENTRE) { + //lcd.printString("CENTRE",20,1); // display welcome + wait(0.05); + } else if (joystick.direction == UP) { + //lcd.printString("UP",20,1); // display welcome + wait(0.05); + change = 1; + } else if (joystick.direction == DOWN) { + //lcd.printString("DOWN",20,1); // display welcome + wait(0.05); + change = 2; + } else if (joystick.direction == LEFT) { + //lcd.printString("LEFT",20,1); // display welcome + wait(0.05); + change = 3; + } else if (joystick.direction == RIGHT) { + //lcd.printString("RIGHT",20,1); // display welcome + wait(0.05); + change = 4; + } + if (change == 1) { + y--; + } else if (change == 2) { + y++; + } else if (change == 3) { + x--; + } else if (change == 4) { + x++; + } + +} +void SnakeGrowing() +{ + + + if(Score>=10) { + array[y+36][x+5]= 1; + + array[y1+36][x1+5]= 1; + + array[y2+36][x2+5]= 1; + + array[y3+36][x3+5]= 1; + + array[y4+36][x4+5]= 1; + + array[y5+36][x5+5]= 1; + + array[y6+36][x6+5]= 1; + + } + + + if(Score>=20) { + array[y+36][x+5]= 1; + + array[y1+36][x1+5]= 1; + + array[y2+36][x2+5]= 1; + + array[y3+36][x3+5]= 1; + + array[y4+36][x4+5]= 1; + + array[y5+36][x5+5]= 1; + + array[y6+36][x6+5]= 1; + + array[y7+36][x7+5]= 1; + + array[y8+36][x8+5]= 1; + } + if(Score>=30) { + array[y+36][x+5]= 1; + + array[y1+36][x1+5]= 1; + + array[y2+36][x2+5]= 1; + + array[y3+36][x3+5]= 1; + + array[y4+36][x4+5]= 1; + + array[y5+36][x5+5]= 1; + + array[y6+36][x6+5]= 1; + + array[y7+36][x7+5]= 1; + + array[y8+36][x8+5]= 1; + + array[y9+36][x9+5]= 1; + + array[y10+36][x10+5]= 1; + + } + if(Score>=40) { + array[y+36][x+5]= 1; + + array[y1+36][x1+5]= 1; + + array[y2+36][x2+5]= 1; + + array[y3+36][x3+5]= 1; + + array[y4+36][x4+5]= 1; + + array[y5+36][x5+5]= 1; + + array[y6+36][x6+5]= 1; + + array[y7+36][x7+5]= 1; + + array[y8+36][x8+5]= 1; + + array[y9+36][x9+5]= 1; + + array[y10+36][x10+5]= 1; + + array[y11+36][x11+5]= 1; + + array[y12+36][x12+5]= 1; + + } + if(Score>=50) { + array[y+36][x+5]= 1; + + array[y1+36][x1+5]= 1; + + array[y2+36][x2+5]= 1; + + array[y3+36][x3+5]= 1; + + array[y4+36][x4+5]= 1; + + array[y5+36][x5+5]= 1; + + array[y6+36][x6+5]= 1; + + array[y7+36][x7+5]= 1; + + array[y8+36][x8+5]= 1; + + array[y9+36][x9+5]= 1; + + array[y10+36][x10+5]= 1; + + array[y11+36][x11+5]= 1; + + array[y12+36][x12+5]= 1; + + array[y13+36][x13+5]= 1; + + array[y14+36][x14+5]= 1; + + } + if(Score>=60) { + array[y+36][x+5]= 1; + + array[y1+36][x1+5]= 1; + + array[y2+36][x2+5]= 1; + + array[y3+36][x3+5]= 1; + + array[y4+36][x4+5]= 1; + + array[y5+36][x5+5]= 1; + + array[y6+36][x6+5]= 1; + + array[y7+36][x7+5]= 1; + + array[y8+36][x8+5]= 1; + + array[y9+36][x9+5]= 1; + + array[y10+36][x10+5]= 1; + + array[y11+36][x11+5]= 1; + + array[y12+36][x12+5]= 1; + + array[y13+36][x13+5]= 1; + + array[y14+36][x14+5]= 1; + + array[y15+36][x15+5]= 1; + + array[y16+36][x16+5]= 1; + + } + if(Score>=70) { + array[y+36][x+5]= 1; + + array[y1+36][x1+5]= 1; + + array[y2+36][x2+5]= 1; + + array[y3+36][x3+5]= 1; + + array[y4+36][x4+5]= 1; + + array[y5+36][x5+5]= 1; + + array[y6+36][x6+5]= 1; + + array[y7+36][x7+5]= 1; + + array[y8+36][x8+5]= 1; + + array[y9+36][x9+5]= 1; + + array[y10+36][x10+5]= 1; + + array[y11+36][x11+5]= 1; + + array[y12+36][x12+5]= 1; + + array[y13+36][x13+5]= 1; + + array[y14+36][x14+5]= 1; + + array[y15+36][x15+5]= 1; + + array[y16+36][x16+5]= 1; + + array[y17+36][x17+5]= 1; + + array[y18+36][x18+5]= 1; + + } + if(Score>=80) { + array[y+36][x+5]= 1; + + array[y1+36][x1+5]= 1; + + array[y2+36][x2+5]= 1; + + array[y3+36][x3+5]= 1; + + array[y4+36][x4+5]= 1; + + array[y5+36][x5+5]= 1; + + array[y6+36][x6+5]= 1; + + array[y7+36][x7+5]= 1; + + array[y8+36][x8+5]= 1; + + array[y9+36][x9+5]= 1; + + array[y10+36][x10+5]= 1; + + array[y11+36][x11+5]= 1; + + array[y12+36][x12+5]= 1; + + array[y13+36][x13+5]= 1; + + array[y14+36][x14+5]= 1; + + array[y15+36][x15+5]= 1; + + array[y16+36][x16+5]= 1; + + array[y17+36][x17+5]= 1; + + array[y18+36][x18+5]= 1; + + array[y19+36][x19+5]= 1; + + array[y20+36][x20+5]= 1; + + } + if(Score>=90) { + array[y+36][x+5]= 1; + + array[y1+36][x1+5]= 1; + + array[y2+36][x2+5]= 1; + + array[y3+36][x3+5]= 1; + + array[y4+36][x4+5]= 1; + + array[y5+36][x5+5]= 1; + + array[y6+36][x6+5]= 1; + + array[y7+36][x7+5]= 1; + + array[y8+36][x8+5]= 1; + + array[y9+36][x9+5]= 1; + + array[y10+36][x10+5]= 1; + + array[y11+36][x11+5]= 1; + + array[y12+36][x12+5]= 1; + + array[y13+36][x13+5]= 1; + + array[y14+36][x14+5]= 1; + + array[y15+36][x15+5]= 1; + + array[y16+36][x16+5]= 1; + + array[y17+36][x17+5]= 1; + + array[y18+36][x18+5]= 1; + + array[y19+36][x19+5]= 1; + + array[y20+36][x20+5]= 1; + + array[y21+36][x21+5]= 1; + + array[y22+36][x22+5]= 1; + + } + if(Score>=100) { + array[y+36][x+5]= 1; + + array[y1+36][x1+5]= 1; + + array[y2+36][x2+5]= 1; + + array[y3+36][x3+5]= 1; + + array[y4+36][x4+5]= 1; + + array[y5+36][x5+5]= 1; + + array[y6+36][x6+5]= 1; + + array[y7+36][x7+5]= 1; + + array[y8+36][x8+5]= 1; + + array[y9+36][x9+5]= 1; + + array[y10+36][x10+5]= 1; + + array[y11+36][x11+5]= 1; + + array[y12+36][x12+5]= 1; + + array[y13+36][x13+5]= 1; + + array[y14+36][x14+5]= 1; + + array[y15+36][x15+5]= 1; + + array[y16+36][x16+5]= 1; + + array[y17+36][x17+5]= 1; + + array[y18+36][x18+5]= 1; + + array[y19+36][x19+5]= 1; + + array[y20+36][x20+5]= 1; + + array[y21+36][x21+5]= 1; + + array[y22+36][x22+5]= 1; + + array[y23+36][x23+5]= 1; + + array[y24+36][x24+5]= 1; + + } + DrawArray(); + + + +} + + +/*void GameOver() +{ + + if (button==1) { + + lcd.clear(); + + lcd.printString("Welcome",20,1); // display welcome + //wait(0.1); + lcd.printString("To",35,3); // display To the game + //wait(0.1); + lcd.printString("SNAKE",27,5); // display of life + //wait(1); + } +} +*/ \ No newline at end of file