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.
Dependencies: 4DGL-uLCD-SE 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); // need to use NavSwitch for this 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() // FIX 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 /* 00086 void UpdateGameStatus(int points,int lines) 00087 { 00088 textLCD.locate(7,0); 00089 textLCD.printf("%d",points); 00090 textLCD.locate(13,1); 00091 textLCD.printf("%d",lines); 00092 }*/ 00093 00094 /* ShiftBright Code 00095 void FlashLight(void const *args) 00096 { 00097 myShiftbrite.RGB(0,0,0); 00098 myShiftbrite.RGB(0,0,0); 00099 00100 myShiftbrite.RGB(0,0,42); 00101 myShiftbrite.RGB(0,0,42); 00102 Thread::wait(100); 00103 00104 00105 myShiftbrite.RGB(0,0,0); 00106 myShiftbrite.RGB(0,42,0); 00107 Thread::wait(100); 00108 00109 myShiftbrite.RGB(0,0,42); 00110 myShiftbrite.RGB(0,0,42); 00111 Thread::wait(100); 00112 00113 myShiftbrite.RGB(0,0,0); 00114 myShiftbrite.RGB(0,0,0); 00115 } 00116 00117 void GameOverLight(void const *args) 00118 { 00119 00120 myShiftbrite.RGB(0,0,0); 00121 myShiftbrite.RGB(0,0,0); 00122 00123 myShiftbrite.RGB(0,0,200); 00124 Thread::wait(100); 00125 myShiftbrite.RGB(0,0,0); 00126 Thread::wait(100); 00127 myShiftbrite.RGB(0,0,200); 00128 Thread::wait(100); 00129 myShiftbrite.RGB(0,0,0); 00130 Thread::wait(100); 00131 myShiftbrite.RGB(0,0,200); 00132 Thread::wait(100); 00133 myShiftbrite.RGB(0,0,0); 00134 Thread::wait(100); 00135 myShiftbrite.RGB(0,0,200); 00136 Thread::wait(100); 00137 myShiftbrite.RGB(0,0,0); 00138 Thread::wait(100); 00139 myShiftbrite.RGB(0,0,200); 00140 Thread::wait(100); 00141 myShiftbrite.RGB(0,0,0); 00142 Thread::wait(100); 00143 myShiftbrite.RGB(0,0,200); 00144 Thread::wait(100); 00145 myShiftbrite.RGB(0,0,0); 00146 Thread::wait(100); 00147 myShiftbrite.RGB(0,0,200); 00148 Thread::wait(100); 00149 myShiftbrite.RGB(0,0,0); 00150 Thread::wait(100); 00151 myShiftbrite.RGB(0,0,200); 00152 Thread::wait(100); 00153 myShiftbrite.RGB(0,0,0); 00154 Thread::wait(100); 00155 myShiftbrite.RGB(0,0,200); 00156 Thread::wait(100); 00157 myShiftbrite.RGB(0,0,0); 00158 Thread::wait(100); 00159 myShiftbrite.RGB(0,0,200); 00160 Thread::wait(100); 00161 myShiftbrite.RGB(0,0,0); 00162 } 00163 00164 void GameStartLight(void const *args) 00165 { 00166 00167 myShiftbrite.RGB(0,0,0); 00168 myShiftbrite.RGB(0,0,0); 00169 00170 myShiftbrite.RGB(0,200,0); 00171 Thread::wait(100); 00172 myShiftbrite.RGB(0,0,0); 00173 myShiftbrite.RGB(0,0,0); 00174 Thread::wait(100); 00175 myShiftbrite.RGB(0,200,0); 00176 Thread::wait(100); 00177 myShiftbrite.RGB(0,0,0); 00178 myShiftbrite.RGB(0,0,0); 00179 Thread::wait(100); 00180 myShiftbrite.RGB(0,200,0); 00181 Thread::wait(100); 00182 myShiftbrite.RGB(0,0,0); 00183 myShiftbrite.RGB(0,0,0); 00184 Thread::wait(100); 00185 myShiftbrite.RGB(0,200,0); 00186 Thread::wait(100); 00187 myShiftbrite.RGB(0,0,0); 00188 myShiftbrite.RGB(0,0,0); 00189 Thread::wait(100); 00190 myShiftbrite.RGB(0,200,0); 00191 Thread::wait(100); 00192 myShiftbrite.RGB(0,0,0); 00193 myShiftbrite.RGB(0,0,0); 00194 00195 } */ 00196 00197 /* Speaker Code 00198 void PlayStartSound() 00199 { 00200 mySpeaker.PlayNote(500.0,0.05,0.025); 00201 mySpeaker.PlayNote(600.0,0.05,0.025); 00202 mySpeaker.PlayNote(700.0,0.05,0.025); 00203 mySpeaker.PlayNote(800.0,0.05,0.025); 00204 mySpeaker.PlayNote(900.0,0.05,0.025); 00205 mySpeaker.PlayNote(1000.0,0.05,0.025); 00206 mySpeaker.PlayNote(1100.0,0.05,0.025); 00207 mySpeaker.PlayNote(1200.0,0.05,0.025); 00208 mySpeaker.PlayNote(600.0,0.05,0.025); 00209 mySpeaker.PlayNote(700.0,0.05,0.025); 00210 mySpeaker.PlayNote(800.0,0.05,0.025); 00211 mySpeaker.PlayNote(900.0,0.05,0.025); 00212 mySpeaker.PlayNote(1000.0,0.05,0.025); 00213 mySpeaker.PlayNote(1100.0,0.05,0.025); 00214 mySpeaker.PlayNote(1200.0,0.05,0.025); 00215 mySpeaker.PlayNote(1300.0,0.05,0.025); 00216 mySpeaker.PlayNote(700.0,0.05,0.025); 00217 mySpeaker.PlayNote(800.0,0.05,0.025); 00218 mySpeaker.PlayNote(900.0,0.05,0.025); 00219 mySpeaker.PlayNote(1000.0,0.05,0.025); 00220 mySpeaker.PlayNote(1100.0,0.05,0.025); 00221 mySpeaker.PlayNote(1200.0,0.05,0.025); 00222 mySpeaker.PlayNote(1300.0,0.05,0.025); 00223 mySpeaker.PlayNote(1400.0,0.05,0.025); 00224 } 00225 00226 void PlayOverSound() 00227 { 00228 mySpeaker.PlayNote(1400.0,0.05,0.025); 00229 mySpeaker.PlayNote(1300.0,0.05,0.025); 00230 mySpeaker.PlayNote(1200.0,0.05,0.025); 00231 mySpeaker.PlayNote(1100.0,0.05,0.025); 00232 mySpeaker.PlayNote(1000.0,0.05,0.025); 00233 mySpeaker.PlayNote(900.0,0.05,0.025); 00234 mySpeaker.PlayNote(800.0,0.05,0.025); 00235 mySpeaker.PlayNote(700.0,0.05,0.025); 00236 mySpeaker.PlayNote(1300.0,0.05,0.025); 00237 mySpeaker.PlayNote(1200.0,0.05,0.025); 00238 mySpeaker.PlayNote(1100.0,0.05,0.025); 00239 mySpeaker.PlayNote(1000.0,0.05,0.025); 00240 mySpeaker.PlayNote(900.0,0.05,0.025); 00241 mySpeaker.PlayNote(800.0,0.05,0.025); 00242 mySpeaker.PlayNote(700.0,0.05,0.025); 00243 mySpeaker.PlayNote(600.0,0.05,0.025); 00244 mySpeaker.PlayNote(1200.0,0.05,0.025); 00245 mySpeaker.PlayNote(1100.0,0.05,0.025); 00246 mySpeaker.PlayNote(1000.0,0.05,0.025); 00247 mySpeaker.PlayNote(900.0,0.05,0.025); 00248 mySpeaker.PlayNote(800.0,0.05,0.025); 00249 mySpeaker.PlayNote(700.0,0.05,0.025); 00250 mySpeaker.PlayNote(600.0,0.05,0.025); 00251 mySpeaker.PlayNote(500.0,0.05,0.025); 00252 } 00253 00254 void PlayClearSound() 00255 { 00256 mySpeaker.PlayNote(900.0,0.2,0.025); 00257 mySpeaker.PlayNote(1000.0,0.2,0.025); 00258 mySpeaker.PlayNote(1100.0,0.2,0.025); 00259 mySpeaker.PlayNote(1000.0,0.2,0.025); 00260 mySpeaker.PlayNote(9000.0,0.2,0.025); 00261 } */ 00262 00263 int RandomGen(char range) 00264 { 00265 pc.printf("%c",range); 00266 while(!pc.readable()) wait(0.5); 00267 char buffer[4]; 00268 pc.gets(buffer,4); 00269 int i = buffer[0]-'0'; 00270 return i; 00271 } 00272 00273 int main() 00274 { 00275 //hardware setup // FIX 00276 LEFT_KEY.mode(PullUp); 00277 RIGHT_KEY.mode(PullUp); 00278 ROTATE_KEY.mode(PullUp); 00279 DOWN_KEY.mode(PullUp); 00280 00281 LEFT_KEY.attach_deasserted(&input_left); 00282 RIGHT_KEY.attach_deasserted(&input_right); 00283 ROTATE_KEY.attach_deasserted(&input_rotate); 00284 DOWN_KEY.attach_deasserted(&input_down); 00285 00286 LEFT_KEY.setSampleFrequency(); 00287 RIGHT_KEY.setSampleFrequency(); 00288 ROTATE_KEY.setSampleFrequency(); 00289 DOWN_KEY.setSampleFrequency(); // FIX 00290 uLCD.baudrate(3000000); 00291 00292 //myShiftbrite.RGB(0,0,0); 00293 //myShiftbrite.RGB(0,0,0); 00294 00295 /* SD card used for Startup Image 00296 sd.disk_initialize(); // ? might need to delete 00297 uLCD.media_init(); 00298 uLCD.set_sector_address(0x001D, 0x7801); 00299 uLCD.display_image(0,0);*/ 00300 00301 /*textLCD.cls(); 00302 textLCD.locate(0,0); 00303 textLCD.printf("Waiting for PC...");*/ 00304 00305 pc.baud(9600); 00306 pc.format(8,SerialBase::None,1); 00307 pc.printf("0"); 00308 while(!pc.readable()) wait(0.5); 00309 char buffer[4]; 00310 pc.gets(buffer,4); 00311 /* 00312 //wait for game start 00313 textLCD.cls(); 00314 textLCD.locate(0,0); 00315 textLCD.printf("TETRIS READY!!"); 00316 textLCD.locate(0,1); 00317 textLCD.printf("PRESS ANY KEY..."); 00318 while(!gameStarted) wait(0.5); 00319 PlayStartSound(); 00320 textLCD.cls(); 00321 textLCD.printf("Starting game now..."); 00322 wait(2); 00323 textLCD.cls(); 00324 textLCD.locate(0,0); 00325 textLCD.printf("Points"); 00326 textLCD.locate(0,1); 00327 textLCD.printf("Cleared Line");*/ 00328 00329 //Thread t1(GameStartLight); 00330 //game classes init 00331 bool isGameOver = false; 00332 int mScreenHeight = 128; 00333 Pieces mPieces; 00334 Board mBoard (&mPieces, mScreenHeight); 00335 int a = RandomGen('a'); 00336 int b = RandomGen('b'); 00337 int c = RandomGen('a'); 00338 int d = RandomGen('b'); 00339 Game mGame (&mBoard, &mPieces, mScreenHeight, &uLCD,a,b,c,d); 00340 00341 00342 // ----- Main Loop ----- 00343 int prevX=0; 00344 int prevY=0; 00345 int prevPiece=-1; 00346 int prevRot=0; 00347 Timer timer; 00348 timer.start(); 00349 key_input=0; 00350 bool needErase = false; 00351 uLCD.cls(); 00352 while (1) 00353 { 00354 if(isGameOver) 00355 { 00356 wait(1); 00357 continue; 00358 } 00359 // ----- Draw ---- 00360 if(needErase) 00361 { 00362 mGame.ErasePiece(prevX,prevY,prevPiece,prevRot); 00363 needErase=false; 00364 } 00365 mGame.DrawScene(); 00366 00367 prevX=mGame.mPosX; 00368 prevY=mGame.mPosY; 00369 prevPiece=mGame.mPiece; 00370 prevRot=mGame.mRotation; 00371 00372 // ----- Input ----- 00373 switch (key_input) 00374 { 00375 case (2): //right 00376 { 00377 if (mBoard.IsPossibleMovement (mGame.mPosX + 1, mGame.mPosY, mGame.mPiece, mGame.mRotation)) 00378 {mGame.mPosX++;needErase=true;} 00379 break; 00380 } 00381 00382 case (1): //left 00383 { 00384 if (mBoard.IsPossibleMovement (mGame.mPosX - 1, mGame.mPosY, mGame.mPiece, mGame.mRotation)) 00385 {mGame.mPosX--;needErase=true;} 00386 break; 00387 } 00388 00389 case (4)://down 00390 { 00391 // Check collision from up to down 00392 while (mBoard.IsPossibleMovement(mGame.mPosX, mGame.mPosY, mGame.mPiece, mGame.mRotation)) { mGame.mPosY++; } 00393 needErase=true; 00394 mBoard.StorePiece (mGame.mPosX, mGame.mPosY - 1, mGame.mPiece, mGame.mRotation); 00395 mGame.AddPoints(SinglePiecePoints); 00396 int linesDeleted = mBoard.DeletePossibleLines (); 00397 if(linesDeleted>0) 00398 { 00399 mGame.AddClearedLines(linesDeleted); 00400 mGame.AddPoints(LineClearPoints*linesDeleted); 00401 //Thread t1(FlashLight); 00402 //PlayClearSound(); 00403 clear_board(); 00404 } 00405 UpdateGameStatus(mGame.GetPoints(),mGame.GetClearedLines()); 00406 00407 if (mBoard.IsGameOver()) 00408 { 00409 isGameOver=true; 00410 uLCD.cls(); 00411 00412 // FIX add Game Over mechanic 00413 00414 //uLCD.media_init(); 00415 //uLCD.set_sector_address(0x001D, 0x7842); 00416 //uLCD.display_image(0,0); 00417 //Thread t2(GameOverLight); 00418 //PlayOverSound(); 00419 00420 } 00421 00422 if(!isGameOver) 00423 { 00424 mGame.CreateNewPiece(RandomGen('a'),RandomGen('b')); 00425 clear_next_piece(); 00426 } 00427 break; 00428 } 00429 00430 case (3)://rotate 00431 { 00432 if (mBoard.IsPossibleMovement (mGame.mPosX, mGame.mPosY, mGame.mPiece, (mGame.mRotation + 1) % 4)) 00433 {mGame.mRotation = (mGame.mRotation + 1) % 4;needErase=true;} 00434 break; 00435 } 00436 00437 case (0):{break;} 00438 } 00439 key_input = 0; 00440 00441 // ----- Vertical movement ----- 00442 00443 if(timer.read_ms()>WAIT_TIME) 00444 { 00445 needErase=true; 00446 if(!isGameOver) 00447 { 00448 if (mBoard.IsPossibleMovement (mGame.mPosX, mGame.mPosY + 1, mGame.mPiece, mGame.mRotation)) 00449 { 00450 mGame.mPosY++; 00451 } 00452 else 00453 { 00454 mBoard.StorePiece (mGame.mPosX, mGame.mPosY, mGame.mPiece, mGame.mRotation); 00455 mGame.AddPoints(SinglePiecePoints); 00456 int linesDeleted = mBoard.DeletePossibleLines (); 00457 if(linesDeleted>0) 00458 { 00459 mGame.AddClearedLines(linesDeleted); 00460 mGame.AddPoints(LineClearPoints*linesDeleted); 00461 //Thread t1(FlashLight); 00462 //PlayClearSound(); 00463 clear_board(); 00464 } 00465 UpdateGameStatus(mGame.GetPoints(),mGame.GetClearedLines()); 00466 00467 if (mBoard.IsGameOver()) 00468 { 00469 isGameOver=true; 00470 uLCD.cls(); 00471 00472 // FIX add Game Over mechanic 00473 00474 //uLCD.media_init(); 00475 //uLCD.set_sector_address(0x001D, 0x7842); 00476 //uLCD.display_image(0,0); 00477 //Thread t2(GameOverLight); 00478 //PlayOverSound(); 00479 } 00480 00481 if(!isGameOver) 00482 { 00483 mGame.CreateNewPiece(RandomGen('a'),RandomGen('b')); 00484 clear_next_piece(); 00485 } 00486 } 00487 } 00488 timer.reset(); 00489 } 00490 wait(0.1); 00491 } 00492 }
Generated on Wed Nov 30 2022 21:59:24 by
1.7.2