Sound update
Dependencies: 4DGL-uLCD-SE Physac-MBED PinDetect SDFileSystem mbed-rtos mbed
tetris/tetris.cpp@22:601e6f9077e4, 22 months ago (annotated)
- Committer:
- jsanchez307
- Date:
- Tue Dec 06 22:48:35 2022 +0000
- Revision:
- 22:601e6f9077e4
- Parent:
- 20:73e4f12277bd
- Child:
- 23:214c0c828d98
Added working Tetris Game
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jstephens78 | 19:6d9bee043ede | 1 | #include "mbed.h" |
jsanchez307 | 22:601e6f9077e4 | 2 | #include "uLCD_4DGL.h" |
jstephens78 | 19:6d9bee043ede | 3 | #include "Game.h" |
jsanchez307 | 22:601e6f9077e4 | 4 | #include "Nav_Switch.h" |
jstephens78 | 19:6d9bee043ede | 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) |
jstephens78 | 19:6d9bee043ede | 8 | |
jstephens78 | 19:6d9bee043ede | 9 | int SinglePiecePoints = 50; |
jstephens78 | 19:6d9bee043ede | 10 | int LineClearPoints = 200; |
jstephens78 | 19:6d9bee043ede | 11 | int key_input = 0; |
jstephens78 | 19:6d9bee043ede | 12 | bool gameStarted = false; |
jstephens78 | 19:6d9bee043ede | 13 | void input_left() // FIX |
jstephens78 | 19:6d9bee043ede | 14 | { |
jstephens78 | 19:6d9bee043ede | 15 | if(!gameStarted) |
jstephens78 | 19:6d9bee043ede | 16 | { gameStarted=true; |
jstephens78 | 19:6d9bee043ede | 17 | return; |
jstephens78 | 19:6d9bee043ede | 18 | } |
jstephens78 | 19:6d9bee043ede | 19 | key_input = 1; |
jstephens78 | 19:6d9bee043ede | 20 | } |
jstephens78 | 19:6d9bee043ede | 21 | |
jstephens78 | 19:6d9bee043ede | 22 | void input_right() |
jstephens78 | 19:6d9bee043ede | 23 | { |
jstephens78 | 19:6d9bee043ede | 24 | if(!gameStarted) |
jstephens78 | 19:6d9bee043ede | 25 | { gameStarted=true; |
jstephens78 | 19:6d9bee043ede | 26 | return; |
jstephens78 | 19:6d9bee043ede | 27 | } |
jstephens78 | 19:6d9bee043ede | 28 | key_input = 2; |
jstephens78 | 19:6d9bee043ede | 29 | } |
jstephens78 | 19:6d9bee043ede | 30 | |
jstephens78 | 19:6d9bee043ede | 31 | void input_rotate() |
jstephens78 | 19:6d9bee043ede | 32 | { |
jstephens78 | 19:6d9bee043ede | 33 | if(!gameStarted) |
jstephens78 | 19:6d9bee043ede | 34 | { gameStarted=true; |
jstephens78 | 19:6d9bee043ede | 35 | return; |
jstephens78 | 19:6d9bee043ede | 36 | } |
jstephens78 | 19:6d9bee043ede | 37 | key_input = 3; |
jstephens78 | 19:6d9bee043ede | 38 | } |
jstephens78 | 19:6d9bee043ede | 39 | |
jstephens78 | 19:6d9bee043ede | 40 | void input_down() |
jstephens78 | 19:6d9bee043ede | 41 | { |
jstephens78 | 19:6d9bee043ede | 42 | if(!gameStarted) |
jstephens78 | 19:6d9bee043ede | 43 | { gameStarted=true; |
jstephens78 | 19:6d9bee043ede | 44 | return; |
jstephens78 | 19:6d9bee043ede | 45 | } |
jstephens78 | 19:6d9bee043ede | 46 | key_input=4; |
jstephens78 | 19:6d9bee043ede | 47 | } |
jstephens78 | 19:6d9bee043ede | 48 | |
jstephens78 | 19:6d9bee043ede | 49 | void clear_board() |
jstephens78 | 19:6d9bee043ede | 50 | { |
jstephens78 | 19:6d9bee043ede | 51 | uLCD.filled_rectangle(20,0,79,128,0); |
jstephens78 | 19:6d9bee043ede | 52 | } |
jstephens78 | 19:6d9bee043ede | 53 | |
jstephens78 | 19:6d9bee043ede | 54 | void clear_next_piece() |
jstephens78 | 19:6d9bee043ede | 55 | { |
jstephens78 | 19:6d9bee043ede | 56 | uLCD.filled_rectangle(92,20,122,50,0); |
jstephens78 | 19:6d9bee043ede | 57 | } |
jstephens78 | 19:6d9bee043ede | 58 | |
jsanchez307 | 22:601e6f9077e4 | 59 | void UpdateGameStatus(int points) // used to include int lines |
jstephens78 | 19:6d9bee043ede | 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); |
jstephens78 | 19:6d9bee043ede | 65 | } |
jstephens78 | 19:6d9bee043ede | 66 | |
jstephens78 | 19:6d9bee043ede | 67 | |
jsanchez307 | 22:601e6f9077e4 | 68 | /*int RandomGen(char range) |
jstephens78 | 19:6d9bee043ede | 69 | { |
jstephens78 | 19:6d9bee043ede | 70 | pc.printf("%c",range); |
jstephens78 | 19:6d9bee043ede | 71 | while(!pc.readable()) wait(0.5); |
jstephens78 | 19:6d9bee043ede | 72 | char buffer[4]; |
jstephens78 | 19:6d9bee043ede | 73 | pc.gets(buffer,4); |
jstephens78 | 19:6d9bee043ede | 74 | int i = buffer[0]-'0'; |
jstephens78 | 19:6d9bee043ede | 75 | return i; |
jsanchez307 | 22:601e6f9077e4 | 76 | }*/ |
jstephens78 | 19:6d9bee043ede | 77 | |
jsanchez307 | 22:601e6f9077e4 | 78 | void tetrisGame() |
jstephens78 | 19:6d9bee043ede | 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 | |
jstephens78 | 19:6d9bee043ede | 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 | |
jstephens78 | 19:6d9bee043ede | 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 | |
jstephens78 | 19:6d9bee043ede | 102 | uLCD.baudrate(3000000); |
jstephens78 | 19:6d9bee043ede | 103 | |
jstephens78 | 20:73e4f12277bd | 104 | |
jsanchez307 | 22:601e6f9077e4 | 105 | /*pc.baud(9600); |
jstephens78 | 19:6d9bee043ede | 106 | pc.format(8,SerialBase::None,1); |
jstephens78 | 19:6d9bee043ede | 107 | pc.printf("0"); |
jstephens78 | 19:6d9bee043ede | 108 | while(!pc.readable()) wait(0.5); |
jstephens78 | 19:6d9bee043ede | 109 | char buffer[4]; |
jsanchez307 | 22:601e6f9077e4 | 110 | pc.gets(buffer,4);*/ |
jsanchez307 | 22:601e6f9077e4 | 111 | |
jsanchez307 | 22:601e6f9077e4 | 112 | |
jstephens78 | 19:6d9bee043ede | 113 | |
jsanchez307 | 22:601e6f9077e4 | 114 | |
jsanchez307 | 22:601e6f9077e4 | 115 | |
jsanchez307 | 22:601e6f9077e4 | 116 | |
jstephens78 | 19:6d9bee043ede | 117 | bool isGameOver = false; |
jstephens78 | 19:6d9bee043ede | 118 | int mScreenHeight = 128; |
jstephens78 | 19:6d9bee043ede | 119 | Pieces mPieces; |
jstephens78 | 19:6d9bee043ede | 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; |
jstephens78 | 19:6d9bee043ede | 125 | Game mGame (&mBoard, &mPieces, mScreenHeight, &uLCD,a,b,c,d); |
jstephens78 | 19:6d9bee043ede | 126 | |
jstephens78 | 19:6d9bee043ede | 127 | |
jstephens78 | 19:6d9bee043ede | 128 | // ----- Main Loop ----- |
jstephens78 | 19:6d9bee043ede | 129 | int prevX=0; |
jstephens78 | 19:6d9bee043ede | 130 | int prevY=0; |
jstephens78 | 19:6d9bee043ede | 131 | int prevPiece=-1; |
jstephens78 | 19:6d9bee043ede | 132 | int prevRot=0; |
jstephens78 | 19:6d9bee043ede | 133 | Timer timer; |
jstephens78 | 19:6d9bee043ede | 134 | timer.start(); |
jstephens78 | 19:6d9bee043ede | 135 | key_input=0; |
jstephens78 | 19:6d9bee043ede | 136 | bool needErase = false; |
jstephens78 | 19:6d9bee043ede | 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 | |
jstephens78 | 19:6d9bee043ede | 146 | while (1) |
jstephens78 | 19:6d9bee043ede | 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 | |
jstephens78 | 19:6d9bee043ede | 155 | if(isGameOver) |
jstephens78 | 19:6d9bee043ede | 156 | { |
jstephens78 | 19:6d9bee043ede | 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); |
jstephens78 | 19:6d9bee043ede | 163 | } |
jstephens78 | 19:6d9bee043ede | 164 | // ----- Draw ---- |
jstephens78 | 19:6d9bee043ede | 165 | if(needErase) |
jstephens78 | 19:6d9bee043ede | 166 | { |
jstephens78 | 19:6d9bee043ede | 167 | mGame.ErasePiece(prevX,prevY,prevPiece,prevRot); |
jstephens78 | 19:6d9bee043ede | 168 | needErase=false; |
jstephens78 | 19:6d9bee043ede | 169 | } |
jstephens78 | 19:6d9bee043ede | 170 | mGame.DrawScene(); |
jstephens78 | 19:6d9bee043ede | 171 | |
jstephens78 | 19:6d9bee043ede | 172 | prevX=mGame.mPosX; |
jstephens78 | 19:6d9bee043ede | 173 | prevY=mGame.mPosY; |
jstephens78 | 19:6d9bee043ede | 174 | prevPiece=mGame.mPiece; |
jstephens78 | 19:6d9bee043ede | 175 | prevRot=mGame.mRotation; |
jsanchez307 | 22:601e6f9077e4 | 176 | |
jstephens78 | 19:6d9bee043ede | 177 | // ----- Input ----- |
jstephens78 | 19:6d9bee043ede | 178 | switch (key_input) |
jstephens78 | 19:6d9bee043ede | 179 | { |
jstephens78 | 19:6d9bee043ede | 180 | case (2): //right |
jstephens78 | 19:6d9bee043ede | 181 | { |
jstephens78 | 19:6d9bee043ede | 182 | if (mBoard.IsPossibleMovement (mGame.mPosX + 1, mGame.mPosY, mGame.mPiece, mGame.mRotation)) |
jstephens78 | 19:6d9bee043ede | 183 | {mGame.mPosX++;needErase=true;} |
jstephens78 | 19:6d9bee043ede | 184 | break; |
jstephens78 | 19:6d9bee043ede | 185 | } |
jstephens78 | 19:6d9bee043ede | 186 | |
jstephens78 | 19:6d9bee043ede | 187 | case (1): //left |
jstephens78 | 19:6d9bee043ede | 188 | { |
jstephens78 | 19:6d9bee043ede | 189 | if (mBoard.IsPossibleMovement (mGame.mPosX - 1, mGame.mPosY, mGame.mPiece, mGame.mRotation)) |
jstephens78 | 19:6d9bee043ede | 190 | {mGame.mPosX--;needErase=true;} |
jstephens78 | 19:6d9bee043ede | 191 | break; |
jstephens78 | 19:6d9bee043ede | 192 | } |
jstephens78 | 19:6d9bee043ede | 193 | |
jstephens78 | 19:6d9bee043ede | 194 | case (4)://down |
jstephens78 | 19:6d9bee043ede | 195 | { |
jstephens78 | 19:6d9bee043ede | 196 | // Check collision from up to down |
jstephens78 | 19:6d9bee043ede | 197 | while (mBoard.IsPossibleMovement(mGame.mPosX, mGame.mPosY, mGame.mPiece, mGame.mRotation)) { mGame.mPosY++; } |
jstephens78 | 19:6d9bee043ede | 198 | needErase=true; |
jstephens78 | 19:6d9bee043ede | 199 | mBoard.StorePiece (mGame.mPosX, mGame.mPosY - 1, mGame.mPiece, mGame.mRotation); |
jstephens78 | 19:6d9bee043ede | 200 | mGame.AddPoints(SinglePiecePoints); |
jstephens78 | 19:6d9bee043ede | 201 | int linesDeleted = mBoard.DeletePossibleLines (); |
jstephens78 | 19:6d9bee043ede | 202 | if(linesDeleted>0) |
jstephens78 | 19:6d9bee043ede | 203 | { |
jstephens78 | 19:6d9bee043ede | 204 | mGame.AddClearedLines(linesDeleted); |
jstephens78 | 19:6d9bee043ede | 205 | mGame.AddPoints(LineClearPoints*linesDeleted); |
jstephens78 | 19:6d9bee043ede | 206 | //Thread t1(FlashLight); |
jstephens78 | 19:6d9bee043ede | 207 | //PlayClearSound(); |
jstephens78 | 19:6d9bee043ede | 208 | clear_board(); |
jstephens78 | 19:6d9bee043ede | 209 | } |
jsanchez307 | 22:601e6f9077e4 | 210 | UpdateGameStatus(mGame.GetPoints()); // FIX |
jstephens78 | 19:6d9bee043ede | 211 | |
jstephens78 | 19:6d9bee043ede | 212 | if (mBoard.IsGameOver()) |
jstephens78 | 19:6d9bee043ede | 213 | { |
jstephens78 | 19:6d9bee043ede | 214 | isGameOver=true; |
jstephens78 | 19:6d9bee043ede | 215 | uLCD.cls(); |
jstephens78 | 19:6d9bee043ede | 216 | |
jstephens78 | 19:6d9bee043ede | 217 | } |
jstephens78 | 19:6d9bee043ede | 218 | |
jstephens78 | 19:6d9bee043ede | 219 | if(!isGameOver) |
jstephens78 | 19:6d9bee043ede | 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; |
jstephens78 | 19:6d9bee043ede | 229 | } |
jstephens78 | 19:6d9bee043ede | 230 | break; |
jstephens78 | 19:6d9bee043ede | 231 | } |
jstephens78 | 19:6d9bee043ede | 232 | |
jstephens78 | 19:6d9bee043ede | 233 | case (3)://rotate |
jstephens78 | 19:6d9bee043ede | 234 | { |
jstephens78 | 19:6d9bee043ede | 235 | if (mBoard.IsPossibleMovement (mGame.mPosX, mGame.mPosY, mGame.mPiece, (mGame.mRotation + 1) % 4)) |
jstephens78 | 19:6d9bee043ede | 236 | {mGame.mRotation = (mGame.mRotation + 1) % 4;needErase=true;} |
jstephens78 | 19:6d9bee043ede | 237 | break; |
jstephens78 | 19:6d9bee043ede | 238 | } |
jstephens78 | 19:6d9bee043ede | 239 | |
jstephens78 | 19:6d9bee043ede | 240 | case (0):{break;} |
jstephens78 | 19:6d9bee043ede | 241 | } |
jstephens78 | 19:6d9bee043ede | 242 | key_input = 0; |
jstephens78 | 19:6d9bee043ede | 243 | |
jstephens78 | 19:6d9bee043ede | 244 | // ----- Vertical movement ----- |
jsanchez307 | 22:601e6f9077e4 | 245 | |
jstephens78 | 19:6d9bee043ede | 246 | if(timer.read_ms()>WAIT_TIME) |
jstephens78 | 19:6d9bee043ede | 247 | { |
jstephens78 | 19:6d9bee043ede | 248 | needErase=true; |
jstephens78 | 19:6d9bee043ede | 249 | if(!isGameOver) |
jstephens78 | 19:6d9bee043ede | 250 | { |
jstephens78 | 19:6d9bee043ede | 251 | if (mBoard.IsPossibleMovement (mGame.mPosX, mGame.mPosY + 1, mGame.mPiece, mGame.mRotation)) |
jstephens78 | 19:6d9bee043ede | 252 | { |
jstephens78 | 19:6d9bee043ede | 253 | mGame.mPosY++; |
jstephens78 | 19:6d9bee043ede | 254 | } |
jstephens78 | 19:6d9bee043ede | 255 | else |
jstephens78 | 19:6d9bee043ede | 256 | { |
jstephens78 | 19:6d9bee043ede | 257 | mBoard.StorePiece (mGame.mPosX, mGame.mPosY, mGame.mPiece, mGame.mRotation); |
jstephens78 | 19:6d9bee043ede | 258 | mGame.AddPoints(SinglePiecePoints); |
jstephens78 | 19:6d9bee043ede | 259 | int linesDeleted = mBoard.DeletePossibleLines (); |
jstephens78 | 19:6d9bee043ede | 260 | if(linesDeleted>0) |
jstephens78 | 19:6d9bee043ede | 261 | { |
jstephens78 | 19:6d9bee043ede | 262 | mGame.AddClearedLines(linesDeleted); |
jstephens78 | 19:6d9bee043ede | 263 | mGame.AddPoints(LineClearPoints*linesDeleted); |
jstephens78 | 19:6d9bee043ede | 264 | //Thread t1(FlashLight); |
jstephens78 | 19:6d9bee043ede | 265 | //PlayClearSound(); |
jstephens78 | 19:6d9bee043ede | 266 | clear_board(); |
jstephens78 | 19:6d9bee043ede | 267 | } |
jsanchez307 | 22:601e6f9077e4 | 268 | UpdateGameStatus(mGame.GetPoints()); |
jstephens78 | 19:6d9bee043ede | 269 | |
jstephens78 | 19:6d9bee043ede | 270 | if (mBoard.IsGameOver()) |
jstephens78 | 19:6d9bee043ede | 271 | { |
jstephens78 | 19:6d9bee043ede | 272 | isGameOver=true; |
jstephens78 | 19:6d9bee043ede | 273 | uLCD.cls(); |
jstephens78 | 19:6d9bee043ede | 274 | } |
jstephens78 | 19:6d9bee043ede | 275 | |
jstephens78 | 19:6d9bee043ede | 276 | if(!isGameOver) |
jstephens78 | 19:6d9bee043ede | 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; |
jstephens78 | 19:6d9bee043ede | 285 | } |
jstephens78 | 19:6d9bee043ede | 286 | } |
jstephens78 | 19:6d9bee043ede | 287 | } |
jstephens78 | 19:6d9bee043ede | 288 | timer.reset(); |
jstephens78 | 19:6d9bee043ede | 289 | } |
jstephens78 | 19:6d9bee043ede | 290 | wait(0.1); |
jstephens78 | 19:6d9bee043ede | 291 | } |
jstephens78 | 19:6d9bee043ede | 292 | } |