
Completed Snake Program
Dependencies: N5110 PinDetect PowerControl mbed
Fork of DocTest by
Diff: main.cpp
- Revision:
- 8:b857684a3983
- Parent:
- 7:2942e97924f0
- Child:
- 9:77b83754460c
diff -r 2942e97924f0 -r b857684a3983 main.cpp --- a/main.cpp Thu Apr 30 15:39:20 2015 +0000 +++ b/main.cpp Thu Apr 30 20:53:56 2015 +0000 @@ -17,8 +17,13 @@ HARD, }; +enum GameMode { + CLASSIC, + BOUNDARY, +}; + Difficulty currentDifficulty=EASY;// initialise to easy mode - +GameMode selectedGameMode=CLASSIC; // struct for Joystick typedef struct JoyStick Joystick; @@ -74,7 +79,7 @@ void displaySplash() { - + lcd.inverseMode(); // change colour mode lcd.setBrightness(0.5); // put LED backlight on 50% @@ -114,7 +119,7 @@ gameSpeed= 1.0/5; // set easy game speed(for game time) } -void mediumSelected() // display when medium is selected +void mediumSelected() // display when medium is selected { currentDifficulty=MEDIUM; lcd.clear(); @@ -127,7 +132,7 @@ lcd.drawCircle(10,27,2,0); lcd.drawCircle(10,35,2,1); lcd.drawCircle(10,43,2,0); - gameSpeed=1.0/7; // set medium game speed + gameSpeed=1.0/7; // set medium game speed } void hardSelected() // display when hard is selected @@ -146,6 +151,76 @@ gameSpeed=1.0/12; // set hard game speed } +void classicModeSelected() +{ + + + selectedGameMode=CLASSIC; + lcd.clear(); + lcd.printString("Please Select",2,0); + lcd.printString("Game Mode:",2,1); + lcd.printString("Classic",20,3); + lcd.printString("Boundary",20,4); + lcd.refresh(); + lcd.drawCircle(10,27,2,1); + lcd.drawCircle(10,35,2,0); + +} + +void boundaryModeSelected() +{ + selectedGameMode=BOUNDARY; + lcd.clear(); + lcd.printString("Please Select",2,0); + lcd.printString("Game Mode:",2,1); + lcd.printString("Classic",20,3); + lcd.printString("Boundary",20,4); + lcd.refresh(); + lcd.drawCircle(10,27,2,0); + lcd.drawCircle(10,35,2,1); + +} + + +void checkSelectedGameMode() +{ + + switch(selectedGameMode) { + case CLASSIC://classicMode; + + switch (joystick.direction) { + + case UP: + boundaryModeSelected(); + break; + + + case DOWN: + boundaryModeSelected(); + break; + } + break; + + + case BOUNDARY: + + switch (joystick.direction) { + + case UP: + classicModeSelected(); + break; + + + case DOWN: + classicModeSelected(); + break; + } + + break; + } + wait(0.2); + +} void checkSelectedDifficulty() { @@ -210,8 +285,8 @@ void startingSnake() { - snakeX.resize(5); - snakeY.resize(5); + snakeX.resize(5); + snakeY.resize(5); snakeX[0]=20; snakeX[1]=22; snakeX[2]=24; @@ -222,7 +297,7 @@ snakeY[2]=27; snakeY[3]=27; snakeY[4]=27; - + for (int i=0; i<5; i++) { // lcd.setPixel(snakeX[i],snakeY[i]); @@ -261,7 +336,7 @@ //serial.printf("%d",randomX); } -void Boundary() +void hardBoundary() { @@ -281,9 +356,26 @@ lcd.refresh(); } +void classicBoundary() +{ + for(int x = 1; x< 83; x++) { // draw 1 to 82 at y=8 + lcd.setPixel(x,8); + } + for(int x = 1; x< 83; x+=2) { // draw 1 to 82 at y=47 + lcd.setPixel(x,47); + } + for(int y = 8; y< 48; y+=2) {// draw 8 tp 47 at x=1 + lcd.setPixel(1,y); + } + for(int y = 8; y< 48; y+=2) {// draw 8 to 47 at x =82 + lcd.setPixel(82,y); + } + lcd.refresh(); + +} void updateSnakeArray() @@ -323,33 +415,38 @@ case UP: snakeX[snakeX.size()-1]=snakeX[snakeX.size()-2]; snakeY[snakeY.size()-1]=snakeY[snakeY.size()-2]-2; - - if(snakeY[snakeY.size()-1] <9) snakeY[snakeY.size()-1]=45; + + if (selectedGameMode==CLASSIC){ + if(snakeY[snakeY.size()-1] <9) snakeY[snakeY.size()-1]=45; + } break; case DOWN: - snakeX[snakeX.size()-1]=snakeX[snakeX.size()-2]; + snakeX[snakeX.size()-1]=snakeX[snakeX.size()-2]; snakeY[snakeY.size()-1]=snakeY[snakeY.size()-2]+2; + if (selectedGameMode==CLASSIC){ if(snakeY[snakeY.size()-1] >45) snakeY[snakeY.size()-1]=9; + } break; case LEFT: snakeX[snakeX.size()-1]=snakeX[snakeX.size()-2]-2; + snakeY[snakeY.size()-1]=snakeY[snakeY.size()-2]; - if(snakeX[snakeX.size()-1] <2) snakeX[snakeX.size()-1]=80; - - snakeY[snakeY.size()-1]=snakeY[snakeY.size()-2]; + if (selectedGameMode==CLASSIC){ + if(snakeX[snakeX.size()-1] <2) snakeX[snakeX.size()-1]=80; + } break; case RIGHT: snakeX[snakeX.size()-1]= snakeX[snakeX.size()-2]+2; - - if(snakeX[snakeX.size()-1] >80) snakeX[snakeX.size()-1]=2; - + snakeY[snakeY.size()-1]=snakeY[snakeY.size()-2]; - snakeY[snakeY.size()-1]=snakeY[snakeY.size()-2]; - + if (selectedGameMode==CLASSIC){ + if(snakeX[snakeX.size()-1] >80) snakeX[snakeX.size()-1]=2; + } + break; case CENTRE: @@ -365,20 +462,20 @@ } void playTune() { - + //float frequency[]={440,659}; - // float beat[]={1,1,}; - // Buzzer=0.3; - // Buzzer.period(1/(440));// time =1/f - //wait(1); - //Buzzer.period(1/(659)); - - //Buzzer=0; - - // set PWM period - -// set duty cycle - //wait(0.5*beat[i]); + // float beat[]={1,1,}; + // Buzzer=0.3; + // Buzzer.period(1/(440));// time =1/f + //wait(1); + //Buzzer.period(1/(659)); + + //Buzzer=0; + + // set PWM period + +// set duty cycle + //wait(0.5*beat[i]); } void gameOver() { @@ -412,11 +509,11 @@ lcd.printString("Press Reset" ,2,3); lcd.printString("Button To" ,10,4); lcd.printString("Play Again" ,20,5); - + // lcd.refresh(); - playTune(); - + playTune(); + //gamePlaying=0; @@ -499,8 +596,14 @@ void startButtonPressed() { - gamePlaying=1; - // myleds=15; + if (menuState==0) { + menuState=1; + } + + else if (menuState==1) { + menuState=2; + } + } @@ -561,22 +664,30 @@ } void startUpMenu() { -lcd.inverseMode(); + lcd.inverseMode(); easySelected(); joystick.direction=UNKNOWN; calibrateJoystick(); // get centred values of joystick - + +} + +void ModeMenu() +{ + classicModeSelected(); + joystick.direction=UNKNOWN; + calibrateJoystick(); // get centred values of joystick } void resetButtonPressed() { - gamePlaying=0; + //gamePlaying=0; + menuState=0; } int main() { - leds=1; + lcd.init(); resetButton.mode(PullDown); startButton.mode(PullDown); @@ -584,36 +695,56 @@ startButton.rise(&startButtonPressed); resetButton.rise(&resetButtonPressed); button.rise(&pauseButtonPressed); - displaySplash(); + displaySplash(); + leds=1; wait(4); //serial.printf("starting"); while(1) { + leds=1; startUpMenu(); - while (gamePlaying==0) { + while (menuState==0) { updateJoystick(); checkSelectedDifficulty(); updateBrightness(); //serial.printf("check difficulty loop"); + + if (menuState==1){ + ModeMenu(); + } } - if (gamePlaying==1) { + + while(menuState==1) { + // ModeMenu(); + + updateJoystick(); + checkSelectedGameMode(); + updateBrightness(); + + } + + if (menuState==2) { lcd.clear(); - lcd.normalMode(); // normal colour mode - Boundary(); + lcd.normalMode(); + if (selectedGameMode==BOUNDARY) hardBoundary(); + if (selectedGameMode==CLASSIC) classicBoundary(); + + // normal colour mode + previousDirection=RIGHT; - joystick.direction=RIGHT; // make sure when game reset that joystick is reset to right + joystick.direction=RIGHT; // make sure when game reset that joystick is reset to right startingSnake(); randomiseFood(); int score=5; - int length = sprintf(buffer,"%2d",score); + int length = sprintf(buffer,"%2d",score); if (length <= 14) // if string will fit on display lcd.printString(buffer,0,0); // lcd.drawRect(0,0,83,7,0); - lcd.refresh(); - startGame.attach(&updateGameISR,gameSpeed); - - while (gamePlaying==1) { + lcd.refresh(); + startGame.attach(&updateGameISR,gameSpeed); + + while (menuState==2) { // serial.printf("enter game loop"); if(updateGameFlag==1) { @@ -626,20 +757,20 @@ updateSnakeArray(); for (int i=0; i<snakeX.size(); i++) { lcd.drawRect(snakeX[i],snakeY[i],1,1,1); - // lcd.setPixel(snakeX[i],snakeY[i]); - - + // lcd.setPixel(snakeX[i],snakeY[i]); } lcd.refresh(); previousDirection=joystick.direction; - //checkForCollision(); + if (selectedGameMode==BOUNDARY) checkForCollision(); + + checkForFood(); for (int i=0; i<snakeX.size()-1; i++) { checkForCollisionWithSelf(i); - updateBrightness(); + updateBrightness(); //serial.printf("%d",snakeX.size()); // printVectorContent();