Dependencies:   N5110 mbed

Committer:
el14kb
Date:
Sat May 07 14:36:03 2016 +0000
Revision:
2:dc75e15229ee
Parent:
1:7da5b36d5f50
Game doesn't work entirely, but it's a 'form' of Tetris.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el14kb 1:7da5b36d5f50 1 #include "mbed.h"
el14kb 1:7da5b36d5f50 2 #include "N5110.h"
el14kb 2:dc75e15229ee 3 #include "Pieces.h"
el14kb 2:dc75e15229ee 4 #include <vector>
el14kb 2:dc75e15229ee 5
el14kb 1:7da5b36d5f50 6
el14kb 1:7da5b36d5f50 7 //Tetris by Kristian Bridges
el14kb 1:7da5b36d5f50 8
el14kb 1:7da5b36d5f50 9 // VCC, SCE, RST, D/C, MOSI, SCLK, LED
el14kb 1:7da5b36d5f50 10 N5110 lcd (PTE26 , PTA0 , PTC4 , PTD0 , PTD2 , PTD1 , PTC3);
el14kb 1:7da5b36d5f50 11
el14kb 1:7da5b36d5f50 12 AnalogIn potX(PTB2);
el14kb 1:7da5b36d5f50 13 AnalogIn potY(PTB3);
el14kb 1:7da5b36d5f50 14 DigitalIn joyButton(PTB11);
el14kb 2:dc75e15229ee 15 DigitalIn buttonA(PTB18);
el14kb 2:dc75e15229ee 16 DigitalIn buttonB(PTB19);
el14kb 2:dc75e15229ee 17 InterruptIn A(PTB18);
el14kb 2:dc75e15229ee 18 InterruptIn B(PTB19);
el14kb 1:7da5b36d5f50 19
el14kb 2:dc75e15229ee 20 #define tolerance 0.1f
el14kb 2:dc75e15229ee 21 #define down_tolerance -0.1f
el14kb 2:dc75e15229ee 22 #define right_tolerance -0.1f
el14kb 1:7da5b36d5f50 23
el14kb 1:7da5b36d5f50 24 Ticker checkJoy;
el14kb 2:dc75e15229ee 25 Ticker gameCheck;
el14kb 1:7da5b36d5f50 26
el14kb 1:7da5b36d5f50 27 enum direction_t {
el14kb 1:7da5b36d5f50 28 UP, //0
el14kb 1:7da5b36d5f50 29 DOWN, //1
el14kb 1:7da5b36d5f50 30 LEFT, //2
el14kb 1:7da5b36d5f50 31 RIGHT, //3
el14kb 1:7da5b36d5f50 32 CENTRE, //4
el14kb 1:7da5b36d5f50 33 UNKNOWN //5
el14kb 1:7da5b36d5f50 34 };
el14kb 1:7da5b36d5f50 35
el14kb 1:7da5b36d5f50 36 typedef struct {
el14kb 1:7da5b36d5f50 37 float initial_x,initial_y;
el14kb 1:7da5b36d5f50 38 float current_x,current_y;
el14kb 1:7da5b36d5f50 39 int button;
el14kb 1:7da5b36d5f50 40 direction_t direction;
el14kb 2:dc75e15229ee 41 int buttonA;
el14kb 2:dc75e15229ee 42 int buttonB;
el14kb 1:7da5b36d5f50 43 } joystick;
el14kb 1:7da5b36d5f50 44
el14kb 1:7da5b36d5f50 45 joystick joy;
el14kb 2:dc75e15229ee 46 joystick rotate_buttons;
el14kb 1:7da5b36d5f50 47
el14kb 2:dc75e15229ee 48 struct Tetris {
el14kb 2:dc75e15229ee 49 int xP; //current x position
el14kb 2:dc75e15229ee 50 int yP; //current y position
el14kb 2:dc75e15229ee 51 int next_xP; //next potential x position
el14kb 2:dc75e15229ee 52 int next_yP; //next potential y position
el14kb 2:dc75e15229ee 53 int level;
el14kb 2:dc75e15229ee 54 int line_check;
el14kb 2:dc75e15229ee 55 int total_lines;
el14kb 2:dc75e15229ee 56 int current_shape;
el14kb 2:dc75e15229ee 57 int piece_in_play;
el14kb 2:dc75e15229ee 58 int orientation;
el14kb 2:dc75e15229ee 59 int score;
el14kb 2:dc75e15229ee 60 int game_over;
el14kb 2:dc75e15229ee 61 int orientation_copy;
el14kb 2:dc75e15229ee 62 int currentPiece[10][10];
el14kb 2:dc75e15229ee 63 } tetris;
el14kb 2:dc75e15229ee 64
el14kb 2:dc75e15229ee 65 int g_bank_index = 0;
el14kb 2:dc75e15229ee 66 int g_bank_index_copy = 4;
el14kb 1:7da5b36d5f50 67 volatile int g_joyFlag = 0;
el14kb 2:dc75e15229ee 68 volatile int g_rotate_clock_flag = 0;
el14kb 2:dc75e15229ee 69 volatile int g_rotate_anticlock_flag = 0;
el14kb 2:dc75e15229ee 70 int currentState[45][40];
el14kb 2:dc75e15229ee 71 volatile int g_call_game_Flag = 0;
el14kb 2:dc75e15229ee 72 float timer = 1.0;
el14kb 1:7da5b36d5f50 73
el14kb 1:7da5b36d5f50 74 void menu();
el14kb 2:dc75e15229ee 75 void cal();
el14kb 1:7da5b36d5f50 76 void joyUpdate();
el14kb 1:7da5b36d5f50 77 void game();
el14kb 1:7da5b36d5f50 78 void options();
el14kb 2:dc75e15229ee 79 void orientation();
el14kb 2:dc75e15229ee 80 void draw_piece();
el14kb 2:dc75e15229ee 81 void array_checker();
el14kb 2:dc75e15229ee 82 void piece_generator();
el14kb 2:dc75e15229ee 83 void anticlockwise();
el14kb 2:dc75e15229ee 84 void clockwise();
el14kb 2:dc75e15229ee 85 void gameCheck_isr();
el14kb 1:7da5b36d5f50 86
el14kb 1:7da5b36d5f50 87 int main()
el14kb 1:7da5b36d5f50 88 {
el14kb 1:7da5b36d5f50 89 lcd.init();
el14kb 1:7da5b36d5f50 90 lcd.clear();
el14kb 1:7da5b36d5f50 91 lcd.printString("Tetris",24,1);
el14kb 1:7da5b36d5f50 92 lcd.printString("by",36,2);
el14kb 1:7da5b36d5f50 93 lcd.printString("K.Bridges",15,3);
el14kb 1:7da5b36d5f50 94 lcd.printString("SID: 200859491",0,5);
el14kb 1:7da5b36d5f50 95 wait(2);
el14kb 1:7da5b36d5f50 96 lcd.clear();
el14kb 2:dc75e15229ee 97 cal();
el14kb 1:7da5b36d5f50 98 checkJoy.attach(&joyUpdate,0.01);
el14kb 1:7da5b36d5f50 99 menu();
el14kb 1:7da5b36d5f50 100 }
el14kb 1:7da5b36d5f50 101
el14kb 2:dc75e15229ee 102 void drawPiece()
el14kb 1:7da5b36d5f50 103 {
el14kb 1:7da5b36d5f50 104
el14kb 2:dc75e15229ee 105 }
el14kb 2:dc75e15229ee 106 void menu()
el14kb 2:dc75e15229ee 107 {
el14kb 1:7da5b36d5f50 108 int x,y;
el14kb 1:7da5b36d5f50 109
el14kb 1:7da5b36d5f50 110 while(joy.button == 0) {
el14kb 1:7da5b36d5f50 111 if(g_joyFlag) {
el14kb 1:7da5b36d5f50 112 g_joyFlag = 0;
el14kb 1:7da5b36d5f50 113
el14kb 1:7da5b36d5f50 114 switch(joy.direction) {
el14kb 1:7da5b36d5f50 115 case UP:
el14kb 1:7da5b36d5f50 116 if(g_bank_index == 0) {
el14kb 1:7da5b36d5f50 117 g_bank_index = 2;
el14kb 1:7da5b36d5f50 118 break;
el14kb 1:7da5b36d5f50 119 } else
el14kb 1:7da5b36d5f50 120 g_bank_index--;
el14kb 1:7da5b36d5f50 121 break;
el14kb 1:7da5b36d5f50 122 case DOWN:
el14kb 1:7da5b36d5f50 123 if(g_bank_index == 2) {
el14kb 1:7da5b36d5f50 124 g_bank_index = 0;
el14kb 1:7da5b36d5f50 125 } else
el14kb 1:7da5b36d5f50 126 g_bank_index++;
el14kb 1:7da5b36d5f50 127 }
el14kb 2:dc75e15229ee 128
el14kb 2:dc75e15229ee 129 if(g_bank_index_copy != g_bank_index) {
el14kb 2:dc75e15229ee 130 g_bank_index_copy = g_bank_index;
el14kb 2:dc75e15229ee 131
el14kb 2:dc75e15229ee 132 if(g_bank_index == 0) {
el14kb 2:dc75e15229ee 133
el14kb 2:dc75e15229ee 134 lcd.clear();
el14kb 2:dc75e15229ee 135 lcd.printString("New Game",18,1);
el14kb 2:dc75e15229ee 136 lcd.printString("Achievements",6,2);
el14kb 2:dc75e15229ee 137 lcd.printString("Options",21,3);
el14kb 2:dc75e15229ee 138
el14kb 2:dc75e15229ee 139 for(x=0; x<WIDTH; x++) {
el14kb 2:dc75e15229ee 140 for(y=7; y<16; y++) {
el14kb 2:dc75e15229ee 141 if(lcd.getPixel(x,y)) {
el14kb 2:dc75e15229ee 142 lcd.clearPixel(x,y);
el14kb 2:dc75e15229ee 143 } else {
el14kb 2:dc75e15229ee 144 lcd.setPixel(x,y);
el14kb 2:dc75e15229ee 145 }
el14kb 1:7da5b36d5f50 146 }
el14kb 1:7da5b36d5f50 147 }
el14kb 1:7da5b36d5f50 148 }
el14kb 2:dc75e15229ee 149 if(g_bank_index == 1) {
el14kb 2:dc75e15229ee 150
el14kb 2:dc75e15229ee 151 lcd.clear();
el14kb 2:dc75e15229ee 152 lcd.printString("New Game",18,1);
el14kb 2:dc75e15229ee 153 lcd.printString("Achievements",6,2);
el14kb 2:dc75e15229ee 154 lcd.printString("Options",21,3);
el14kb 2:dc75e15229ee 155
el14kb 2:dc75e15229ee 156 for(x=0; x<WIDTH; x++) {
el14kb 2:dc75e15229ee 157 for(y=15; y<24; y++) {
el14kb 2:dc75e15229ee 158 if(lcd.getPixel(x,y)) {
el14kb 2:dc75e15229ee 159 lcd.clearPixel(x,y);
el14kb 2:dc75e15229ee 160 } else {
el14kb 2:dc75e15229ee 161 lcd.setPixel(x,y);
el14kb 2:dc75e15229ee 162 }
el14kb 1:7da5b36d5f50 163 }
el14kb 1:7da5b36d5f50 164 }
el14kb 1:7da5b36d5f50 165 }
el14kb 2:dc75e15229ee 166 if(g_bank_index == 2) {
el14kb 2:dc75e15229ee 167
el14kb 2:dc75e15229ee 168 lcd.clear();
el14kb 2:dc75e15229ee 169 lcd.printString("New Game",18,1);
el14kb 2:dc75e15229ee 170 lcd.printString("Achievements",6,2);
el14kb 2:dc75e15229ee 171 lcd.printString("Options",21,3);
el14kb 2:dc75e15229ee 172
el14kb 2:dc75e15229ee 173 for(x=0; x<WIDTH; x++) {
el14kb 2:dc75e15229ee 174 for(y=23; y<32; y++) {
el14kb 2:dc75e15229ee 175 if(lcd.getPixel(x,y)) {
el14kb 2:dc75e15229ee 176 lcd.clearPixel(x,y);
el14kb 2:dc75e15229ee 177 } else {
el14kb 2:dc75e15229ee 178 lcd.setPixel(x,y);
el14kb 2:dc75e15229ee 179 }
el14kb 1:7da5b36d5f50 180 }
el14kb 1:7da5b36d5f50 181 }
el14kb 1:7da5b36d5f50 182 }
el14kb 2:dc75e15229ee 183 lcd.refresh();
el14kb 2:dc75e15229ee 184 } else if(g_bank_index_copy == g_bank_index) {
el14kb 2:dc75e15229ee 185 sleep();
el14kb 1:7da5b36d5f50 186 }
el14kb 1:7da5b36d5f50 187 }
el14kb 1:7da5b36d5f50 188 }//end of while loop
el14kb 1:7da5b36d5f50 189
el14kb 2:dc75e15229ee 190 if(g_bank_index == 0) {
el14kb 2:dc75e15229ee 191 lcd.clear();
el14kb 2:dc75e15229ee 192 game();
el14kb 2:dc75e15229ee 193 } else if(g_bank_index == 1) {
el14kb 2:dc75e15229ee 194 lcd.clear();
el14kb 2:dc75e15229ee 195 } else if(g_bank_index == 2) {
el14kb 2:dc75e15229ee 196 lcd.clear();
el14kb 2:dc75e15229ee 197 options();
el14kb 2:dc75e15229ee 198 }
el14kb 1:7da5b36d5f50 199 }//end of function
el14kb 1:7da5b36d5f50 200
el14kb 2:dc75e15229ee 201 void cal()
el14kb 1:7da5b36d5f50 202 {
el14kb 1:7da5b36d5f50 203 joy.initial_x = potX;
el14kb 1:7da5b36d5f50 204 joy.initial_y = potY;
el14kb 1:7da5b36d5f50 205 joyButton.mode(PullDown);
el14kb 2:dc75e15229ee 206 buttonA.mode(PullDown); //1 if pressed
el14kb 2:dc75e15229ee 207 buttonB.mode(PullDown); //1 if pressed
el14kb 2:dc75e15229ee 208 A.fall(&anticlockwise);
el14kb 2:dc75e15229ee 209 B.fall(&clockwise);
el14kb 1:7da5b36d5f50 210 }
el14kb 1:7da5b36d5f50 211
el14kb 1:7da5b36d5f50 212 void joyUpdate()
el14kb 1:7da5b36d5f50 213 {
el14kb 1:7da5b36d5f50 214 joy.current_x = potX - joy.initial_x; //current x-position
el14kb 1:7da5b36d5f50 215 joy.current_y = potY - joy.initial_y; //current y-position
el14kb 1:7da5b36d5f50 216 joy.button = joyButton; //current button state
el14kb 2:dc75e15229ee 217 rotate_buttons.buttonA = buttonA; //current anti-clockwise state
el14kb 2:dc75e15229ee 218 rotate_buttons.buttonB = buttonB; //current clockwise state
el14kb 1:7da5b36d5f50 219
el14kb 1:7da5b36d5f50 220 if((joy.current_y) > tolerance && fabs(joy.current_x) < tolerance) { //fabs returns an absolute value
el14kb 1:7da5b36d5f50 221 joy.direction = UP;
el14kb 1:7da5b36d5f50 222 } else if((joy.current_y) < down_tolerance && fabs(joy.current_x) < tolerance) {
el14kb 1:7da5b36d5f50 223 joy.direction = DOWN;
el14kb 1:7da5b36d5f50 224 } else if((joy.current_x) > tolerance && fabs(joy.current_y) < tolerance) {
el14kb 1:7da5b36d5f50 225 joy.direction = LEFT;
el14kb 2:dc75e15229ee 226 } else if((joy.current_x) < right_tolerance && fabs(joy.current_y) < tolerance) {
el14kb 1:7da5b36d5f50 227 joy.direction = RIGHT;
el14kb 1:7da5b36d5f50 228 } else if(fabs(joy.current_x) < tolerance && fabs(joy.current_y) < tolerance) {
el14kb 1:7da5b36d5f50 229 joy.direction = CENTRE;
el14kb 1:7da5b36d5f50 230 } else
el14kb 1:7da5b36d5f50 231 joy.direction = UNKNOWN;
el14kb 1:7da5b36d5f50 232 g_joyFlag = 1;
el14kb 1:7da5b36d5f50 233 }
el14kb 2:dc75e15229ee 234 void piece_generator()
el14kb 1:7da5b36d5f50 235 {
el14kb 2:dc75e15229ee 236
el14kb 2:dc75e15229ee 237 if(tetris.piece_in_play == 0) { //initialisation of a piece in play
el14kb 2:dc75e15229ee 238 tetris.current_shape = rand() %7;
el14kb 2:dc75e15229ee 239 tetris.xP = rand() % 39 + 0; //39 is the least significant x position (xP is the current position of the piece)
el14kb 2:dc75e15229ee 240 tetris.yP = -5; //change if collision rules check out (yP is the current position of the piece)
el14kb 2:dc75e15229ee 241 tetris.orientation = 0;
el14kb 2:dc75e15229ee 242 tetris.piece_in_play = 1; //defines whether a piece is in play
el14kb 1:7da5b36d5f50 243 }
el14kb 1:7da5b36d5f50 244 }
el14kb 1:7da5b36d5f50 245
el14kb 1:7da5b36d5f50 246 void game()
el14kb 1:7da5b36d5f50 247 {
el14kb 2:dc75e15229ee 248 tetris.orientation_copy = 5;
el14kb 2:dc75e15229ee 249 tetris.game_over = 0;
el14kb 2:dc75e15229ee 250 lcd.printString("Score:",0,1);
el14kb 2:dc75e15229ee 251 lcd.printString("Lines:",0,4);
el14kb 2:dc75e15229ee 252 lcd.drawRect(38,0,42,47,0);
el14kb 2:dc75e15229ee 253 srand(time(NULL));
el14kb 2:dc75e15229ee 254 for(int y = 0; y<45; y++) {
el14kb 2:dc75e15229ee 255 for(int x = 0; x<40; x++) {
el14kb 2:dc75e15229ee 256 if(y == 44) {
el14kb 2:dc75e15229ee 257 currentState[y][x] = 1;
el14kb 2:dc75e15229ee 258 } else
el14kb 2:dc75e15229ee 259 currentState[y][x] = 0;
el14kb 2:dc75e15229ee 260 }
el14kb 2:dc75e15229ee 261 }
el14kb 2:dc75e15229ee 262
el14kb 2:dc75e15229ee 263 gameCheck.attach(&gameCheck_isr,timer);
el14kb 2:dc75e15229ee 264 while(tetris.game_over == 0) {
el14kb 2:dc75e15229ee 265 if(joy.direction == UP) {
el14kb 2:dc75e15229ee 266 timer = 0.01;
el14kb 2:dc75e15229ee 267 } else timer = 0.1;
el14kb 1:7da5b36d5f50 268
el14kb 2:dc75e15229ee 269 if(g_call_game_Flag == 1) {
el14kb 2:dc75e15229ee 270 piece_generator();
el14kb 2:dc75e15229ee 271 orientation();
el14kb 2:dc75e15229ee 272 draw_piece();
el14kb 2:dc75e15229ee 273 for(int y=0; y<45; y++) {
el14kb 2:dc75e15229ee 274 for(int x=0; x<40; x++) {
el14kb 2:dc75e15229ee 275 if(currentState[y][x] == 1) {
el14kb 2:dc75e15229ee 276 lcd.setPixel(x+39,y+1);
el14kb 2:dc75e15229ee 277 } else
el14kb 2:dc75e15229ee 278 lcd.clearPixel(x+39,y+1);
el14kb 2:dc75e15229ee 279 }
el14kb 2:dc75e15229ee 280 }
el14kb 2:dc75e15229ee 281
el14kb 2:dc75e15229ee 282 for(int m = 0; m<10; m++) {
el14kb 2:dc75e15229ee 283 for(int n = 0; n<10; n++) {
el14kb 2:dc75e15229ee 284 if(tetris.currentPiece[m][n] == 1) {
el14kb 2:dc75e15229ee 285 lcd.setPixel(tetris.xP+n+39,tetris.yP+m+1);
el14kb 2:dc75e15229ee 286 }
el14kb 2:dc75e15229ee 287 }
el14kb 2:dc75e15229ee 288 }
el14kb 2:dc75e15229ee 289
el14kb 2:dc75e15229ee 290 lcd.refresh();
el14kb 2:dc75e15229ee 291 array_checker();
el14kb 2:dc75e15229ee 292 }
el14kb 2:dc75e15229ee 293 sleep();
el14kb 2:dc75e15229ee 294 }
el14kb 2:dc75e15229ee 295 gameCheck.detach();
el14kb 2:dc75e15229ee 296 lcd.clear();
el14kb 2:dc75e15229ee 297 lcd.printString("Game Over",15,2);
el14kb 2:dc75e15229ee 298 wait(1);
el14kb 2:dc75e15229ee 299 lcd.clear();
el14kb 2:dc75e15229ee 300 menu();
el14kb 1:7da5b36d5f50 301 }
el14kb 1:7da5b36d5f50 302
el14kb 1:7da5b36d5f50 303 void options()
el14kb 1:7da5b36d5f50 304 {
el14kb 2:dc75e15229ee 305 float brightness = 0.5;
el14kb 2:dc75e15229ee 306
el14kb 2:dc75e15229ee 307 lcd.printString("UP = +",24,0);
el14kb 2:dc75e15229ee 308 lcd.printString("DOWN = -",18,1);
el14kb 2:dc75e15229ee 309 lcd.printString("Press B",24,2);
el14kb 2:dc75e15229ee 310 lcd.printString("to exit",21,3);
el14kb 2:dc75e15229ee 311
el14kb 2:dc75e15229ee 312 while(joy.button == 0) {
el14kb 2:dc75e15229ee 313 if(joy.direction == UP) {
el14kb 2:dc75e15229ee 314 brightness += 0.1f;
el14kb 2:dc75e15229ee 315 lcd.setBrightness(brightness);
el14kb 2:dc75e15229ee 316 } else if(joy.direction == DOWN) {
el14kb 2:dc75e15229ee 317 brightness -= 0.1f;
el14kb 2:dc75e15229ee 318 lcd.setBrightness(brightness);
el14kb 2:dc75e15229ee 319 }
el14kb 2:dc75e15229ee 320 }
el14kb 2:dc75e15229ee 321 lcd.clear();
el14kb 2:dc75e15229ee 322 menu();
el14kb 1:7da5b36d5f50 323 }
el14kb 2:dc75e15229ee 324
el14kb 2:dc75e15229ee 325
el14kb 2:dc75e15229ee 326 void orientation()
el14kb 2:dc75e15229ee 327 {
el14kb 2:dc75e15229ee 328
el14kb 2:dc75e15229ee 329
el14kb 2:dc75e15229ee 330 if(g_rotate_clock_flag == 1) {
el14kb 2:dc75e15229ee 331 g_rotate_clock_flag = 0;
el14kb 2:dc75e15229ee 332 if(tetris.orientation == 3) {
el14kb 2:dc75e15229ee 333 tetris.orientation = 0;
el14kb 2:dc75e15229ee 334 } else if(tetris.orientation == 0) {
el14kb 2:dc75e15229ee 335 tetris.orientation++;
el14kb 2:dc75e15229ee 336 }
el14kb 2:dc75e15229ee 337 }
el14kb 2:dc75e15229ee 338
el14kb 2:dc75e15229ee 339 if(g_rotate_anticlock_flag == 1) {
el14kb 2:dc75e15229ee 340 g_rotate_anticlock_flag = 0;
el14kb 2:dc75e15229ee 341 if(tetris.orientation == 0) {
el14kb 2:dc75e15229ee 342 tetris.orientation = 3;
el14kb 2:dc75e15229ee 343 } else if(tetris.orientation == 3) {
el14kb 2:dc75e15229ee 344 tetris.orientation--;
el14kb 2:dc75e15229ee 345 }
el14kb 2:dc75e15229ee 346 }
el14kb 2:dc75e15229ee 347 if(tetris.orientation_copy != tetris.orientation) {
el14kb 2:dc75e15229ee 348 tetris.orientation_copy = tetris.orientation;
el14kb 2:dc75e15229ee 349
el14kb 2:dc75e15229ee 350 if(tetris.current_shape == 0) { //Square
el14kb 2:dc75e15229ee 351 if(tetris.orientation == 0 || 1 || 2 || 3) {
el14kb 2:dc75e15229ee 352 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 353 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 354 tetris.currentPiece[m][n] = O[m][n];
el14kb 2:dc75e15229ee 355 }
el14kb 2:dc75e15229ee 356 }
el14kb 2:dc75e15229ee 357 }
el14kb 2:dc75e15229ee 358 }
el14kb 2:dc75e15229ee 359
el14kb 2:dc75e15229ee 360 if(tetris.current_shape == 1) { //I
el14kb 2:dc75e15229ee 361 if(tetris.orientation == 0) {
el14kb 2:dc75e15229ee 362 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 363 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 364 tetris.currentPiece[m][n] = I0[m][n];
el14kb 2:dc75e15229ee 365 }
el14kb 2:dc75e15229ee 366 }
el14kb 2:dc75e15229ee 367 }
el14kb 2:dc75e15229ee 368 if(tetris.orientation == 1) {
el14kb 2:dc75e15229ee 369 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 370 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 371 tetris.currentPiece[m][n] = I90[m][n];
el14kb 2:dc75e15229ee 372 }
el14kb 2:dc75e15229ee 373 }
el14kb 2:dc75e15229ee 374 }
el14kb 2:dc75e15229ee 375 if(tetris.orientation == 2) {
el14kb 2:dc75e15229ee 376 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 377 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 378 tetris.currentPiece[m][n] = I180[m][n];
el14kb 2:dc75e15229ee 379 }
el14kb 2:dc75e15229ee 380 }
el14kb 2:dc75e15229ee 381 }
el14kb 2:dc75e15229ee 382 if(tetris.orientation == 3) {
el14kb 2:dc75e15229ee 383 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 384 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 385 tetris.currentPiece[m][n] = I270[m][n];
el14kb 2:dc75e15229ee 386 }
el14kb 2:dc75e15229ee 387 }
el14kb 2:dc75e15229ee 388 }
el14kb 2:dc75e15229ee 389 }
el14kb 2:dc75e15229ee 390
el14kb 2:dc75e15229ee 391 if(tetris.current_shape == 2) { //L
el14kb 2:dc75e15229ee 392 if(tetris.orientation == 0) {
el14kb 2:dc75e15229ee 393 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 394 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 395 tetris.currentPiece[m][n] = L0[m][n];
el14kb 2:dc75e15229ee 396 }
el14kb 2:dc75e15229ee 397 }
el14kb 2:dc75e15229ee 398 }
el14kb 2:dc75e15229ee 399 if(tetris.orientation == 1) {
el14kb 2:dc75e15229ee 400 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 401 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 402 tetris.currentPiece[m][n] = L90[m][n];
el14kb 2:dc75e15229ee 403 }
el14kb 2:dc75e15229ee 404 }
el14kb 2:dc75e15229ee 405 }
el14kb 2:dc75e15229ee 406 if(tetris.orientation == 2) {
el14kb 2:dc75e15229ee 407 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 408 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 409 tetris.currentPiece[m][n] = L180[m][n];
el14kb 2:dc75e15229ee 410 }
el14kb 2:dc75e15229ee 411 }
el14kb 2:dc75e15229ee 412 }
el14kb 2:dc75e15229ee 413 if(tetris.orientation == 3) {
el14kb 2:dc75e15229ee 414 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 415 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 416 tetris.currentPiece[m][n] = L270[m][n];
el14kb 2:dc75e15229ee 417 }
el14kb 2:dc75e15229ee 418 }
el14kb 2:dc75e15229ee 419 }
el14kb 2:dc75e15229ee 420 }
el14kb 2:dc75e15229ee 421
el14kb 2:dc75e15229ee 422 if(tetris.current_shape == 3) { //J
el14kb 2:dc75e15229ee 423 if(tetris.orientation == 0) {
el14kb 2:dc75e15229ee 424 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 425 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 426 tetris.currentPiece[m][n] = J0[m][n];
el14kb 2:dc75e15229ee 427 }
el14kb 2:dc75e15229ee 428 }
el14kb 2:dc75e15229ee 429 }
el14kb 2:dc75e15229ee 430 if(tetris.orientation == 1) {
el14kb 2:dc75e15229ee 431 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 432 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 433 tetris.currentPiece[m][n] = J90[m][n];
el14kb 2:dc75e15229ee 434 }
el14kb 2:dc75e15229ee 435 }
el14kb 2:dc75e15229ee 436 }
el14kb 2:dc75e15229ee 437 if(tetris.orientation == 2) {
el14kb 2:dc75e15229ee 438 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 439 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 440 tetris.currentPiece[m][n] = J180[m][n];
el14kb 2:dc75e15229ee 441 }
el14kb 2:dc75e15229ee 442 }
el14kb 2:dc75e15229ee 443 }
el14kb 2:dc75e15229ee 444 if(tetris.orientation == 3) {
el14kb 2:dc75e15229ee 445 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 446 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 447 tetris.currentPiece[m][n] = J270[m][n];
el14kb 2:dc75e15229ee 448 }
el14kb 2:dc75e15229ee 449 }
el14kb 2:dc75e15229ee 450 }
el14kb 2:dc75e15229ee 451 }
el14kb 2:dc75e15229ee 452
el14kb 2:dc75e15229ee 453 if(tetris.current_shape == 4) { //Z
el14kb 2:dc75e15229ee 454 if(tetris.orientation == 0) {
el14kb 2:dc75e15229ee 455 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 456 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 457 tetris.currentPiece[m][n] = Z0[m][n];
el14kb 2:dc75e15229ee 458 }
el14kb 2:dc75e15229ee 459 }
el14kb 2:dc75e15229ee 460 }
el14kb 2:dc75e15229ee 461 if(tetris.orientation == 1) {
el14kb 2:dc75e15229ee 462 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 463 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 464 tetris.currentPiece[m][n] = Z90[m][n];
el14kb 2:dc75e15229ee 465 }
el14kb 2:dc75e15229ee 466 }
el14kb 2:dc75e15229ee 467 }
el14kb 2:dc75e15229ee 468 if(tetris.orientation == 2) {
el14kb 2:dc75e15229ee 469 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 470 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 471 tetris.currentPiece[m][n] = Z180[m][n];
el14kb 2:dc75e15229ee 472 }
el14kb 2:dc75e15229ee 473 }
el14kb 2:dc75e15229ee 474 }
el14kb 2:dc75e15229ee 475 if(tetris.orientation == 3) {
el14kb 2:dc75e15229ee 476 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 477 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 478 tetris.currentPiece[m][n] = Z270[m][n];
el14kb 2:dc75e15229ee 479 }
el14kb 2:dc75e15229ee 480 }
el14kb 2:dc75e15229ee 481 }
el14kb 2:dc75e15229ee 482 }
el14kb 2:dc75e15229ee 483
el14kb 2:dc75e15229ee 484 if(tetris.current_shape == 5) { //S
el14kb 2:dc75e15229ee 485 if(tetris.orientation == 0) {
el14kb 2:dc75e15229ee 486 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 487 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 488 tetris.currentPiece[m][n] = S0[m][n];
el14kb 2:dc75e15229ee 489 }
el14kb 2:dc75e15229ee 490 }
el14kb 2:dc75e15229ee 491 }
el14kb 2:dc75e15229ee 492 if(tetris.orientation == 1) {
el14kb 2:dc75e15229ee 493 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 494 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 495 tetris.currentPiece[m][n] = S90[m][n];
el14kb 2:dc75e15229ee 496 }
el14kb 2:dc75e15229ee 497 }
el14kb 2:dc75e15229ee 498 }
el14kb 2:dc75e15229ee 499 if(tetris.orientation == 2) {
el14kb 2:dc75e15229ee 500 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 501 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 502 tetris.currentPiece[m][n] = S180[m][n];
el14kb 2:dc75e15229ee 503 }
el14kb 2:dc75e15229ee 504 }
el14kb 2:dc75e15229ee 505 }
el14kb 2:dc75e15229ee 506 if(tetris.orientation == 3) {
el14kb 2:dc75e15229ee 507 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 508 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 509 tetris.currentPiece[m][n] = S270[m][n];
el14kb 2:dc75e15229ee 510 }
el14kb 2:dc75e15229ee 511 }
el14kb 2:dc75e15229ee 512 }
el14kb 2:dc75e15229ee 513 }
el14kb 2:dc75e15229ee 514
el14kb 2:dc75e15229ee 515 if(tetris.current_shape == 6) { //T
el14kb 2:dc75e15229ee 516 if(tetris.orientation == 0) {
el14kb 2:dc75e15229ee 517 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 518 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 519 tetris.currentPiece[m][n] = T0[m][n];
el14kb 2:dc75e15229ee 520 }
el14kb 2:dc75e15229ee 521 }
el14kb 2:dc75e15229ee 522 }
el14kb 2:dc75e15229ee 523 if(tetris.orientation == 1) {
el14kb 2:dc75e15229ee 524 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 525 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 526 tetris.currentPiece[m][n] = T90[m][n];
el14kb 2:dc75e15229ee 527 }
el14kb 2:dc75e15229ee 528 }
el14kb 2:dc75e15229ee 529 }
el14kb 2:dc75e15229ee 530 if(tetris.orientation == 2) {
el14kb 2:dc75e15229ee 531 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 532 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 533 tetris.currentPiece[m][n] = T180[m][n];
el14kb 2:dc75e15229ee 534 }
el14kb 2:dc75e15229ee 535 }
el14kb 2:dc75e15229ee 536 }
el14kb 2:dc75e15229ee 537 if(tetris.orientation == 3) {
el14kb 2:dc75e15229ee 538 for(int m = 0; m < 10; m++) {
el14kb 2:dc75e15229ee 539 for(int n = 0; n < 10; n++) {
el14kb 2:dc75e15229ee 540 tetris.currentPiece[m][n] = T270[m][n];
el14kb 2:dc75e15229ee 541 }
el14kb 2:dc75e15229ee 542 }
el14kb 2:dc75e15229ee 543 }
el14kb 2:dc75e15229ee 544 }
el14kb 2:dc75e15229ee 545 }
el14kb 2:dc75e15229ee 546 }
el14kb 2:dc75e15229ee 547 bool GetcurrentState(int y,int x){
el14kb 2:dc75e15229ee 548
el14kb 2:dc75e15229ee 549 if (y<0||y>45||x<0||x>40) return false;
el14kb 2:dc75e15229ee 550
el14kb 2:dc75e15229ee 551 return currentState[y][x];
el14kb 2:dc75e15229ee 552 }
el14kb 2:dc75e15229ee 553
el14kb 2:dc75e15229ee 554 void SetcurrentState(int y,int x,bool state){
el14kb 2:dc75e15229ee 555
el14kb 2:dc75e15229ee 556 if (y<0||y>45||x<0||x>40) return;
el14kb 2:dc75e15229ee 557
el14kb 2:dc75e15229ee 558 currentState[y][x] = state;
el14kb 2:dc75e15229ee 559 }
el14kb 2:dc75e15229ee 560 void draw_piece()
el14kb 2:dc75e15229ee 561 {
el14kb 2:dc75e15229ee 562
el14kb 2:dc75e15229ee 563 if(joy.direction == LEFT) {
el14kb 2:dc75e15229ee 564 tetris.next_xP = tetris.xP-1;
el14kb 2:dc75e15229ee 565 } else if(joy.direction == RIGHT) {
el14kb 2:dc75e15229ee 566 tetris.next_xP = tetris.xP+1;
el14kb 2:dc75e15229ee 567 } else {
el14kb 2:dc75e15229ee 568
el14kb 2:dc75e15229ee 569 tetris.next_xP = tetris.xP;
el14kb 2:dc75e15229ee 570
el14kb 2:dc75e15229ee 571 }
el14kb 2:dc75e15229ee 572
el14kb 2:dc75e15229ee 573 if (tetris.next_xP+10>42) {
el14kb 2:dc75e15229ee 574 tetris.next_xP = 42-10;
el14kb 2:dc75e15229ee 575 }
el14kb 2:dc75e15229ee 576 if (tetris.next_xP<0) {
el14kb 2:dc75e15229ee 577 tetris.next_xP = 0;
el14kb 2:dc75e15229ee 578 }
el14kb 2:dc75e15229ee 579 bool piece_collided_x = false;
el14kb 2:dc75e15229ee 580 for(int y = 0; y < 10; y++) {
el14kb 2:dc75e15229ee 581 for(int x = 0; x < 10; x++) {
el14kb 2:dc75e15229ee 582 if((tetris.currentPiece[y][x] == 1) && (GetcurrentState(tetris.yP + y,tetris.next_xP + x) == 1)) {
el14kb 2:dc75e15229ee 583 piece_collided_x = true;
el14kb 2:dc75e15229ee 584 }
el14kb 2:dc75e15229ee 585 }
el14kb 2:dc75e15229ee 586 }
el14kb 2:dc75e15229ee 587 if(piece_collided_x == false) {
el14kb 2:dc75e15229ee 588 tetris.xP = tetris.next_xP;
el14kb 2:dc75e15229ee 589 }
el14kb 2:dc75e15229ee 590 tetris.next_yP = tetris.yP+1;
el14kb 2:dc75e15229ee 591
el14kb 2:dc75e15229ee 592 bool piece_collided_y = false;
el14kb 2:dc75e15229ee 593 for(int y = 0; y < 10; y++) {
el14kb 2:dc75e15229ee 594 for(int x = 0; x < 10; x++) {
el14kb 2:dc75e15229ee 595 if((tetris.currentPiece[y][x] == 1) && (GetcurrentState(tetris.next_yP + y,tetris.xP + x) == 1)) {
el14kb 2:dc75e15229ee 596 piece_collided_y = true;
el14kb 2:dc75e15229ee 597 }
el14kb 2:dc75e15229ee 598 }
el14kb 2:dc75e15229ee 599 }
el14kb 2:dc75e15229ee 600
el14kb 2:dc75e15229ee 601 if(piece_collided_y == false) {
el14kb 2:dc75e15229ee 602 tetris.yP = tetris.next_yP;
el14kb 2:dc75e15229ee 603 } else {
el14kb 2:dc75e15229ee 604 for(int y = 0; y < 10; y++) {
el14kb 2:dc75e15229ee 605 for(int x = 0; x < 10; x++) {
el14kb 2:dc75e15229ee 606 if((tetris.currentPiece[y][x] == 1)) {
el14kb 2:dc75e15229ee 607 SetcurrentState(tetris.yP + y,tetris.xP + x,1);
el14kb 2:dc75e15229ee 608 }
el14kb 2:dc75e15229ee 609 }
el14kb 2:dc75e15229ee 610 tetris.piece_in_play = 0;
el14kb 2:dc75e15229ee 611 }
el14kb 2:dc75e15229ee 612 }
el14kb 2:dc75e15229ee 613
el14kb 2:dc75e15229ee 614
el14kb 2:dc75e15229ee 615 }
el14kb 2:dc75e15229ee 616
el14kb 2:dc75e15229ee 617 void array_checker()
el14kb 2:dc75e15229ee 618 {
el14kb 2:dc75e15229ee 619 for(int x = 0; x<40; x++) {
el14kb 2:dc75e15229ee 620
el14kb 2:dc75e15229ee 621 if(currentState[0][x] == 1) {
el14kb 2:dc75e15229ee 622 printf("boop: %d",x);
el14kb 2:dc75e15229ee 623 tetris.game_over = 1;
el14kb 2:dc75e15229ee 624 }
el14kb 2:dc75e15229ee 625 }
el14kb 2:dc75e15229ee 626 }
el14kb 2:dc75e15229ee 627
el14kb 2:dc75e15229ee 628
el14kb 2:dc75e15229ee 629 void clockwise()
el14kb 2:dc75e15229ee 630 {
el14kb 2:dc75e15229ee 631 g_rotate_clock_flag = 1;
el14kb 2:dc75e15229ee 632 }
el14kb 2:dc75e15229ee 633 void anticlockwise()
el14kb 2:dc75e15229ee 634 {
el14kb 2:dc75e15229ee 635 g_rotate_anticlock_flag = 1;
el14kb 2:dc75e15229ee 636 }
el14kb 2:dc75e15229ee 637 void gameCheck_isr()
el14kb 2:dc75e15229ee 638 {
el14kb 2:dc75e15229ee 639 g_call_game_Flag = 1;
el14kb 2:dc75e15229ee 640 }