Mohamed Moawya / SnakeGame

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SnakeEngine.cpp Source File

SnakeEngine.cpp

00001 #include "SnakeEngine.h"
00002 SnakeEngine::SnakeEngine(Gamepad &pad, N5110 &display):gamePad(pad), lcd(display){
00003     
00004 }
00005 SnakeEngine::~SnakeEngine(){
00006 
00007 }
00008 
00009 void SnakeEngine::drawSnake(){
00010     for(int i=0;i<snakeSize;i++)
00011         lcd.drawRect(snake[i].X,snake[i].Y,gameObjectSize,gameObjectSize,FILL_BLACK);
00012 
00013 }
00014 
00015 void SnakeEngine::drawFood(){
00016     lcd.drawRect(food.X,food.Y,gameObjectSize,gameObjectSize,FILL_BLACK);
00017 
00018 }
00019 
00020 void SnakeEngine::drawScore(){
00021     char buffer1[14];
00022     sprintf(buffer1,"S:%2d      H:%2d",gameScore,gameLife);
00023     lcd.printString(buffer1,0,0);
00024 }
00025 
00026 void SnakeEngine::drawGameFrame(){
00027     lcd.clear();
00028     drawScore();
00029     lcd.drawLine(0,10,83,10,1);
00030     drawSnake();
00031     drawFood();
00032     lcd.refresh();
00033 }
00034 
00035 void SnakeEngine::regenFood(){
00036     do{
00037         food.X = rand() % (AREA_X + 1 - 12) + 12;//random(2,AREA_X);
00038     } while(food.X % gameObjectSize != 0);
00039     do {
00040         food.Y = rand() % (AREA_Y + 1 - 12) + 12;//random(2,AREA_Y);
00041     } while(food.Y % gameObjectSize != 0);
00042 }
00043 
00044 void SnakeEngine::isColliding(){
00045     //if snake is eating food
00046     if((snake[0].X == food.X) && (snake[0].Y == food.Y)){
00047         //turn on LEDs momentarily when eating food
00048         gamePad.leds_on();
00049         wait(0.1);
00050         gamePad.leds_off();
00051         //LED effect off
00052         snakeSize++; // grow snake
00053         gameScore++; //increase score
00054         regenFood(); // recreate snake food
00055     }
00056     else{ // snake is eating himself
00057         for(int i=1; i<snakeSize;i++){
00058             if((snake[0].X == snake[i].X) && (snake[0].Y == snake[i].Y)){
00059                 gamePad.tone(1000.0,0.1);
00060                 gameLife--;
00061                 if(gameLife == 0)
00062                     state = GAMEOVER;
00063                 else
00064                     state = NEWLIFE;
00065             }
00066         }
00067     }
00068 /*
00069     //snake is going to hit a wall
00070     if((snake[0].X < AREA_X_min) || (snake[0].Y < AREA_Y_min) || (snake[0].X>AREA_X) || (snake[0].Y > AREA_Y)){
00071         gamePad.tone(1000.0,1);
00072         gameLife--;
00073         if(gameLife == 0)
00074             state = GAMEOVER;
00075         else
00076             state = NEWLIFE;
00077     }
00078     */
00079     /*******************update********************/
00080     //start
00081     if (snake[0].X <= AREA_X_min)
00082         snake[0].X = AREA_X;
00083     else if (snake[0].X >= AREA_X)
00084         snake[0].X = AREA_X_min;
00085 
00086     if (snake[0].Y <= AREA_Y_min)
00087         snake[0].Y = AREA_Y;
00088     else if (snake[0].Y >= AREA_Y)
00089         snake[0].Y = AREA_Y_min;
00090     //end
00091 
00092     /*******************update********************/
00093 }
00094 
00095 
00096 
00097 void SnakeEngine::setupGame(){
00098     snakeSize = 3; // initial size of the snake
00099     dirSnake = 1; // initialize snake direction
00100     //initialize snake body
00101     for(int i=1;i<snakeSize;i++){
00102         snake[i].X = 0;
00103         snake[i].Y = 0;
00104     }
00105     snake[0].X = 12;//head_x;
00106     snake[0].Y = AREA_Y_min;//head_y;
00107 
00108     // decide where the body of the sanke goes
00109 
00110     for(int i=1;i<snakeSize;i++){
00111         int dir = 0;//rand() % 4;//random(0,3);
00112 
00113         if(dir == 0){ // if the snake is facing left
00114             snake[i].X = snake[i-1].X - gameObjectSize;
00115             snake[i].Y = snake[i-1].Y;
00116         }
00117         else if(dir == 1){ // if the snake is facing right
00118             snake[i].X = snake[i-1].X + gameObjectSize;
00119             snake[i].Y = snake[i-1].Y;
00120         }
00121         else if(dir == 2){ // if snake is facing up
00122             snake[i].X = snake[i-1].X;
00123             snake[i].Y = snake[i-1].Y - gameObjectSize;
00124         }
00125         else if(dir == 3){
00126             snake[i].X = snake[i-1].X;
00127             snake[i].Y = snake[i-1].Y + gameObjectSize;
00128         }
00129     }
00130 
00131     //regenerate snake food
00132     regenFood();
00133 
00134     state = PAUSE; //  change the game state once setup
00135 }
00136 
00137 void SnakeEngine::readUserInput(){
00138     // read left button
00139     bLeft = gamePad.Y_pressed();
00140     //read right button
00141     bRight = gamePad.A_pressed();
00142     //read up button
00143     bUp = gamePad.X_pressed();
00144     //read down button
00145     bDown = gamePad.B_pressed();
00146 }
00147 
00148 void SnakeEngine::handleUserInput() {
00149     
00150     readUserInput();
00151 
00152     if((bLeft != false) && (dirSnake != 1))
00153         dirSnake = 0;
00154     if((bRight != false) && (dirSnake != 0))
00155         dirSnake = 1;
00156     if((bDown != false) && (dirSnake != 3))
00157         dirSnake = 2;
00158     if((bUp != false) && (dirSnake != 2))
00159         dirSnake = 3;
00160 }
00161 
00162 void SnakeEngine::updateGame(){
00163     //update body of the snake
00164     for(int i= snakeSize-1;i>0;i--){
00165         snake[i].X = snake[i-1].X;
00166         snake[i].Y = snake[i-1].Y;
00167     }
00168 
00169     // snake is moving left
00170     if(dirSnake == 0)
00171         snake[0].X -= gameObjectSize;
00172     else if(dirSnake == 1) // snake is moving right
00173         snake[0].X += gameObjectSize;
00174     else if(dirSnake == 2) // snake is moving up
00175         snake[0].Y += gameObjectSize; 
00176     else if(dirSnake == 3) // snake is moving down
00177         snake[0].Y -= gameObjectSize;
00178 }
00179 
00180 void SnakeEngine::playGame(){
00181     isColliding();
00182     if(state != NEWLIFE && state != GAMEOVER){
00183         handleUserInput();
00184         updateGame();
00185         drawGameFrame();
00186     }
00187 
00188     //clear game
00189     
00190 }
00191 
00192 void SnakeEngine::gameIsPaused(){
00193     readUserInput();
00194 
00195     // if paused, wait for a user input
00196     if((bLeft != false) || (bRight != false) || (bDown != false) || (bUp != false))
00197         state = INGAME;
00198 
00199     //redraw
00200     drawGameFrame();
00201 }
00202 void SnakeEngine::gameIsLost(){
00203     //redraw
00204     lcd.clear();
00205     lcd.printString("Game Over",0,1);
00206     char buffer1[14];
00207     sprintf(buffer1,"Score is %2d",gameScore);
00208     lcd.printString(buffer1,0,4);
00209     lcd.refresh();
00210     wait(5);
00211     state = SETUP;
00212     gameLife = 3;
00213     gameScore = 0;
00214 }
00215 void SnakeEngine::init() {
00216     dirSnake = 1;
00217     gameScore = 0;
00218     gameLife = 3;
00219     gameObjectSize = 4;
00220     snakeSize = 3;
00221 
00222     state = SETUP;
00223 
00224     bLeft = false;
00225     bRight = false;
00226     bDown = false;
00227     bUp = false;
00228 
00229     AREA_X = 82;
00230     AREA_Y = 46;
00231     AREA_X_min = 1;
00232     AREA_Y_min = 12;
00233 
00234     gameSpeed = 1;
00235 }
00236 void SnakeEngine::runGameEngine(){
00237     switch(state){
00238         case SETUP : setupGame(); break;
00239         case PAUSE: gameIsPaused(); break;
00240         case INGAME: playGame(); break;
00241         case NEWLIFE: setupGame(); break;
00242         case GAMEOVER:  gameIsLost(); 
00243                         welcome();
00244                         break;
00245     }
00246 }
00247 
00248 void SnakeEngine::welcome(){
00249     lcd.printString(" Great Snakes ",0,1);  
00250     lcd.printString("  Press Start ",0,4);
00251     lcd.refresh();
00252      
00253     // wait flashing LEDs until start button is pressed 
00254     while ( gamePad.start_pressed() == false) {
00255         lcd.setContrast( gamePad.read_pot1());
00256         gamePad.leds_on();
00257         wait(0.1);
00258         gamePad.leds_off();
00259         wait(0.1);
00260     }
00261     lcd.clear();
00262     char buffer1[14];
00263     sprintf(buffer1,"Speed: %2d",gameSpeed);
00264     lcd.printString(buffer1,5,1);
00265     lcd.printString("  Press Start ",0,5);
00266     lcd.refresh();
00267     
00268     //set snake speed menu 
00269     while ( gamePad.start_pressed() == false) {
00270         
00271         if(gamePad.B_pressed()){
00272             if(gameSpeed<4)
00273                 gameSpeed++;
00274             lcd.clear();
00275             char buffer1[14];
00276             sprintf(buffer1,"Speed: %2d",gameSpeed);
00277             lcd.printString(buffer1,5,1);
00278             lcd.printString("  Press Start ",0,5);
00279             lcd.refresh();
00280         }
00281         if(gamePad.X_pressed()){
00282             if(gameSpeed !=1)
00283                 gameSpeed--;
00284             lcd.clear();
00285             char buffer1[14];
00286             sprintf(buffer1,"Speed: %2d",gameSpeed);
00287             lcd.printString(buffer1,5,1);
00288             lcd.printString("  Press Start ",0,5);
00289             lcd.refresh();
00290         }
00291         wait(0.1);
00292     }
00293 }
00294 int SnakeEngine::getGameSpeed(){
00295     return gameSpeed;
00296 }