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

Committer:
sucrelv
Date:
Tue Oct 21 15:10:36 2014 +0000
Revision:
0:3b5e97ab5884
initial upload

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sucrelv 0:3b5e97ab5884 1 #include "mbed.h"
sucrelv 0:3b5e97ab5884 2 #include "Game.h"
sucrelv 0:3b5e97ab5884 3 #include "PinDetect.h"
sucrelv 0:3b5e97ab5884 4 #include "Speaker.h"
sucrelv 0:3b5e97ab5884 5 #include "TextLCD.h"
sucrelv 0:3b5e97ab5884 6 #include "Shiftbrite.h"
sucrelv 0:3b5e97ab5884 7 #include "SDFileSystem.h"
sucrelv 0:3b5e97ab5884 8 #include "wave_player.h"
sucrelv 0:3b5e97ab5884 9 #include "rtos.h"
sucrelv 0:3b5e97ab5884 10
sucrelv 0:3b5e97ab5884 11 uLCD_4DGL uLCD(p28, p27, p29);
sucrelv 0:3b5e97ab5884 12 TextLCD textLCD(p26, p25, p24, p23, p22, p15);
sucrelv 0:3b5e97ab5884 13 Speaker mySpeaker(p21);
sucrelv 0:3b5e97ab5884 14 Shiftbrite myShiftbrite(p9, p10, p11, p12, p13);
sucrelv 0:3b5e97ab5884 15 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
sucrelv 0:3b5e97ab5884 16 Serial pc(USBTX, USBRX);
sucrelv 0:3b5e97ab5884 17
sucrelv 0:3b5e97ab5884 18 PinDetect LEFT_KEY(p16);
sucrelv 0:3b5e97ab5884 19 PinDetect RIGHT_KEY(p19);
sucrelv 0:3b5e97ab5884 20 PinDetect ROTATE_KEY(p17);
sucrelv 0:3b5e97ab5884 21 PinDetect DOWN_KEY(p30);
sucrelv 0:3b5e97ab5884 22
sucrelv 0:3b5e97ab5884 23 int SinglePiecePoints = 50;
sucrelv 0:3b5e97ab5884 24 int LineClearPoints = 200;
sucrelv 0:3b5e97ab5884 25 int key_input = 0;
sucrelv 0:3b5e97ab5884 26 bool gameStarted = false;
sucrelv 0:3b5e97ab5884 27 void input_left()
sucrelv 0:3b5e97ab5884 28 {
sucrelv 0:3b5e97ab5884 29 if(!gameStarted)
sucrelv 0:3b5e97ab5884 30 { gameStarted=true;
sucrelv 0:3b5e97ab5884 31 return;
sucrelv 0:3b5e97ab5884 32 }
sucrelv 0:3b5e97ab5884 33 key_input = 1;
sucrelv 0:3b5e97ab5884 34 mySpeaker.PlayNote(400.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 35 mySpeaker.PlayNote(500.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 36 }
sucrelv 0:3b5e97ab5884 37
sucrelv 0:3b5e97ab5884 38 void input_right()
sucrelv 0:3b5e97ab5884 39 {
sucrelv 0:3b5e97ab5884 40 if(!gameStarted)
sucrelv 0:3b5e97ab5884 41 { gameStarted=true;
sucrelv 0:3b5e97ab5884 42 return;
sucrelv 0:3b5e97ab5884 43 }
sucrelv 0:3b5e97ab5884 44 key_input = 2;
sucrelv 0:3b5e97ab5884 45 mySpeaker.PlayNote(400.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 46 mySpeaker.PlayNote(500.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 47 }
sucrelv 0:3b5e97ab5884 48
sucrelv 0:3b5e97ab5884 49 void input_rotate()
sucrelv 0:3b5e97ab5884 50 {
sucrelv 0:3b5e97ab5884 51 if(!gameStarted)
sucrelv 0:3b5e97ab5884 52 { gameStarted=true;
sucrelv 0:3b5e97ab5884 53 return;
sucrelv 0:3b5e97ab5884 54 }
sucrelv 0:3b5e97ab5884 55 key_input = 3;
sucrelv 0:3b5e97ab5884 56 mySpeaker.PlayNote(600.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 57 mySpeaker.PlayNote(700.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 58 mySpeaker.PlayNote(800.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 59 mySpeaker.PlayNote(900.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 60 }
sucrelv 0:3b5e97ab5884 61
sucrelv 0:3b5e97ab5884 62 void input_down()
sucrelv 0:3b5e97ab5884 63 {
sucrelv 0:3b5e97ab5884 64 if(!gameStarted)
sucrelv 0:3b5e97ab5884 65 { gameStarted=true;
sucrelv 0:3b5e97ab5884 66 return;
sucrelv 0:3b5e97ab5884 67 }
sucrelv 0:3b5e97ab5884 68 key_input=4;
sucrelv 0:3b5e97ab5884 69 mySpeaker.PlayNote(500.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 70 mySpeaker.PlayNote(1500.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 71 mySpeaker.PlayNote(500.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 72 mySpeaker.PlayNote(1500.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 73 }
sucrelv 0:3b5e97ab5884 74
sucrelv 0:3b5e97ab5884 75 void clear_board()
sucrelv 0:3b5e97ab5884 76 {
sucrelv 0:3b5e97ab5884 77 uLCD.filled_rectangle(20,0,79,128,0);
sucrelv 0:3b5e97ab5884 78 }
sucrelv 0:3b5e97ab5884 79
sucrelv 0:3b5e97ab5884 80 void clear_next_piece()
sucrelv 0:3b5e97ab5884 81 {
sucrelv 0:3b5e97ab5884 82 uLCD.filled_rectangle(92,20,122,50,0);
sucrelv 0:3b5e97ab5884 83 }
sucrelv 0:3b5e97ab5884 84
sucrelv 0:3b5e97ab5884 85 void UpdateGameStatus(int points,int lines)
sucrelv 0:3b5e97ab5884 86 {
sucrelv 0:3b5e97ab5884 87 textLCD.locate(7,0);
sucrelv 0:3b5e97ab5884 88 textLCD.printf("%d",points);
sucrelv 0:3b5e97ab5884 89 textLCD.locate(13,1);
sucrelv 0:3b5e97ab5884 90 textLCD.printf("%d",lines);
sucrelv 0:3b5e97ab5884 91 }
sucrelv 0:3b5e97ab5884 92
sucrelv 0:3b5e97ab5884 93 void FlashLight(void const *args)
sucrelv 0:3b5e97ab5884 94 {
sucrelv 0:3b5e97ab5884 95 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 96 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 97
sucrelv 0:3b5e97ab5884 98 myShiftbrite.RGB(0,0,42);
sucrelv 0:3b5e97ab5884 99 myShiftbrite.RGB(0,0,42);
sucrelv 0:3b5e97ab5884 100 Thread::wait(100);
sucrelv 0:3b5e97ab5884 101
sucrelv 0:3b5e97ab5884 102
sucrelv 0:3b5e97ab5884 103 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 104 myShiftbrite.RGB(0,42,0);
sucrelv 0:3b5e97ab5884 105 Thread::wait(100);
sucrelv 0:3b5e97ab5884 106
sucrelv 0:3b5e97ab5884 107 myShiftbrite.RGB(0,0,42);
sucrelv 0:3b5e97ab5884 108 myShiftbrite.RGB(0,0,42);
sucrelv 0:3b5e97ab5884 109 Thread::wait(100);
sucrelv 0:3b5e97ab5884 110
sucrelv 0:3b5e97ab5884 111 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 112 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 113 }
sucrelv 0:3b5e97ab5884 114
sucrelv 0:3b5e97ab5884 115 void GameOverLight(void const *args)
sucrelv 0:3b5e97ab5884 116 {
sucrelv 0:3b5e97ab5884 117
sucrelv 0:3b5e97ab5884 118 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 119 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 120
sucrelv 0:3b5e97ab5884 121 myShiftbrite.RGB(0,0,200);
sucrelv 0:3b5e97ab5884 122 Thread::wait(100);
sucrelv 0:3b5e97ab5884 123 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 124 Thread::wait(100);
sucrelv 0:3b5e97ab5884 125 myShiftbrite.RGB(0,0,200);
sucrelv 0:3b5e97ab5884 126 Thread::wait(100);
sucrelv 0:3b5e97ab5884 127 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 128 Thread::wait(100);
sucrelv 0:3b5e97ab5884 129 myShiftbrite.RGB(0,0,200);
sucrelv 0:3b5e97ab5884 130 Thread::wait(100);
sucrelv 0:3b5e97ab5884 131 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 132 Thread::wait(100);
sucrelv 0:3b5e97ab5884 133 myShiftbrite.RGB(0,0,200);
sucrelv 0:3b5e97ab5884 134 Thread::wait(100);
sucrelv 0:3b5e97ab5884 135 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 136 Thread::wait(100);
sucrelv 0:3b5e97ab5884 137 myShiftbrite.RGB(0,0,200);
sucrelv 0:3b5e97ab5884 138 Thread::wait(100);
sucrelv 0:3b5e97ab5884 139 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 140 Thread::wait(100);
sucrelv 0:3b5e97ab5884 141 myShiftbrite.RGB(0,0,200);
sucrelv 0:3b5e97ab5884 142 Thread::wait(100);
sucrelv 0:3b5e97ab5884 143 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 144 Thread::wait(100);
sucrelv 0:3b5e97ab5884 145 myShiftbrite.RGB(0,0,200);
sucrelv 0:3b5e97ab5884 146 Thread::wait(100);
sucrelv 0:3b5e97ab5884 147 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 148 Thread::wait(100);
sucrelv 0:3b5e97ab5884 149 myShiftbrite.RGB(0,0,200);
sucrelv 0:3b5e97ab5884 150 Thread::wait(100);
sucrelv 0:3b5e97ab5884 151 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 152 Thread::wait(100);
sucrelv 0:3b5e97ab5884 153 myShiftbrite.RGB(0,0,200);
sucrelv 0:3b5e97ab5884 154 Thread::wait(100);
sucrelv 0:3b5e97ab5884 155 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 156 Thread::wait(100);
sucrelv 0:3b5e97ab5884 157 myShiftbrite.RGB(0,0,200);
sucrelv 0:3b5e97ab5884 158 Thread::wait(100);
sucrelv 0:3b5e97ab5884 159 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 160 }
sucrelv 0:3b5e97ab5884 161
sucrelv 0:3b5e97ab5884 162 void GameStartLight(void const *args)
sucrelv 0:3b5e97ab5884 163 {
sucrelv 0:3b5e97ab5884 164
sucrelv 0:3b5e97ab5884 165 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 166 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 167
sucrelv 0:3b5e97ab5884 168 myShiftbrite.RGB(0,200,0);
sucrelv 0:3b5e97ab5884 169 Thread::wait(100);
sucrelv 0:3b5e97ab5884 170 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 171 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 172 Thread::wait(100);
sucrelv 0:3b5e97ab5884 173 myShiftbrite.RGB(0,200,0);
sucrelv 0:3b5e97ab5884 174 Thread::wait(100);
sucrelv 0:3b5e97ab5884 175 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 176 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 177 Thread::wait(100);
sucrelv 0:3b5e97ab5884 178 myShiftbrite.RGB(0,200,0);
sucrelv 0:3b5e97ab5884 179 Thread::wait(100);
sucrelv 0:3b5e97ab5884 180 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 181 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 182 Thread::wait(100);
sucrelv 0:3b5e97ab5884 183 myShiftbrite.RGB(0,200,0);
sucrelv 0:3b5e97ab5884 184 Thread::wait(100);
sucrelv 0:3b5e97ab5884 185 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 186 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 187 Thread::wait(100);
sucrelv 0:3b5e97ab5884 188 myShiftbrite.RGB(0,200,0);
sucrelv 0:3b5e97ab5884 189 Thread::wait(100);
sucrelv 0:3b5e97ab5884 190 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 191 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 192
sucrelv 0:3b5e97ab5884 193 }
sucrelv 0:3b5e97ab5884 194
sucrelv 0:3b5e97ab5884 195 void PlayStartSound()
sucrelv 0:3b5e97ab5884 196 {
sucrelv 0:3b5e97ab5884 197 mySpeaker.PlayNote(500.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 198 mySpeaker.PlayNote(600.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 199 mySpeaker.PlayNote(700.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 200 mySpeaker.PlayNote(800.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 201 mySpeaker.PlayNote(900.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 202 mySpeaker.PlayNote(1000.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 203 mySpeaker.PlayNote(1100.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 204 mySpeaker.PlayNote(1200.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 205 mySpeaker.PlayNote(600.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 206 mySpeaker.PlayNote(700.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 207 mySpeaker.PlayNote(800.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 208 mySpeaker.PlayNote(900.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 209 mySpeaker.PlayNote(1000.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 210 mySpeaker.PlayNote(1100.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 211 mySpeaker.PlayNote(1200.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 212 mySpeaker.PlayNote(1300.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 213 mySpeaker.PlayNote(700.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 214 mySpeaker.PlayNote(800.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 215 mySpeaker.PlayNote(900.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 216 mySpeaker.PlayNote(1000.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 217 mySpeaker.PlayNote(1100.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 218 mySpeaker.PlayNote(1200.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 219 mySpeaker.PlayNote(1300.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 220 mySpeaker.PlayNote(1400.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 221 }
sucrelv 0:3b5e97ab5884 222
sucrelv 0:3b5e97ab5884 223 void PlayOverSound()
sucrelv 0:3b5e97ab5884 224 {
sucrelv 0:3b5e97ab5884 225 mySpeaker.PlayNote(1400.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 226 mySpeaker.PlayNote(1300.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 227 mySpeaker.PlayNote(1200.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 228 mySpeaker.PlayNote(1100.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 229 mySpeaker.PlayNote(1000.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 230 mySpeaker.PlayNote(900.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 231 mySpeaker.PlayNote(800.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 232 mySpeaker.PlayNote(700.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 233 mySpeaker.PlayNote(1300.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 234 mySpeaker.PlayNote(1200.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 235 mySpeaker.PlayNote(1100.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 236 mySpeaker.PlayNote(1000.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 237 mySpeaker.PlayNote(900.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 238 mySpeaker.PlayNote(800.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 239 mySpeaker.PlayNote(700.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 240 mySpeaker.PlayNote(600.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 241 mySpeaker.PlayNote(1200.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 242 mySpeaker.PlayNote(1100.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 243 mySpeaker.PlayNote(1000.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 244 mySpeaker.PlayNote(900.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 245 mySpeaker.PlayNote(800.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 246 mySpeaker.PlayNote(700.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 247 mySpeaker.PlayNote(600.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 248 mySpeaker.PlayNote(500.0,0.05,0.025);
sucrelv 0:3b5e97ab5884 249 }
sucrelv 0:3b5e97ab5884 250
sucrelv 0:3b5e97ab5884 251 void PlayClearSound()
sucrelv 0:3b5e97ab5884 252 {
sucrelv 0:3b5e97ab5884 253 mySpeaker.PlayNote(900.0,0.2,0.025);
sucrelv 0:3b5e97ab5884 254 mySpeaker.PlayNote(1000.0,0.2,0.025);
sucrelv 0:3b5e97ab5884 255 mySpeaker.PlayNote(1100.0,0.2,0.025);
sucrelv 0:3b5e97ab5884 256 mySpeaker.PlayNote(1000.0,0.2,0.025);
sucrelv 0:3b5e97ab5884 257 mySpeaker.PlayNote(9000.0,0.2,0.025);
sucrelv 0:3b5e97ab5884 258 }
sucrelv 0:3b5e97ab5884 259
sucrelv 0:3b5e97ab5884 260 int RandomGen(char range)
sucrelv 0:3b5e97ab5884 261 {
sucrelv 0:3b5e97ab5884 262 pc.printf("%c",range);
sucrelv 0:3b5e97ab5884 263 while(!pc.readable()) wait(0.5);
sucrelv 0:3b5e97ab5884 264 char buffer[4];
sucrelv 0:3b5e97ab5884 265 pc.gets(buffer,4);
sucrelv 0:3b5e97ab5884 266 int i = buffer[0]-'0';
sucrelv 0:3b5e97ab5884 267 return i;
sucrelv 0:3b5e97ab5884 268 }
sucrelv 0:3b5e97ab5884 269
sucrelv 0:3b5e97ab5884 270 int main()
sucrelv 0:3b5e97ab5884 271 {
sucrelv 0:3b5e97ab5884 272 //hardware setup
sucrelv 0:3b5e97ab5884 273 LEFT_KEY.mode(PullUp);
sucrelv 0:3b5e97ab5884 274 RIGHT_KEY.mode(PullUp);
sucrelv 0:3b5e97ab5884 275 ROTATE_KEY.mode(PullUp);
sucrelv 0:3b5e97ab5884 276 DOWN_KEY.mode(PullUp);
sucrelv 0:3b5e97ab5884 277
sucrelv 0:3b5e97ab5884 278 LEFT_KEY.attach_deasserted(&input_left);
sucrelv 0:3b5e97ab5884 279 RIGHT_KEY.attach_deasserted(&input_right);
sucrelv 0:3b5e97ab5884 280 ROTATE_KEY.attach_deasserted(&input_rotate);
sucrelv 0:3b5e97ab5884 281 DOWN_KEY.attach_deasserted(&input_down);
sucrelv 0:3b5e97ab5884 282
sucrelv 0:3b5e97ab5884 283 LEFT_KEY.setSampleFrequency();
sucrelv 0:3b5e97ab5884 284 RIGHT_KEY.setSampleFrequency();
sucrelv 0:3b5e97ab5884 285 ROTATE_KEY.setSampleFrequency();
sucrelv 0:3b5e97ab5884 286 DOWN_KEY.setSampleFrequency();
sucrelv 0:3b5e97ab5884 287 uLCD.baudrate(3000000);
sucrelv 0:3b5e97ab5884 288
sucrelv 0:3b5e97ab5884 289 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 290 myShiftbrite.RGB(0,0,0);
sucrelv 0:3b5e97ab5884 291
sucrelv 0:3b5e97ab5884 292 sd.disk_initialize();
sucrelv 0:3b5e97ab5884 293 uLCD.media_init();
sucrelv 0:3b5e97ab5884 294 uLCD.set_sector_address(0x001D, 0x7801);
sucrelv 0:3b5e97ab5884 295 uLCD.display_image(0,0);
sucrelv 0:3b5e97ab5884 296
sucrelv 0:3b5e97ab5884 297 textLCD.cls();
sucrelv 0:3b5e97ab5884 298 textLCD.locate(0,0);
sucrelv 0:3b5e97ab5884 299 textLCD.printf("Waiting for PC...");
sucrelv 0:3b5e97ab5884 300 pc.baud(9600);
sucrelv 0:3b5e97ab5884 301 pc.format(8,SerialBase::None,1);
sucrelv 0:3b5e97ab5884 302 pc.printf("0");
sucrelv 0:3b5e97ab5884 303 while(!pc.readable()) wait(0.5);
sucrelv 0:3b5e97ab5884 304 char buffer[4];
sucrelv 0:3b5e97ab5884 305 pc.gets(buffer,4);
sucrelv 0:3b5e97ab5884 306
sucrelv 0:3b5e97ab5884 307 //wait for game start
sucrelv 0:3b5e97ab5884 308 textLCD.cls();
sucrelv 0:3b5e97ab5884 309 textLCD.locate(0,0);
sucrelv 0:3b5e97ab5884 310 textLCD.printf("TETRIS READY!!");
sucrelv 0:3b5e97ab5884 311 textLCD.locate(0,1);
sucrelv 0:3b5e97ab5884 312 textLCD.printf("PRESS ANY KEY...");
sucrelv 0:3b5e97ab5884 313 while(!gameStarted) wait(0.5);
sucrelv 0:3b5e97ab5884 314 PlayStartSound();
sucrelv 0:3b5e97ab5884 315 textLCD.cls();
sucrelv 0:3b5e97ab5884 316 textLCD.printf("Starting game now...");
sucrelv 0:3b5e97ab5884 317 wait(2);
sucrelv 0:3b5e97ab5884 318 textLCD.cls();
sucrelv 0:3b5e97ab5884 319 textLCD.locate(0,0);
sucrelv 0:3b5e97ab5884 320 textLCD.printf("Points");
sucrelv 0:3b5e97ab5884 321 textLCD.locate(0,1);
sucrelv 0:3b5e97ab5884 322 textLCD.printf("Cleared Line");
sucrelv 0:3b5e97ab5884 323 Thread t1(GameStartLight);
sucrelv 0:3b5e97ab5884 324 //game classes init
sucrelv 0:3b5e97ab5884 325 bool isGameOver = false;
sucrelv 0:3b5e97ab5884 326 int mScreenHeight = 128;
sucrelv 0:3b5e97ab5884 327 Pieces mPieces;
sucrelv 0:3b5e97ab5884 328 Board mBoard (&mPieces, mScreenHeight);
sucrelv 0:3b5e97ab5884 329 int a = RandomGen('a');
sucrelv 0:3b5e97ab5884 330 int b = RandomGen('b');
sucrelv 0:3b5e97ab5884 331 int c = RandomGen('a');
sucrelv 0:3b5e97ab5884 332 int d = RandomGen('b');
sucrelv 0:3b5e97ab5884 333 Game mGame (&mBoard, &mPieces, mScreenHeight, &uLCD,a,b,c,d);
sucrelv 0:3b5e97ab5884 334
sucrelv 0:3b5e97ab5884 335
sucrelv 0:3b5e97ab5884 336 // ----- Main Loop -----
sucrelv 0:3b5e97ab5884 337 int prevX=0;
sucrelv 0:3b5e97ab5884 338 int prevY=0;
sucrelv 0:3b5e97ab5884 339 int prevPiece=-1;
sucrelv 0:3b5e97ab5884 340 int prevRot=0;
sucrelv 0:3b5e97ab5884 341 Timer timer;
sucrelv 0:3b5e97ab5884 342 timer.start();
sucrelv 0:3b5e97ab5884 343 key_input=0;
sucrelv 0:3b5e97ab5884 344 bool needErase = false;
sucrelv 0:3b5e97ab5884 345 uLCD.cls();
sucrelv 0:3b5e97ab5884 346 while (1)
sucrelv 0:3b5e97ab5884 347 {
sucrelv 0:3b5e97ab5884 348 if(isGameOver)
sucrelv 0:3b5e97ab5884 349 {
sucrelv 0:3b5e97ab5884 350 wait(1);
sucrelv 0:3b5e97ab5884 351 continue;
sucrelv 0:3b5e97ab5884 352 }
sucrelv 0:3b5e97ab5884 353 // ----- Draw ----
sucrelv 0:3b5e97ab5884 354 if(needErase)
sucrelv 0:3b5e97ab5884 355 {
sucrelv 0:3b5e97ab5884 356 mGame.ErasePiece(prevX,prevY,prevPiece,prevRot);
sucrelv 0:3b5e97ab5884 357 needErase=false;
sucrelv 0:3b5e97ab5884 358 }
sucrelv 0:3b5e97ab5884 359 mGame.DrawScene();
sucrelv 0:3b5e97ab5884 360
sucrelv 0:3b5e97ab5884 361 prevX=mGame.mPosX;
sucrelv 0:3b5e97ab5884 362 prevY=mGame.mPosY;
sucrelv 0:3b5e97ab5884 363 prevPiece=mGame.mPiece;
sucrelv 0:3b5e97ab5884 364 prevRot=mGame.mRotation;
sucrelv 0:3b5e97ab5884 365
sucrelv 0:3b5e97ab5884 366 // ----- Input -----
sucrelv 0:3b5e97ab5884 367 switch (key_input)
sucrelv 0:3b5e97ab5884 368 {
sucrelv 0:3b5e97ab5884 369 case (2): //right
sucrelv 0:3b5e97ab5884 370 {
sucrelv 0:3b5e97ab5884 371 if (mBoard.IsPossibleMovement (mGame.mPosX + 1, mGame.mPosY, mGame.mPiece, mGame.mRotation))
sucrelv 0:3b5e97ab5884 372 {mGame.mPosX++;needErase=true;}
sucrelv 0:3b5e97ab5884 373 break;
sucrelv 0:3b5e97ab5884 374 }
sucrelv 0:3b5e97ab5884 375
sucrelv 0:3b5e97ab5884 376 case (1): //left
sucrelv 0:3b5e97ab5884 377 {
sucrelv 0:3b5e97ab5884 378 if (mBoard.IsPossibleMovement (mGame.mPosX - 1, mGame.mPosY, mGame.mPiece, mGame.mRotation))
sucrelv 0:3b5e97ab5884 379 {mGame.mPosX--;needErase=true;}
sucrelv 0:3b5e97ab5884 380 break;
sucrelv 0:3b5e97ab5884 381 }
sucrelv 0:3b5e97ab5884 382
sucrelv 0:3b5e97ab5884 383 case (4)://down
sucrelv 0:3b5e97ab5884 384 {
sucrelv 0:3b5e97ab5884 385 // Check collision from up to down
sucrelv 0:3b5e97ab5884 386 while (mBoard.IsPossibleMovement(mGame.mPosX, mGame.mPosY, mGame.mPiece, mGame.mRotation)) { mGame.mPosY++; }
sucrelv 0:3b5e97ab5884 387 needErase=true;
sucrelv 0:3b5e97ab5884 388 mBoard.StorePiece (mGame.mPosX, mGame.mPosY - 1, mGame.mPiece, mGame.mRotation);
sucrelv 0:3b5e97ab5884 389 mGame.AddPoints(SinglePiecePoints);
sucrelv 0:3b5e97ab5884 390 int linesDeleted = mBoard.DeletePossibleLines ();
sucrelv 0:3b5e97ab5884 391 if(linesDeleted>0)
sucrelv 0:3b5e97ab5884 392 {
sucrelv 0:3b5e97ab5884 393 mGame.AddClearedLines(linesDeleted);
sucrelv 0:3b5e97ab5884 394 mGame.AddPoints(LineClearPoints*linesDeleted);
sucrelv 0:3b5e97ab5884 395 Thread t1(FlashLight);
sucrelv 0:3b5e97ab5884 396 PlayClearSound();
sucrelv 0:3b5e97ab5884 397 clear_board();
sucrelv 0:3b5e97ab5884 398 }
sucrelv 0:3b5e97ab5884 399 UpdateGameStatus(mGame.GetPoints(),mGame.GetClearedLines());
sucrelv 0:3b5e97ab5884 400
sucrelv 0:3b5e97ab5884 401 if (mBoard.IsGameOver())
sucrelv 0:3b5e97ab5884 402 {
sucrelv 0:3b5e97ab5884 403 isGameOver=true;
sucrelv 0:3b5e97ab5884 404 uLCD.cls();
sucrelv 0:3b5e97ab5884 405 uLCD.media_init();
sucrelv 0:3b5e97ab5884 406 uLCD.set_sector_address(0x001D, 0x7842);
sucrelv 0:3b5e97ab5884 407 uLCD.display_image(0,0);
sucrelv 0:3b5e97ab5884 408 Thread t2(GameOverLight);
sucrelv 0:3b5e97ab5884 409 PlayOverSound();
sucrelv 0:3b5e97ab5884 410
sucrelv 0:3b5e97ab5884 411 }
sucrelv 0:3b5e97ab5884 412
sucrelv 0:3b5e97ab5884 413 if(!isGameOver)
sucrelv 0:3b5e97ab5884 414 {
sucrelv 0:3b5e97ab5884 415 mGame.CreateNewPiece(RandomGen('a'),RandomGen('b'));
sucrelv 0:3b5e97ab5884 416 clear_next_piece();
sucrelv 0:3b5e97ab5884 417 }
sucrelv 0:3b5e97ab5884 418 break;
sucrelv 0:3b5e97ab5884 419 }
sucrelv 0:3b5e97ab5884 420
sucrelv 0:3b5e97ab5884 421 case (3)://rotate
sucrelv 0:3b5e97ab5884 422 {
sucrelv 0:3b5e97ab5884 423 if (mBoard.IsPossibleMovement (mGame.mPosX, mGame.mPosY, mGame.mPiece, (mGame.mRotation + 1) % 4))
sucrelv 0:3b5e97ab5884 424 {mGame.mRotation = (mGame.mRotation + 1) % 4;needErase=true;}
sucrelv 0:3b5e97ab5884 425 break;
sucrelv 0:3b5e97ab5884 426 }
sucrelv 0:3b5e97ab5884 427
sucrelv 0:3b5e97ab5884 428 case (0):{break;}
sucrelv 0:3b5e97ab5884 429 }
sucrelv 0:3b5e97ab5884 430 key_input = 0;
sucrelv 0:3b5e97ab5884 431
sucrelv 0:3b5e97ab5884 432 // ----- Vertical movement -----
sucrelv 0:3b5e97ab5884 433
sucrelv 0:3b5e97ab5884 434 if(timer.read_ms()>WAIT_TIME)
sucrelv 0:3b5e97ab5884 435 {
sucrelv 0:3b5e97ab5884 436 needErase=true;
sucrelv 0:3b5e97ab5884 437 if(!isGameOver)
sucrelv 0:3b5e97ab5884 438 {
sucrelv 0:3b5e97ab5884 439 if (mBoard.IsPossibleMovement (mGame.mPosX, mGame.mPosY + 1, mGame.mPiece, mGame.mRotation))
sucrelv 0:3b5e97ab5884 440 {
sucrelv 0:3b5e97ab5884 441 mGame.mPosY++;
sucrelv 0:3b5e97ab5884 442 }
sucrelv 0:3b5e97ab5884 443 else
sucrelv 0:3b5e97ab5884 444 {
sucrelv 0:3b5e97ab5884 445 mBoard.StorePiece (mGame.mPosX, mGame.mPosY, mGame.mPiece, mGame.mRotation);
sucrelv 0:3b5e97ab5884 446 mGame.AddPoints(SinglePiecePoints);
sucrelv 0:3b5e97ab5884 447 int linesDeleted = mBoard.DeletePossibleLines ();
sucrelv 0:3b5e97ab5884 448 if(linesDeleted>0)
sucrelv 0:3b5e97ab5884 449 {
sucrelv 0:3b5e97ab5884 450 mGame.AddClearedLines(linesDeleted);
sucrelv 0:3b5e97ab5884 451 mGame.AddPoints(LineClearPoints*linesDeleted);
sucrelv 0:3b5e97ab5884 452 Thread t1(FlashLight);
sucrelv 0:3b5e97ab5884 453 PlayClearSound();
sucrelv 0:3b5e97ab5884 454 clear_board();
sucrelv 0:3b5e97ab5884 455 }
sucrelv 0:3b5e97ab5884 456 UpdateGameStatus(mGame.GetPoints(),mGame.GetClearedLines());
sucrelv 0:3b5e97ab5884 457
sucrelv 0:3b5e97ab5884 458 if (mBoard.IsGameOver())
sucrelv 0:3b5e97ab5884 459 {
sucrelv 0:3b5e97ab5884 460 isGameOver=true;
sucrelv 0:3b5e97ab5884 461 uLCD.cls();
sucrelv 0:3b5e97ab5884 462 uLCD.media_init();
sucrelv 0:3b5e97ab5884 463 uLCD.set_sector_address(0x001D, 0x7842);
sucrelv 0:3b5e97ab5884 464 uLCD.display_image(0,0);
sucrelv 0:3b5e97ab5884 465 Thread t2(GameOverLight);
sucrelv 0:3b5e97ab5884 466 PlayOverSound();
sucrelv 0:3b5e97ab5884 467 }
sucrelv 0:3b5e97ab5884 468
sucrelv 0:3b5e97ab5884 469 if(!isGameOver)
sucrelv 0:3b5e97ab5884 470 {
sucrelv 0:3b5e97ab5884 471 mGame.CreateNewPiece(RandomGen('a'),RandomGen('b'));
sucrelv 0:3b5e97ab5884 472 clear_next_piece();
sucrelv 0:3b5e97ab5884 473 }
sucrelv 0:3b5e97ab5884 474 }
sucrelv 0:3b5e97ab5884 475 }
sucrelv 0:3b5e97ab5884 476 timer.reset();
sucrelv 0:3b5e97ab5884 477 }
sucrelv 0:3b5e97ab5884 478 wait(0.1);
sucrelv 0:3b5e97ab5884 479 }
sucrelv 0:3b5e97ab5884 480 }