
Completed Snake Program
Dependencies: N5110 PinDetect PowerControl mbed
Fork of DocTest by
Diff: main.cpp
- Revision:
- 7:2942e97924f0
- Parent:
- 6:1de103a19681
- Child:
- 8:b857684a3983
diff -r 1de103a19681 -r 2942e97924f0 main.cpp --- a/main.cpp Mon Apr 27 20:27:23 2015 +0000 +++ b/main.cpp Thu Apr 30 15:39:20 2015 +0000 @@ -17,7 +17,7 @@ HARD, }; -Difficulty currentDifficulty=EASY; +Difficulty currentDifficulty=EASY;// initialise to easy mode // struct for Joystick @@ -33,7 +33,7 @@ // create struct variable Joystick joystick; -DirectionName previousDirection =RIGHT; +DirectionName previousDirection =RIGHT;//initial direction =Right // read default positions of the joystick to calibrate later readings void calibrateJoystick() @@ -74,8 +74,8 @@ void displaySplash() { - // these are default settings so not strictly needed - lcd.inverseMode(); // normal colour mode + + lcd.inverseMode(); // change colour mode lcd.setBrightness(0.5); // put LED backlight on 50% //Draw S @@ -89,7 +89,7 @@ lcd.printString("NAKE ",34,3); lcd.printString("By M.Birney",10,5); - lcd.drawRect(10,5,65,30,0); + lcd.drawRect(10,5,65,30,0); // outline for splash // need to refresh display after setting pixels @@ -112,9 +112,9 @@ lcd.drawCircle(10,35,2,0); lcd.drawCircle(10,43,2,0); - gameSpeed= 0.5; + 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 +127,7 @@ lcd.drawCircle(10,27,2,0); lcd.drawCircle(10,35,2,1); lcd.drawCircle(10,43,2,0); - gameSpeed=0.5; + gameSpeed=1.0/7; // set medium game speed } void hardSelected() // display when hard is selected @@ -143,9 +143,10 @@ lcd.drawCircle(10,27,2,0); lcd.drawCircle(10,35,2,0); lcd.drawCircle(10,43,2,1); - gameSpeed=1.0/32; + gameSpeed=1.0/12; // set hard game speed } + void checkSelectedDifficulty() { @@ -209,64 +210,72 @@ void startingSnake() { + snakeX.resize(5); + snakeY.resize(5); snakeX[0]=20; - snakeX[1]=22; - snakeX[2]=24; - snakeX[3]=26; - snakeX[4]=28; + snakeX[1]=22; + snakeX[2]=24; + snakeX[3]=26; + snakeX[4]=28; + snakeY[0]=27; + snakeY[1]=27; + snakeY[2]=27; + snakeY[3]=27; + snakeY[4]=27; + - for (int i=0; i<5; i++) { - // lcd.setPixel(snakeX[i],snakeY[i]); - lcd.drawRect(snakeX[i],snakeY[i],1,1,1); + for (int i=0; i<5; i++) { + // lcd.setPixel(snakeX[i],snakeY[i]); + lcd.drawRect(snakeX[i],snakeY[i],1,1,1); } - - - wait(5); + } void randomiseFood() { +// http://stackoverflow.com/questions/3383286/create-a-random-even-number-between-range + srand(time(NULL)); - int randomX = rand() % (83-1)+1; // generate random number between 1 and 82 // spaces within boundar + int randomX = 2 * (1 + rand() % (40 - 1 + 1)) ; //generate random even number between 2 and 80 - int randomY = rand() %(46-9)+9;// generate random number betwwen 9 and 46 + int randomY = (2 * (4 + rand() % (22 - 4 + 1))) +1; // generate random even number between 8 and 44 then plus 1 for odd number in range of 9-45 - // int r = rand() % (21 - 10) + 10 // 10 -21 inclusive - while(lcd.getPixel(randomX,randomY)==1) { // if that pixel is already filled + while(lcd.getPixel(randomX,randomY)==1) { // if that pixel is already filled keep generating till a empty space is found - int randomX = rand() % (83-1)+1; // generate random number between 1 and 82 // spaces within boundar - - int randomY = rand() %(46-9)+9; + int randomX = 2 * (1 + rand() % (40 - 1 + 1)) ; + int randomY = (2 * (4 + rand() % (22 - 4 + 1))) +1; // generate random even number between 8 and 44 then plus 1 for odd number in range of 9-45 } - // lcd.setPixel(randomX,randomY) ;// set the food - lcd.drawRect(randomX,randomY,1,1,1); - food[0]=randomX; // update food position - food[1]=randomY;// update food position + // lcd.setPixel(randomX,randomY) ;// set the food + lcd.drawRect(randomX,randomY,1,1,1); + //lcd.setPixel(randomX,randomY); + + foodX[0]=randomX; // update food position + foodY[0]=randomY;// update food position lcd.refresh(); - +//serial.printf("%d",randomX); } void Boundary() { - for(int x = 0; x< 84; x++) { + for(int x = 1; x< 83; x++) { // draw 1 to 82 at y=8 lcd.setPixel(x,8); } - for(int x = 0; x< 84; x++) { + for(int x = 1; x< 83; x++) { // draw 1 to 82 at y=47 lcd.setPixel(x,47); } - for(int y = 8; y< 48; y++) { - lcd.setPixel(0,y); + for(int y = 8; y< 48; y++) {// draw 8 tp 47 at x=1 + lcd.setPixel(1,y); } - for(int y = 8; y< 48; y++) { - lcd.setPixel(83,y); + for(int y = 8; y< 48; y++) {// draw 8 to 47 at x =82 + lcd.setPixel(82,y); } lcd.refresh(); @@ -301,8 +310,8 @@ } - // lcd.clearPixel(snakeX[0],snakeY[0]);//delete tail - lcd.drawRect(snakeX[0],snakeY[0],1,1,2); + // lcd.clearPixel(snakeX[0],snakeY[0]);//delete tail + lcd.drawRect(snakeX[0],snakeY[0],1,1,2); for (int i =0; i<snakeX.size(); i++) { // shift elements snakeX[i]=snakeX[i + 1]; // apart from head @@ -314,21 +323,33 @@ 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; 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(snakeY[snakeY.size()-1] >45) snakeY[snakeY.size()-1]=9; break; case LEFT: snakeX[snakeX.size()-1]=snakeX[snakeX.size()-2]-2; + + if(snakeX[snakeX.size()-1] <2) snakeX[snakeX.size()-1]=80; + snakeY[snakeY.size()-1]=snakeY[snakeY.size()-2]; break; case RIGHT: - snakeX[snakeX.size()-1]=snakeX[snakeX.size()-2]+2; + 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]; + break; case CENTRE: @@ -342,51 +363,74 @@ } } - +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]); +} void gameOver() { + leds=1; startGame.detach(); - lcd.clearPixel(snakeX.back(),snakeY.back()); + lcd.drawRect(snakeX.back(),snakeY.back(),1,1,2); wait(0.2); lcd.refresh(); - lcd.setPixel(snakeX.back(),snakeY.back()); + lcd.drawRect(snakeX.back(),snakeY.back(),1,1,1); wait(0.3); lcd.refresh(); - lcd.clearPixel(snakeX.back(),snakeY.back()); + lcd.drawRect(snakeX.back(),snakeY.back(),1,1,2); wait(0.2); lcd.refresh(); - lcd.setPixel(snakeX.back(),snakeY.back()); + lcd.drawRect(snakeX.back(),snakeY.back(),1,1,1); wait(0.2); lcd.refresh(); lcd.clear(); lcd.inverseMode(); - + lcd.printString("Your Score" ,12,0); - lcd.printString("=" ,34,1); - - int updatedScore=score; - int length = sprintf(buffer,"%2d",updatedScore); + lcd.printString("=" ,34,1); + + int updatedScore=score; + int length = sprintf(buffer,"%2d",updatedScore); + + if (length <= 14) // if string will fit on display + lcd.printString(buffer,40,1); - if (length <= 14) // if string will fit on display - lcd.printString(buffer,40,1); - - lcd.printString("Press Reset" ,2,3); - lcd.printString("Button To" ,10,4); - lcd.printString("Play Again" ,20,5); - // - lcd.refresh(); - gamePlaying=0; + lcd.printString("Press Reset" ,2,3); + lcd.printString("Button To" ,10,4); + lcd.printString("Play Again" ,20,5); + // + lcd.refresh(); + playTune(); + //gamePlaying=0; + + } + + void checkForCollision() { - if (snakeX.back()<=0 || snakeX.back()>=82 || snakeY.back()<=8 ||snakeY.back()>=47) { - + if (snakeX.back()==0|| snakeX.back()==82 || snakeY.back()==7 ||snakeY.back()>=47) { + myleds=15; + gameOver(); } } @@ -396,32 +440,43 @@ void checkForFood() { - if (snakeX.back()+1==food[0] && snakeY.back()==food[1]) { // if x and y of head match food + if (snakeX.back()==foodX[0] && snakeY.back()==foodY[0]) { // if x and y of head match food switch(joystick.direction) { case RIGHT: - snakeX.push_back(food[0]+2); - snakeY.push_back(food[1]); + snakeX.insert (snakeX.begin() +0,foodX[0]-2 ); + snakeY.insert (snakeY.begin() ,foodY[0]); + //snakeX.push_back(foodX[0]+2); + // snakeY.push_back(foodY[0]); break; case LEFT: - snakeX.push_back(food[0]-2); - snakeY.push_back(food[1]); + snakeX.insert (snakeX.begin() +0,foodX[0]+2 ); + snakeY.insert (snakeY.begin() ,foodY[0]); + + // snakeX.push_back(foodX[0]-2); + // snakeY.push_back(foodY[0]); break; case UP: - snakeX.push_back(food[0]); - snakeY.push_back(food[1]-2); + + snakeX.insert (snakeX.begin() +0,foodX[0] ); + snakeY.insert (snakeY.begin() ,foodY[0]+2); + // snakeX.push_back(foodX[0]); + // snakeY.push_back(foodY[0]-2); break; case DOWN: - snakeX.push_back(food[0]); - snakeY.push_back(food[1]+2); + snakeX.insert (snakeX.begin() +0,foodX[0] ); + snakeY.insert (snakeY.begin() ,foodY[0]-2); + // snakeX.push_back(foodX[0]); + // snakeY.push_back(foodY[0]+2); break; } + lcd.drawRect(snakeX[0],snakeY[0],1,1,1); int updatedScore; // snakeX.insert (snakeX.begin() + 0, ); @@ -445,12 +500,18 @@ void startButtonPressed() { gamePlaying=1; - // myleds=15; + // myleds=15; } +void updateBrightness() +{ + float ain ; + ain=pot.read(); + lcd.setBrightness(1-ain); +} void updateGameISR() { updateGameFlag=1; @@ -459,8 +520,8 @@ void printVectorContent() { - for( int i=0; i<snakeX.size(); i++) - serial.printf( "%d \n \r" ,snakeX[i]); + //for( int i=0; i<snakeX.size(); i++) + // serial.printf( "%d \n \r" ,snakeX[i]); } @@ -474,6 +535,8 @@ startGame.detach(); gamePaused=1; + leds=2; + } else { @@ -490,78 +553,71 @@ void checkForCollisionWithSelf(int i) { - - if(snakeX.back()==snakeX[i] && snakeY.back()==snakeY[i]) { - - - gameOver(); - - + if(snakeX.back()==snakeX[i] && snakeY.back()==snakeY[i]) { + gameOver(); } } void startUpMenu() { - - // first need to initialise display - - displaySplash(); - wait(4); +lcd.inverseMode(); easySelected(); joystick.direction=UNKNOWN; calibrateJoystick(); // get centred values of joystick - pollJoystick.attach(&updateJoystick,1.0/5.0); - startGame.attach(&updateGameISR,gameSpeed); // read joystick 10 times per second - - - + } void resetButtonPressed() { - // myleds=0; - easySelected(); - pollJoystick.attach(&updateJoystick,1.0/5.0); + gamePlaying=0; } int main() { + leds=1; lcd.init(); - startUpMenu(); resetButton.mode(PullDown); startButton.mode(PullDown); button.mode(PullDown); startButton.rise(&startButtonPressed); resetButton.rise(&resetButtonPressed); button.rise(&pauseButtonPressed); -serial.printf("starting"); + displaySplash(); + wait(4); +//serial.printf("starting"); while(1) { - if (gamePlaying==0) { + startUpMenu(); + while (gamePlaying==0) { + updateJoystick(); checkSelectedDifficulty(); - serial.printf("check difficulty loop"); + updateBrightness(); + //serial.printf("check difficulty loop"); } - else if (gamePlaying==1) { + if (gamePlaying==1) { + lcd.clear(); lcd.normalMode(); // normal colour mode Boundary(); - - pollJoystick.detach(); - startGame.attach(&updateGameISR,gameSpeed); + previousDirection=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); if (length <= 14) // if string will fit on display lcd.printString(buffer,0,0); // lcd.drawRect(0,0,83,7,0); - lcd.refresh(); - serial.printf("gameplaying=1 game init"); + lcd.refresh(); + startGame.attach(&updateGameISR,gameSpeed); + + while (gamePlaying==1) { - //init game start time back food - while (1) { - serial.printf("enter game loop"); + // serial.printf("enter game loop"); if(updateGameFlag==1) { + leds=4; //updateJoystick(); updateGameFlag=0; updateJoystick(); @@ -570,31 +626,31 @@ 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(); checkForFood(); - checkForCollision(); - + + for (int i=0; i<snakeX.size()-1; i++) { checkForCollisionWithSelf(i); - } - + updateBrightness(); + //serial.printf("%d",snakeX.size()); + // printVectorContent(); - //serial.printf("%d",snakeX.size()); - // printVectorContent(); + } } } - } - } + } } \ No newline at end of file