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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }