This is a remake of tetris game for mbed. Please see detail here http://developer.mbed.org/users/sucrelv/notebook/tetris-game-on-mbed
Dependencies: 4DGL-uLCD-SE PinDetect SDFileSystem mbed-rtos mbed wave_player
main.cpp
00001 #include "mbed.h" 00002 #include "Game.h" 00003 #include "PinDetect.h" 00004 #include "Speaker.h" 00005 #include "TextLCD.h" 00006 #include "Shiftbrite.h" 00007 #include "SDFileSystem.h" 00008 #include "wave_player.h" 00009 #include "rtos.h" 00010 00011 uLCD_4DGL uLCD(p28, p27, p29); 00012 TextLCD textLCD(p26, p25, p24, p23, p22, p15); 00013 Speaker mySpeaker(p21); 00014 Shiftbrite myShiftbrite(p9, p10, p11, p12, p13); 00015 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card 00016 Serial pc(USBTX, USBRX); 00017 00018 PinDetect LEFT_KEY(p16); 00019 PinDetect RIGHT_KEY(p19); 00020 PinDetect ROTATE_KEY(p17); 00021 PinDetect DOWN_KEY(p30); 00022 00023 int SinglePiecePoints = 50; 00024 int LineClearPoints = 200; 00025 int key_input = 0; 00026 bool gameStarted = false; 00027 void input_left() 00028 { 00029 if(!gameStarted) 00030 { gameStarted=true; 00031 return; 00032 } 00033 key_input = 1; 00034 mySpeaker.PlayNote(400.0,0.05,0.025); 00035 mySpeaker.PlayNote(500.0,0.05,0.025); 00036 } 00037 00038 void input_right() 00039 { 00040 if(!gameStarted) 00041 { gameStarted=true; 00042 return; 00043 } 00044 key_input = 2; 00045 mySpeaker.PlayNote(400.0,0.05,0.025); 00046 mySpeaker.PlayNote(500.0,0.05,0.025); 00047 } 00048 00049 void input_rotate() 00050 { 00051 if(!gameStarted) 00052 { gameStarted=true; 00053 return; 00054 } 00055 key_input = 3; 00056 mySpeaker.PlayNote(600.0,0.05,0.025); 00057 mySpeaker.PlayNote(700.0,0.05,0.025); 00058 mySpeaker.PlayNote(800.0,0.05,0.025); 00059 mySpeaker.PlayNote(900.0,0.05,0.025); 00060 } 00061 00062 void input_down() 00063 { 00064 if(!gameStarted) 00065 { gameStarted=true; 00066 return; 00067 } 00068 key_input=4; 00069 mySpeaker.PlayNote(500.0,0.05,0.025); 00070 mySpeaker.PlayNote(1500.0,0.05,0.025); 00071 mySpeaker.PlayNote(500.0,0.05,0.025); 00072 mySpeaker.PlayNote(1500.0,0.05,0.025); 00073 } 00074 00075 void clear_board() 00076 { 00077 uLCD.filled_rectangle(20,0,79,128,0); 00078 } 00079 00080 void clear_next_piece() 00081 { 00082 uLCD.filled_rectangle(92,20,122,50,0); 00083 } 00084 00085 void UpdateGameStatus(int points,int lines) 00086 { 00087 textLCD.locate(7,0); 00088 textLCD.printf("%d",points); 00089 textLCD.locate(13,1); 00090 textLCD.printf("%d",lines); 00091 } 00092 00093 void FlashLight(void const *args) 00094 { 00095 myShiftbrite.RGB(0,0,0); 00096 myShiftbrite.RGB(0,0,0); 00097 00098 myShiftbrite.RGB(0,0,42); 00099 myShiftbrite.RGB(0,0,42); 00100 Thread::wait(100); 00101 00102 00103 myShiftbrite.RGB(0,0,0); 00104 myShiftbrite.RGB(0,42,0); 00105 Thread::wait(100); 00106 00107 myShiftbrite.RGB(0,0,42); 00108 myShiftbrite.RGB(0,0,42); 00109 Thread::wait(100); 00110 00111 myShiftbrite.RGB(0,0,0); 00112 myShiftbrite.RGB(0,0,0); 00113 } 00114 00115 void GameOverLight(void const *args) 00116 { 00117 00118 myShiftbrite.RGB(0,0,0); 00119 myShiftbrite.RGB(0,0,0); 00120 00121 myShiftbrite.RGB(0,0,200); 00122 Thread::wait(100); 00123 myShiftbrite.RGB(0,0,0); 00124 Thread::wait(100); 00125 myShiftbrite.RGB(0,0,200); 00126 Thread::wait(100); 00127 myShiftbrite.RGB(0,0,0); 00128 Thread::wait(100); 00129 myShiftbrite.RGB(0,0,200); 00130 Thread::wait(100); 00131 myShiftbrite.RGB(0,0,0); 00132 Thread::wait(100); 00133 myShiftbrite.RGB(0,0,200); 00134 Thread::wait(100); 00135 myShiftbrite.RGB(0,0,0); 00136 Thread::wait(100); 00137 myShiftbrite.RGB(0,0,200); 00138 Thread::wait(100); 00139 myShiftbrite.RGB(0,0,0); 00140 Thread::wait(100); 00141 myShiftbrite.RGB(0,0,200); 00142 Thread::wait(100); 00143 myShiftbrite.RGB(0,0,0); 00144 Thread::wait(100); 00145 myShiftbrite.RGB(0,0,200); 00146 Thread::wait(100); 00147 myShiftbrite.RGB(0,0,0); 00148 Thread::wait(100); 00149 myShiftbrite.RGB(0,0,200); 00150 Thread::wait(100); 00151 myShiftbrite.RGB(0,0,0); 00152 Thread::wait(100); 00153 myShiftbrite.RGB(0,0,200); 00154 Thread::wait(100); 00155 myShiftbrite.RGB(0,0,0); 00156 Thread::wait(100); 00157 myShiftbrite.RGB(0,0,200); 00158 Thread::wait(100); 00159 myShiftbrite.RGB(0,0,0); 00160 } 00161 00162 void GameStartLight(void const *args) 00163 { 00164 00165 myShiftbrite.RGB(0,0,0); 00166 myShiftbrite.RGB(0,0,0); 00167 00168 myShiftbrite.RGB(0,200,0); 00169 Thread::wait(100); 00170 myShiftbrite.RGB(0,0,0); 00171 myShiftbrite.RGB(0,0,0); 00172 Thread::wait(100); 00173 myShiftbrite.RGB(0,200,0); 00174 Thread::wait(100); 00175 myShiftbrite.RGB(0,0,0); 00176 myShiftbrite.RGB(0,0,0); 00177 Thread::wait(100); 00178 myShiftbrite.RGB(0,200,0); 00179 Thread::wait(100); 00180 myShiftbrite.RGB(0,0,0); 00181 myShiftbrite.RGB(0,0,0); 00182 Thread::wait(100); 00183 myShiftbrite.RGB(0,200,0); 00184 Thread::wait(100); 00185 myShiftbrite.RGB(0,0,0); 00186 myShiftbrite.RGB(0,0,0); 00187 Thread::wait(100); 00188 myShiftbrite.RGB(0,200,0); 00189 Thread::wait(100); 00190 myShiftbrite.RGB(0,0,0); 00191 myShiftbrite.RGB(0,0,0); 00192 00193 } 00194 00195 void PlayStartSound() 00196 { 00197 mySpeaker.PlayNote(500.0,0.05,0.025); 00198 mySpeaker.PlayNote(600.0,0.05,0.025); 00199 mySpeaker.PlayNote(700.0,0.05,0.025); 00200 mySpeaker.PlayNote(800.0,0.05,0.025); 00201 mySpeaker.PlayNote(900.0,0.05,0.025); 00202 mySpeaker.PlayNote(1000.0,0.05,0.025); 00203 mySpeaker.PlayNote(1100.0,0.05,0.025); 00204 mySpeaker.PlayNote(1200.0,0.05,0.025); 00205 mySpeaker.PlayNote(600.0,0.05,0.025); 00206 mySpeaker.PlayNote(700.0,0.05,0.025); 00207 mySpeaker.PlayNote(800.0,0.05,0.025); 00208 mySpeaker.PlayNote(900.0,0.05,0.025); 00209 mySpeaker.PlayNote(1000.0,0.05,0.025); 00210 mySpeaker.PlayNote(1100.0,0.05,0.025); 00211 mySpeaker.PlayNote(1200.0,0.05,0.025); 00212 mySpeaker.PlayNote(1300.0,0.05,0.025); 00213 mySpeaker.PlayNote(700.0,0.05,0.025); 00214 mySpeaker.PlayNote(800.0,0.05,0.025); 00215 mySpeaker.PlayNote(900.0,0.05,0.025); 00216 mySpeaker.PlayNote(1000.0,0.05,0.025); 00217 mySpeaker.PlayNote(1100.0,0.05,0.025); 00218 mySpeaker.PlayNote(1200.0,0.05,0.025); 00219 mySpeaker.PlayNote(1300.0,0.05,0.025); 00220 mySpeaker.PlayNote(1400.0,0.05,0.025); 00221 } 00222 00223 void PlayOverSound() 00224 { 00225 mySpeaker.PlayNote(1400.0,0.05,0.025); 00226 mySpeaker.PlayNote(1300.0,0.05,0.025); 00227 mySpeaker.PlayNote(1200.0,0.05,0.025); 00228 mySpeaker.PlayNote(1100.0,0.05,0.025); 00229 mySpeaker.PlayNote(1000.0,0.05,0.025); 00230 mySpeaker.PlayNote(900.0,0.05,0.025); 00231 mySpeaker.PlayNote(800.0,0.05,0.025); 00232 mySpeaker.PlayNote(700.0,0.05,0.025); 00233 mySpeaker.PlayNote(1300.0,0.05,0.025); 00234 mySpeaker.PlayNote(1200.0,0.05,0.025); 00235 mySpeaker.PlayNote(1100.0,0.05,0.025); 00236 mySpeaker.PlayNote(1000.0,0.05,0.025); 00237 mySpeaker.PlayNote(900.0,0.05,0.025); 00238 mySpeaker.PlayNote(800.0,0.05,0.025); 00239 mySpeaker.PlayNote(700.0,0.05,0.025); 00240 mySpeaker.PlayNote(600.0,0.05,0.025); 00241 mySpeaker.PlayNote(1200.0,0.05,0.025); 00242 mySpeaker.PlayNote(1100.0,0.05,0.025); 00243 mySpeaker.PlayNote(1000.0,0.05,0.025); 00244 mySpeaker.PlayNote(900.0,0.05,0.025); 00245 mySpeaker.PlayNote(800.0,0.05,0.025); 00246 mySpeaker.PlayNote(700.0,0.05,0.025); 00247 mySpeaker.PlayNote(600.0,0.05,0.025); 00248 mySpeaker.PlayNote(500.0,0.05,0.025); 00249 } 00250 00251 void PlayClearSound() 00252 { 00253 mySpeaker.PlayNote(900.0,0.2,0.025); 00254 mySpeaker.PlayNote(1000.0,0.2,0.025); 00255 mySpeaker.PlayNote(1100.0,0.2,0.025); 00256 mySpeaker.PlayNote(1000.0,0.2,0.025); 00257 mySpeaker.PlayNote(9000.0,0.2,0.025); 00258 } 00259 00260 int RandomGen(char range) 00261 { 00262 pc.printf("%c",range); 00263 while(!pc.readable()) wait(0.5); 00264 char buffer[4]; 00265 pc.gets(buffer,4); 00266 int i = buffer[0]-'0'; 00267 return i; 00268 } 00269 00270 int main() 00271 { 00272 //hardware setup 00273 LEFT_KEY.mode(PullUp); 00274 RIGHT_KEY.mode(PullUp); 00275 ROTATE_KEY.mode(PullUp); 00276 DOWN_KEY.mode(PullUp); 00277 00278 LEFT_KEY.attach_deasserted(&input_left); 00279 RIGHT_KEY.attach_deasserted(&input_right); 00280 ROTATE_KEY.attach_deasserted(&input_rotate); 00281 DOWN_KEY.attach_deasserted(&input_down); 00282 00283 LEFT_KEY.setSampleFrequency(); 00284 RIGHT_KEY.setSampleFrequency(); 00285 ROTATE_KEY.setSampleFrequency(); 00286 DOWN_KEY.setSampleFrequency(); 00287 uLCD.baudrate(3000000); 00288 00289 myShiftbrite.RGB(0,0,0); 00290 myShiftbrite.RGB(0,0,0); 00291 00292 sd.disk_initialize(); 00293 uLCD.media_init(); 00294 uLCD.set_sector_address(0x001D, 0x7801); 00295 uLCD.display_image(0,0); 00296 00297 textLCD.cls(); 00298 textLCD.locate(0,0); 00299 textLCD.printf("Waiting for PC..."); 00300 pc.baud(9600); 00301 pc.format(8,SerialBase::None,1); 00302 pc.printf("0"); 00303 while(!pc.readable()) wait(0.5); 00304 char buffer[4]; 00305 pc.gets(buffer,4); 00306 00307 //wait for game start 00308 textLCD.cls(); 00309 textLCD.locate(0,0); 00310 textLCD.printf("TETRIS READY!!"); 00311 textLCD.locate(0,1); 00312 textLCD.printf("PRESS ANY KEY..."); 00313 while(!gameStarted) wait(0.5); 00314 PlayStartSound(); 00315 textLCD.cls(); 00316 textLCD.printf("Starting game now..."); 00317 wait(2); 00318 textLCD.cls(); 00319 textLCD.locate(0,0); 00320 textLCD.printf("Points"); 00321 textLCD.locate(0,1); 00322 textLCD.printf("Cleared Line"); 00323 Thread t1(GameStartLight); 00324 //game classes init 00325 bool isGameOver = false; 00326 int mScreenHeight = 128; 00327 Pieces mPieces; 00328 Board mBoard (&mPieces, mScreenHeight); 00329 int a = RandomGen('a'); 00330 int b = RandomGen('b'); 00331 int c = RandomGen('a'); 00332 int d = RandomGen('b'); 00333 Game mGame (&mBoard, &mPieces, mScreenHeight, &uLCD,a,b,c,d); 00334 00335 00336 // ----- Main Loop ----- 00337 int prevX=0; 00338 int prevY=0; 00339 int prevPiece=-1; 00340 int prevRot=0; 00341 Timer timer; 00342 timer.start(); 00343 key_input=0; 00344 bool needErase = false; 00345 uLCD.cls(); 00346 while (1) 00347 { 00348 if(isGameOver) 00349 { 00350 wait(1); 00351 continue; 00352 } 00353 // ----- Draw ---- 00354 if(needErase) 00355 { 00356 mGame.ErasePiece(prevX,prevY,prevPiece,prevRot); 00357 needErase=false; 00358 } 00359 mGame.DrawScene(); 00360 00361 prevX=mGame.mPosX; 00362 prevY=mGame.mPosY; 00363 prevPiece=mGame.mPiece; 00364 prevRot=mGame.mRotation; 00365 00366 // ----- Input ----- 00367 switch (key_input) 00368 { 00369 case (2): //right 00370 { 00371 if (mBoard.IsPossibleMovement (mGame.mPosX + 1, mGame.mPosY, mGame.mPiece, mGame.mRotation)) 00372 {mGame.mPosX++;needErase=true;} 00373 break; 00374 } 00375 00376 case (1): //left 00377 { 00378 if (mBoard.IsPossibleMovement (mGame.mPosX - 1, mGame.mPosY, mGame.mPiece, mGame.mRotation)) 00379 {mGame.mPosX--;needErase=true;} 00380 break; 00381 } 00382 00383 case (4)://down 00384 { 00385 // Check collision from up to down 00386 while (mBoard.IsPossibleMovement(mGame.mPosX, mGame.mPosY, mGame.mPiece, mGame.mRotation)) { mGame.mPosY++; } 00387 needErase=true; 00388 mBoard.StorePiece (mGame.mPosX, mGame.mPosY - 1, mGame.mPiece, mGame.mRotation); 00389 mGame.AddPoints(SinglePiecePoints); 00390 int linesDeleted = mBoard.DeletePossibleLines (); 00391 if(linesDeleted>0) 00392 { 00393 mGame.AddClearedLines(linesDeleted); 00394 mGame.AddPoints(LineClearPoints*linesDeleted); 00395 Thread t1(FlashLight); 00396 PlayClearSound(); 00397 clear_board(); 00398 } 00399 UpdateGameStatus(mGame.GetPoints(),mGame.GetClearedLines()); 00400 00401 if (mBoard.IsGameOver()) 00402 { 00403 isGameOver=true; 00404 uLCD.cls(); 00405 uLCD.media_init(); 00406 uLCD.set_sector_address(0x001D, 0x7842); 00407 uLCD.display_image(0,0); 00408 Thread t2(GameOverLight); 00409 PlayOverSound(); 00410 00411 } 00412 00413 if(!isGameOver) 00414 { 00415 mGame.CreateNewPiece(RandomGen('a'),RandomGen('b')); 00416 clear_next_piece(); 00417 } 00418 break; 00419 } 00420 00421 case (3)://rotate 00422 { 00423 if (mBoard.IsPossibleMovement (mGame.mPosX, mGame.mPosY, mGame.mPiece, (mGame.mRotation + 1) % 4)) 00424 {mGame.mRotation = (mGame.mRotation + 1) % 4;needErase=true;} 00425 break; 00426 } 00427 00428 case (0):{break;} 00429 } 00430 key_input = 0; 00431 00432 // ----- Vertical movement ----- 00433 00434 if(timer.read_ms()>WAIT_TIME) 00435 { 00436 needErase=true; 00437 if(!isGameOver) 00438 { 00439 if (mBoard.IsPossibleMovement (mGame.mPosX, mGame.mPosY + 1, mGame.mPiece, mGame.mRotation)) 00440 { 00441 mGame.mPosY++; 00442 } 00443 else 00444 { 00445 mBoard.StorePiece (mGame.mPosX, mGame.mPosY, mGame.mPiece, mGame.mRotation); 00446 mGame.AddPoints(SinglePiecePoints); 00447 int linesDeleted = mBoard.DeletePossibleLines (); 00448 if(linesDeleted>0) 00449 { 00450 mGame.AddClearedLines(linesDeleted); 00451 mGame.AddPoints(LineClearPoints*linesDeleted); 00452 Thread t1(FlashLight); 00453 PlayClearSound(); 00454 clear_board(); 00455 } 00456 UpdateGameStatus(mGame.GetPoints(),mGame.GetClearedLines()); 00457 00458 if (mBoard.IsGameOver()) 00459 { 00460 isGameOver=true; 00461 uLCD.cls(); 00462 uLCD.media_init(); 00463 uLCD.set_sector_address(0x001D, 0x7842); 00464 uLCD.display_image(0,0); 00465 Thread t2(GameOverLight); 00466 PlayOverSound(); 00467 } 00468 00469 if(!isGameOver) 00470 { 00471 mGame.CreateNewPiece(RandomGen('a'),RandomGen('b')); 00472 clear_next_piece(); 00473 } 00474 } 00475 } 00476 timer.reset(); 00477 } 00478 wait(0.1); 00479 } 00480 }
Generated on Thu Jul 14 2022 13:36:47 by 1.7.2