Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 }
Generated on Wed Jul 13 2022 01:33:24 by
1.7.2