Jay Balar / Mbed 2 deprecated 4180_Project_3

Dependencies:   4DGL-uLCD-SE Physac-MBED PinDetect SDFileSystem mbed-rtos mbed

Committer:
jsanchez307
Date:
Tue Dec 06 22:48:35 2022 +0000
Revision:
22:601e6f9077e4
Added working Tetris Game

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jsanchez307 22:601e6f9077e4 1 #include "mbed.h"
jsanchez307 22:601e6f9077e4 2 #include "uLCD_4DGL.h"
jsanchez307 22:601e6f9077e4 3 #include "Game.h"
jsanchez307 22:601e6f9077e4 4 #include "Nav_Switch.h"
jsanchez307 22:601e6f9077e4 5
jsanchez307 22:601e6f9077e4 6 uLCD_4DGL uLCD(p13, p14, p30);
jsanchez307 22:601e6f9077e4 7 Nav_Switch myNav(p19, p16, p17, p15, p18); // pins(up, down, left, right, fire)
jsanchez307 22:601e6f9077e4 8
jsanchez307 22:601e6f9077e4 9 int SinglePiecePoints = 50;
jsanchez307 22:601e6f9077e4 10 int LineClearPoints = 200;
jsanchez307 22:601e6f9077e4 11 int key_input = 0;
jsanchez307 22:601e6f9077e4 12 bool gameStarted = false;
jsanchez307 22:601e6f9077e4 13 void input_left() // FIX
jsanchez307 22:601e6f9077e4 14 {
jsanchez307 22:601e6f9077e4 15 if(!gameStarted)
jsanchez307 22:601e6f9077e4 16 { gameStarted=true;
jsanchez307 22:601e6f9077e4 17 return;
jsanchez307 22:601e6f9077e4 18 }
jsanchez307 22:601e6f9077e4 19 key_input = 1;
jsanchez307 22:601e6f9077e4 20 }
jsanchez307 22:601e6f9077e4 21
jsanchez307 22:601e6f9077e4 22 void input_right()
jsanchez307 22:601e6f9077e4 23 {
jsanchez307 22:601e6f9077e4 24 if(!gameStarted)
jsanchez307 22:601e6f9077e4 25 { gameStarted=true;
jsanchez307 22:601e6f9077e4 26 return;
jsanchez307 22:601e6f9077e4 27 }
jsanchez307 22:601e6f9077e4 28 key_input = 2;
jsanchez307 22:601e6f9077e4 29 }
jsanchez307 22:601e6f9077e4 30
jsanchez307 22:601e6f9077e4 31 void input_rotate()
jsanchez307 22:601e6f9077e4 32 {
jsanchez307 22:601e6f9077e4 33 if(!gameStarted)
jsanchez307 22:601e6f9077e4 34 { gameStarted=true;
jsanchez307 22:601e6f9077e4 35 return;
jsanchez307 22:601e6f9077e4 36 }
jsanchez307 22:601e6f9077e4 37 key_input = 3;
jsanchez307 22:601e6f9077e4 38 }
jsanchez307 22:601e6f9077e4 39
jsanchez307 22:601e6f9077e4 40 void input_down()
jsanchez307 22:601e6f9077e4 41 {
jsanchez307 22:601e6f9077e4 42 if(!gameStarted)
jsanchez307 22:601e6f9077e4 43 { gameStarted=true;
jsanchez307 22:601e6f9077e4 44 return;
jsanchez307 22:601e6f9077e4 45 }
jsanchez307 22:601e6f9077e4 46 key_input=4;
jsanchez307 22:601e6f9077e4 47 }
jsanchez307 22:601e6f9077e4 48
jsanchez307 22:601e6f9077e4 49 void clear_board()
jsanchez307 22:601e6f9077e4 50 {
jsanchez307 22:601e6f9077e4 51 uLCD.filled_rectangle(20,0,79,128,0);
jsanchez307 22:601e6f9077e4 52 }
jsanchez307 22:601e6f9077e4 53
jsanchez307 22:601e6f9077e4 54 void clear_next_piece()
jsanchez307 22:601e6f9077e4 55 {
jsanchez307 22:601e6f9077e4 56 uLCD.filled_rectangle(92,20,122,50,0);
jsanchez307 22:601e6f9077e4 57 }
jsanchez307 22:601e6f9077e4 58
jsanchez307 22:601e6f9077e4 59 void UpdateGameStatus(int points) // used to include int lines
jsanchez307 22:601e6f9077e4 60 {
jsanchez307 22:601e6f9077e4 61 uLCD.locate(13,12);
jsanchez307 22:601e6f9077e4 62 uLCD.printf("Score");
jsanchez307 22:601e6f9077e4 63 uLCD.locate(13,13);
jsanchez307 22:601e6f9077e4 64 uLCD.printf("%d",points);
jsanchez307 22:601e6f9077e4 65 }
jsanchez307 22:601e6f9077e4 66
jsanchez307 22:601e6f9077e4 67
jsanchez307 22:601e6f9077e4 68 /*int RandomGen(char range)
jsanchez307 22:601e6f9077e4 69 {
jsanchez307 22:601e6f9077e4 70 pc.printf("%c",range);
jsanchez307 22:601e6f9077e4 71 while(!pc.readable()) wait(0.5);
jsanchez307 22:601e6f9077e4 72 char buffer[4];
jsanchez307 22:601e6f9077e4 73 pc.gets(buffer,4);
jsanchez307 22:601e6f9077e4 74 int i = buffer[0]-'0';
jsanchez307 22:601e6f9077e4 75 return i;
jsanchez307 22:601e6f9077e4 76 }*/
jsanchez307 22:601e6f9077e4 77
jsanchez307 22:601e6f9077e4 78 int main()
jsanchez307 22:601e6f9077e4 79 {
jsanchez307 22:601e6f9077e4 80 /*while(1){
jsanchez307 22:601e6f9077e4 81 uLCD.printf("test");
jsanchez307 22:601e6f9077e4 82 }*/
jsanchez307 22:601e6f9077e4 83
jsanchez307 22:601e6f9077e4 84
jsanchez307 22:601e6f9077e4 85
jsanchez307 22:601e6f9077e4 86
jsanchez307 22:601e6f9077e4 87 /*if (myNav.up()) input_rotate();
jsanchez307 22:601e6f9077e4 88 if (myNav.down()) input_down();;
jsanchez307 22:601e6f9077e4 89 if (myNav.left()) input_left();
jsanchez307 22:601e6f9077e4 90 if (myNav.right()) input_right();;
jsanchez307 22:601e6f9077e4 91 //check mouse left button click*/ // FIXQ
jsanchez307 22:601e6f9077e4 92 //if (myNav.fire()) input_down; // FIX, CAN ADD MENU FUNCTIONALITY
jsanchez307 22:601e6f9077e4 93
jsanchez307 22:601e6f9077e4 94
jsanchez307 22:601e6f9077e4 95
jsanchez307 22:601e6f9077e4 96 uLCD.text_width(2);
jsanchez307 22:601e6f9077e4 97 uLCD.text_height(2);
jsanchez307 22:601e6f9077e4 98 uLCD.color(WHITE);
jsanchez307 22:601e6f9077e4 99 uLCD.printf("TETRIS");
jsanchez307 22:601e6f9077e4 100 wait(2);
jsanchez307 22:601e6f9077e4 101
jsanchez307 22:601e6f9077e4 102 uLCD.baudrate(3000000);
jsanchez307 22:601e6f9077e4 103
jsanchez307 22:601e6f9077e4 104
jsanchez307 22:601e6f9077e4 105 /*pc.baud(9600);
jsanchez307 22:601e6f9077e4 106 pc.format(8,SerialBase::None,1);
jsanchez307 22:601e6f9077e4 107 pc.printf("0");
jsanchez307 22:601e6f9077e4 108 while(!pc.readable()) wait(0.5);
jsanchez307 22:601e6f9077e4 109 char buffer[4];
jsanchez307 22:601e6f9077e4 110 pc.gets(buffer,4);*/
jsanchez307 22:601e6f9077e4 111
jsanchez307 22:601e6f9077e4 112
jsanchez307 22:601e6f9077e4 113
jsanchez307 22:601e6f9077e4 114
jsanchez307 22:601e6f9077e4 115
jsanchez307 22:601e6f9077e4 116
jsanchez307 22:601e6f9077e4 117 bool isGameOver = false;
jsanchez307 22:601e6f9077e4 118 int mScreenHeight = 128;
jsanchez307 22:601e6f9077e4 119 Pieces mPieces;
jsanchez307 22:601e6f9077e4 120 Board mBoard (&mPieces, mScreenHeight);
jsanchez307 22:601e6f9077e4 121 int a = 1; // RandomGen('a')
jsanchez307 22:601e6f9077e4 122 int b = 2;
jsanchez307 22:601e6f9077e4 123 int c = 3;
jsanchez307 22:601e6f9077e4 124 int d = 4;
jsanchez307 22:601e6f9077e4 125 Game mGame (&mBoard, &mPieces, mScreenHeight, &uLCD,a,b,c,d);
jsanchez307 22:601e6f9077e4 126
jsanchez307 22:601e6f9077e4 127
jsanchez307 22:601e6f9077e4 128 // ----- Main Loop -----
jsanchez307 22:601e6f9077e4 129 int prevX=0;
jsanchez307 22:601e6f9077e4 130 int prevY=0;
jsanchez307 22:601e6f9077e4 131 int prevPiece=-1;
jsanchez307 22:601e6f9077e4 132 int prevRot=0;
jsanchez307 22:601e6f9077e4 133 Timer timer;
jsanchez307 22:601e6f9077e4 134 timer.start();
jsanchez307 22:601e6f9077e4 135 key_input=0;
jsanchez307 22:601e6f9077e4 136 bool needErase = false;
jsanchez307 22:601e6f9077e4 137 uLCD.cls();
jsanchez307 22:601e6f9077e4 138
jsanchez307 22:601e6f9077e4 139
jsanchez307 22:601e6f9077e4 140
jsanchez307 22:601e6f9077e4 141 int piece = 0;
jsanchez307 22:601e6f9077e4 142 int rotate = 0;
jsanchez307 22:601e6f9077e4 143
jsanchez307 22:601e6f9077e4 144 UpdateGameStatus(mGame.GetPoints());
jsanchez307 22:601e6f9077e4 145
jsanchez307 22:601e6f9077e4 146 while (1)
jsanchez307 22:601e6f9077e4 147 {
jsanchez307 22:601e6f9077e4 148 if (myNav.up()) input_rotate();
jsanchez307 22:601e6f9077e4 149 if (myNav.down()) input_down();;
jsanchez307 22:601e6f9077e4 150 if (myNav.left()) input_left();
jsanchez307 22:601e6f9077e4 151 if (myNav.right()) input_right();;
jsanchez307 22:601e6f9077e4 152 //check mouse left button click // FIXQ
jsanchez307 22:601e6f9077e4 153 //if (myNav.fire()) input_down; // FIX, CAN ADD MENU FUNCTIONALITY
jsanchez307 22:601e6f9077e4 154
jsanchez307 22:601e6f9077e4 155 if(isGameOver)
jsanchez307 22:601e6f9077e4 156 {
jsanchez307 22:601e6f9077e4 157 wait(1);
jsanchez307 22:601e6f9077e4 158 uLCD.cls();
jsanchez307 22:601e6f9077e4 159 uLCD.text_width(2);
jsanchez307 22:601e6f9077e4 160 uLCD.text_height(2);
jsanchez307 22:601e6f9077e4 161 uLCD.printf("GAME OVER");
jsanchez307 22:601e6f9077e4 162 while(1);
jsanchez307 22:601e6f9077e4 163 }
jsanchez307 22:601e6f9077e4 164 // ----- Draw ----
jsanchez307 22:601e6f9077e4 165 if(needErase)
jsanchez307 22:601e6f9077e4 166 {
jsanchez307 22:601e6f9077e4 167 mGame.ErasePiece(prevX,prevY,prevPiece,prevRot);
jsanchez307 22:601e6f9077e4 168 needErase=false;
jsanchez307 22:601e6f9077e4 169 }
jsanchez307 22:601e6f9077e4 170 mGame.DrawScene();
jsanchez307 22:601e6f9077e4 171
jsanchez307 22:601e6f9077e4 172 prevX=mGame.mPosX;
jsanchez307 22:601e6f9077e4 173 prevY=mGame.mPosY;
jsanchez307 22:601e6f9077e4 174 prevPiece=mGame.mPiece;
jsanchez307 22:601e6f9077e4 175 prevRot=mGame.mRotation;
jsanchez307 22:601e6f9077e4 176
jsanchez307 22:601e6f9077e4 177 // ----- Input -----
jsanchez307 22:601e6f9077e4 178 switch (key_input)
jsanchez307 22:601e6f9077e4 179 {
jsanchez307 22:601e6f9077e4 180 case (2): //right
jsanchez307 22:601e6f9077e4 181 {
jsanchez307 22:601e6f9077e4 182 if (mBoard.IsPossibleMovement (mGame.mPosX + 1, mGame.mPosY, mGame.mPiece, mGame.mRotation))
jsanchez307 22:601e6f9077e4 183 {mGame.mPosX++;needErase=true;}
jsanchez307 22:601e6f9077e4 184 break;
jsanchez307 22:601e6f9077e4 185 }
jsanchez307 22:601e6f9077e4 186
jsanchez307 22:601e6f9077e4 187 case (1): //left
jsanchez307 22:601e6f9077e4 188 {
jsanchez307 22:601e6f9077e4 189 if (mBoard.IsPossibleMovement (mGame.mPosX - 1, mGame.mPosY, mGame.mPiece, mGame.mRotation))
jsanchez307 22:601e6f9077e4 190 {mGame.mPosX--;needErase=true;}
jsanchez307 22:601e6f9077e4 191 break;
jsanchez307 22:601e6f9077e4 192 }
jsanchez307 22:601e6f9077e4 193
jsanchez307 22:601e6f9077e4 194 case (4)://down
jsanchez307 22:601e6f9077e4 195 {
jsanchez307 22:601e6f9077e4 196 // Check collision from up to down
jsanchez307 22:601e6f9077e4 197 while (mBoard.IsPossibleMovement(mGame.mPosX, mGame.mPosY, mGame.mPiece, mGame.mRotation)) { mGame.mPosY++; }
jsanchez307 22:601e6f9077e4 198 needErase=true;
jsanchez307 22:601e6f9077e4 199 mBoard.StorePiece (mGame.mPosX, mGame.mPosY - 1, mGame.mPiece, mGame.mRotation);
jsanchez307 22:601e6f9077e4 200 mGame.AddPoints(SinglePiecePoints);
jsanchez307 22:601e6f9077e4 201 int linesDeleted = mBoard.DeletePossibleLines ();
jsanchez307 22:601e6f9077e4 202 if(linesDeleted>0)
jsanchez307 22:601e6f9077e4 203 {
jsanchez307 22:601e6f9077e4 204 mGame.AddClearedLines(linesDeleted);
jsanchez307 22:601e6f9077e4 205 mGame.AddPoints(LineClearPoints*linesDeleted);
jsanchez307 22:601e6f9077e4 206 //Thread t1(FlashLight);
jsanchez307 22:601e6f9077e4 207 //PlayClearSound();
jsanchez307 22:601e6f9077e4 208 clear_board();
jsanchez307 22:601e6f9077e4 209 }
jsanchez307 22:601e6f9077e4 210 UpdateGameStatus(mGame.GetPoints()); // FIX
jsanchez307 22:601e6f9077e4 211
jsanchez307 22:601e6f9077e4 212 if (mBoard.IsGameOver())
jsanchez307 22:601e6f9077e4 213 {
jsanchez307 22:601e6f9077e4 214 isGameOver=true;
jsanchez307 22:601e6f9077e4 215 uLCD.cls();
jsanchez307 22:601e6f9077e4 216
jsanchez307 22:601e6f9077e4 217 }
jsanchez307 22:601e6f9077e4 218
jsanchez307 22:601e6f9077e4 219 if(!isGameOver)
jsanchez307 22:601e6f9077e4 220 {
jsanchez307 22:601e6f9077e4 221 mGame.CreateNewPiece(piece,rotate);
jsanchez307 22:601e6f9077e4 222 clear_next_piece();
jsanchez307 22:601e6f9077e4 223
jsanchez307 22:601e6f9077e4 224 piece++;
jsanchez307 22:601e6f9077e4 225 rotate++;
jsanchez307 22:601e6f9077e4 226
jsanchez307 22:601e6f9077e4 227 if (piece==7) piece = 0;
jsanchez307 22:601e6f9077e4 228 if (rotate==4) rotate = 0;
jsanchez307 22:601e6f9077e4 229 }
jsanchez307 22:601e6f9077e4 230 break;
jsanchez307 22:601e6f9077e4 231 }
jsanchez307 22:601e6f9077e4 232
jsanchez307 22:601e6f9077e4 233 case (3)://rotate
jsanchez307 22:601e6f9077e4 234 {
jsanchez307 22:601e6f9077e4 235 if (mBoard.IsPossibleMovement (mGame.mPosX, mGame.mPosY, mGame.mPiece, (mGame.mRotation + 1) % 4))
jsanchez307 22:601e6f9077e4 236 {mGame.mRotation = (mGame.mRotation + 1) % 4;needErase=true;}
jsanchez307 22:601e6f9077e4 237 break;
jsanchez307 22:601e6f9077e4 238 }
jsanchez307 22:601e6f9077e4 239
jsanchez307 22:601e6f9077e4 240 case (0):{break;}
jsanchez307 22:601e6f9077e4 241 }
jsanchez307 22:601e6f9077e4 242 key_input = 0;
jsanchez307 22:601e6f9077e4 243
jsanchez307 22:601e6f9077e4 244 // ----- Vertical movement -----
jsanchez307 22:601e6f9077e4 245
jsanchez307 22:601e6f9077e4 246 if(timer.read_ms()>WAIT_TIME)
jsanchez307 22:601e6f9077e4 247 {
jsanchez307 22:601e6f9077e4 248 needErase=true;
jsanchez307 22:601e6f9077e4 249 if(!isGameOver)
jsanchez307 22:601e6f9077e4 250 {
jsanchez307 22:601e6f9077e4 251 if (mBoard.IsPossibleMovement (mGame.mPosX, mGame.mPosY + 1, mGame.mPiece, mGame.mRotation))
jsanchez307 22:601e6f9077e4 252 {
jsanchez307 22:601e6f9077e4 253 mGame.mPosY++;
jsanchez307 22:601e6f9077e4 254 }
jsanchez307 22:601e6f9077e4 255 else
jsanchez307 22:601e6f9077e4 256 {
jsanchez307 22:601e6f9077e4 257 mBoard.StorePiece (mGame.mPosX, mGame.mPosY, mGame.mPiece, mGame.mRotation);
jsanchez307 22:601e6f9077e4 258 mGame.AddPoints(SinglePiecePoints);
jsanchez307 22:601e6f9077e4 259 int linesDeleted = mBoard.DeletePossibleLines ();
jsanchez307 22:601e6f9077e4 260 if(linesDeleted>0)
jsanchez307 22:601e6f9077e4 261 {
jsanchez307 22:601e6f9077e4 262 mGame.AddClearedLines(linesDeleted);
jsanchez307 22:601e6f9077e4 263 mGame.AddPoints(LineClearPoints*linesDeleted);
jsanchez307 22:601e6f9077e4 264 //Thread t1(FlashLight);
jsanchez307 22:601e6f9077e4 265 //PlayClearSound();
jsanchez307 22:601e6f9077e4 266 clear_board();
jsanchez307 22:601e6f9077e4 267 }
jsanchez307 22:601e6f9077e4 268 UpdateGameStatus(mGame.GetPoints());
jsanchez307 22:601e6f9077e4 269
jsanchez307 22:601e6f9077e4 270 if (mBoard.IsGameOver())
jsanchez307 22:601e6f9077e4 271 {
jsanchez307 22:601e6f9077e4 272 isGameOver=true;
jsanchez307 22:601e6f9077e4 273 uLCD.cls();
jsanchez307 22:601e6f9077e4 274 }
jsanchez307 22:601e6f9077e4 275
jsanchez307 22:601e6f9077e4 276 if(!isGameOver)
jsanchez307 22:601e6f9077e4 277 {
jsanchez307 22:601e6f9077e4 278 mGame.CreateNewPiece(piece,rotate);
jsanchez307 22:601e6f9077e4 279 clear_next_piece(); // 0-6 Pieces, 0-3 rotations^^
jsanchez307 22:601e6f9077e4 280 piece++;
jsanchez307 22:601e6f9077e4 281 rotate++;
jsanchez307 22:601e6f9077e4 282
jsanchez307 22:601e6f9077e4 283 if (piece==7) piece = 0;
jsanchez307 22:601e6f9077e4 284 if (rotate==4) rotate = 0;
jsanchez307 22:601e6f9077e4 285 }
jsanchez307 22:601e6f9077e4 286 }
jsanchez307 22:601e6f9077e4 287 }
jsanchez307 22:601e6f9077e4 288 timer.reset();
jsanchez307 22:601e6f9077e4 289 }
jsanchez307 22:601e6f9077e4 290 wait(0.1);
jsanchez307 22:601e6f9077e4 291 }
jsanchez307 22:601e6f9077e4 292 }