Jordan Sanchez / Mbed 2 deprecated Tetris

Dependencies:   4DGL-uLCD-SE 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);    // 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 }