├── README.md └── tetrisv2.ino /README.md: -------------------------------------------------------------------------------- 1 | # arduino-tetris 2 | 3 | https://www.youtube.com/watch?v=OyGsXNQo1mc 4 | 5 | Author: Jae Yeong Bae 6 | UBC ECE 7 | 8 | Date: Jan.18.2013 9 | 10 | File: Tetris v2 11 | 12 | 13 | Changelog: 14 | v2: displays score at gameover 15 | 16 | Purpose: 17 | killing time.. + for fun 18 | 19 | Circuits+Pins: 20 | Led Matrix: 21 | 22 | 2 74HC575 Shift Registers in order: Green,Blue,Red 23 | 24 | pins: Latch = 3 25 | 26 | Clock = 2 27 | 28 | Data = 4 29 | 30 | Row Anodes = 5 to 13 (8pins) shared between both matrix 31 | 32 | buttons (as digital): 33 | 34 | A4 = left 35 | 36 | A5 = down 37 | 38 | A6 = right 39 | 40 | A7 = up (rotate) 41 | 42 | 43 | Comment: 44 | 45 | This is my second Arduino Project. 46 | 47 | Code may be messy and inefficient. 48 | 49 | References from Arduino Library and datasheets. 50 | 51 | -------------------------------------------------------------------------------- /tetrisv2.ino: -------------------------------------------------------------------------------- 1 | /* 2 | Author: Jae Yeong Bae 3 | UBC ECE 4 | jocker.tistory.com 5 | Date: Jan.18.2013 6 | File: Tetris v2 7 | Changelog: 8 | v2: displays score at gameover 9 | 10 | Purpose: 11 | killing time.. + for fun 12 | 13 | Circuits+Pins: 14 | Led Matrix: 15 | 2 74HC575 Shift Registers in order: Green,Blue,Red 16 | pins: Latch = 3 17 | Clock = 2 18 | Data = 4 19 | Row Anodes = 5 to 13 (8pins) shared between both matrix 20 | buttons (as digital): 21 | A4 = left 22 | A5 = down 23 | A6 = right 24 | A7 = up (rotate) 25 | 26 | Comment: 27 | This is my second Arduino Project. 28 | Code may be messy and inefficient. 29 | References from Arduino Library and datasheets. 30 | */ 31 | 32 | 33 | 34 | 35 | unsigned char latchPin = 3; 36 | unsigned char clockPin = 2; 37 | unsigned char dataPin = 4; 38 | unsigned char rowPin = 5; 39 | 40 | 41 | long delays = 0; 42 | short delay_ = 500; 43 | long bdelay = 0; 44 | short buttondelay = 150; 45 | short btdowndelay = 30; 46 | short btsidedelay = 80; 47 | unsigned char blocktype; 48 | unsigned char blockrotation; 49 | 50 | int lines = 0; 51 | boolean block[8][18]; //2 extra for rotation 52 | boolean pile[8][16]; 53 | boolean disp[8][16]; 54 | 55 | boolean lib[10][5][7]; 56 | 57 | 58 | 59 | 60 | void setup() { 61 | 62 | lib[0][1][0] = 1; 63 | lib[0][2][0] = 1; 64 | lib[0][3][0] = 1; 65 | lib[0][0][1] = 1; 66 | lib[0][4][1] = 1; 67 | lib[0][3][2] = 1; 68 | lib[0][0][2] = 1; 69 | lib[0][4][2] = 1; 70 | lib[0][2][3] = 1; 71 | lib[0][0][3] = 1; 72 | lib[0][4][3] = 1; 73 | lib[0][1][4] = 1; 74 | lib[0][0][4] = 1; 75 | lib[0][4][4] = 1; 76 | lib[0][0][5] = 1; 77 | lib[0][4][5] = 1; 78 | lib[0][1][6] = 1; 79 | lib[0][2][6] = 1; 80 | lib[0][3][6] = 1; 81 | lib[1][2][0] = 1; 82 | lib[1][1][1] = 1; 83 | lib[1][2][1] = 1; 84 | lib[1][2][2] = 1; 85 | lib[1][2][3] = 1; 86 | lib[1][2][4] = 1; 87 | lib[1][2][5] = 1; 88 | lib[1][1][6] = 1; 89 | lib[1][2][6] = 1; 90 | lib[1][3][6] = 1; 91 | lib[2][1][0] = 1; 92 | lib[2][2][0] = 1; 93 | lib[2][3][0] = 1; 94 | lib[2][0][1] = 1; 95 | lib[2][4][1] = 1; 96 | lib[2][4][2] = 1; 97 | lib[2][3][3] = 1; 98 | lib[2][2][4] = 1; 99 | lib[2][1][5] = 1; 100 | lib[2][0][6] = 1; 101 | lib[2][1][6] = 1; 102 | lib[2][2][6] = 1; 103 | lib[2][3][6] = 1; 104 | lib[2][4][6] = 1; 105 | lib[3][0][0] = 1; 106 | lib[3][1][0] = 1; 107 | lib[3][2][0] = 1; 108 | lib[3][3][0] = 1; 109 | lib[3][4][0] = 1; 110 | lib[3][3][1] = 1; 111 | lib[3][2][2] = 1; 112 | lib[3][3][3] = 1; 113 | lib[3][4][4] = 1; 114 | lib[3][0][5] = 1; 115 | lib[3][4][5] = 1; 116 | lib[3][1][6] = 1; 117 | lib[3][2][6] = 1; 118 | lib[3][3][6] = 1; 119 | lib[4][3][0] = 1; 120 | lib[4][2][1] = 1; 121 | lib[4][3][1] = 1; 122 | lib[4][1][2] = 1; 123 | lib[4][3][2] = 1; 124 | lib[4][0][3] = 1; 125 | lib[4][3][3] = 1; 126 | lib[4][0][4] = 1; 127 | lib[4][1][4] = 1; 128 | lib[4][2][4] = 1; 129 | lib[4][3][4] = 1; 130 | lib[4][4][4] = 1; 131 | lib[4][3][5] = 1; 132 | lib[4][3][6] = 1; 133 | lib[5][0][0] = 1; 134 | lib[5][1][0] = 1; 135 | lib[5][2][0] = 1; 136 | lib[5][3][0] = 1; 137 | lib[5][4][0] = 1; 138 | lib[5][0][1] = 1; 139 | lib[5][0][2] = 1; 140 | lib[5][1][2] = 1; 141 | lib[5][2][2] = 1; 142 | lib[5][3][2] = 1; 143 | lib[5][4][3] = 1; 144 | lib[5][4][4] = 1; 145 | lib[5][0][5] = 1; 146 | lib[5][4][5] = 1; 147 | lib[5][1][6] = 1; 148 | lib[5][2][6] = 1; 149 | lib[5][3][6] = 1; 150 | lib[6][2][0] = 1; 151 | lib[6][3][0] = 1; 152 | lib[6][1][1] = 1; 153 | lib[6][0][2] = 1; 154 | lib[6][0][3] = 1; 155 | lib[6][1][3] = 1; 156 | lib[6][2][3] = 1; 157 | lib[6][3][3] = 1; 158 | lib[6][0][4] = 1; 159 | lib[6][4][4] = 1; 160 | lib[6][0][5] = 1; 161 | lib[6][4][5] = 1; 162 | lib[6][1][6] = 1; 163 | lib[6][2][6] = 1; 164 | lib[6][3][6] = 1; 165 | lib[7][0][0] = 1; 166 | lib[7][1][0] = 1; 167 | lib[7][2][0] = 1; 168 | lib[7][3][0] = 1; 169 | lib[7][4][0] = 1; 170 | lib[7][4][1] = 1; 171 | lib[7][3][2] = 1; 172 | lib[7][2][3] = 1; 173 | lib[7][1][4] = 1; 174 | lib[7][1][5] = 1; 175 | lib[7][1][6] = 1; 176 | lib[8][1][0] = 1; 177 | lib[8][2][0] = 1; 178 | lib[8][3][0] = 1; 179 | lib[8][0][1] = 1; 180 | lib[8][4][1] = 1; 181 | lib[8][0][2] = 1; 182 | lib[8][4][2] = 1; 183 | lib[8][1][3] = 1; 184 | lib[8][2][3] = 1; 185 | lib[8][3][3] = 1; 186 | lib[8][0][4] = 1; 187 | lib[8][4][4] = 1; 188 | lib[8][0][5] = 1; 189 | lib[8][4][5] = 1; 190 | lib[8][1][6] = 1; 191 | lib[8][2][6] = 1; 192 | lib[8][3][6] = 1; 193 | lib[9][1][0] = 1; 194 | lib[9][2][0] = 1; 195 | lib[9][3][0] = 1; 196 | lib[9][0][1] = 1; 197 | lib[9][4][1] = 1; 198 | lib[9][0][2] = 1; 199 | lib[9][4][2] = 1; 200 | lib[9][1][3] = 1; 201 | lib[9][2][3] = 1; 202 | lib[9][3][3] = 1; 203 | lib[9][4][3] = 1; 204 | lib[9][4][4] = 1; 205 | lib[9][3][5] = 1; 206 | lib[9][1][6] = 1; 207 | lib[9][2][6] = 1; 208 | 209 | int seed = 210 | (analogRead(0)+1)* 211 | (analogRead(1)+1)* 212 | (analogRead(2)+1)* 213 | (analogRead(3)+1); 214 | randomSeed(seed); 215 | random(10,9610806); 216 | seed = seed *random(3336,15679912)+analogRead(random(4)) ; 217 | randomSeed(seed); 218 | random(10,98046); 219 | 220 | 221 | cli();//stop interrupts 222 | 223 | //set timer0 interrupt at 2kHz 224 | TCCR1A = 0;// set entire TCCR0A register to 0 225 | TCCR1B = 0;// same for TCCR0B 226 | TCNT1 = 0;//initialize counter value to 0 227 | // set compare match register for 2khz increments 228 | OCR1A = 259;// = (16*10^6) / (2000*64) - 1 (must be <256) 229 | // turn on CTC mode 230 | TCCR1A |= (1 << WGM01); 231 | // Set CS11 and CS10 bits for 1024 prescaler 232 | TCCR1B |= (1 << CS12) | (1 << CS10); 233 | // enable timer compare interrupt 234 | TIMSK1 |= (1 << OCIE0A); 235 | 236 | sei();//allow interrupts 237 | 238 | 239 | pinMode(latchPin, OUTPUT); 240 | pinMode(clockPin, OUTPUT); 241 | pinMode(dataPin, OUTPUT); 242 | 243 | pinMode(A7, INPUT); //up 244 | pinMode(A6, INPUT); //right 245 | pinMode(A5, INPUT); //left 246 | pinMode(A4, INPUT); //down 247 | 248 | int i; 249 | for(i=0;i<8;i++) 250 | pinMode(rowPin+i,OUTPUT); 251 | 252 | newBlock(); 253 | updateLED(); 254 | 255 | Serial.begin(9600); 256 | } 257 | 258 | void loop() { 259 | 260 | if (delays < millis()) 261 | { 262 | delays = millis() + delay_; 263 | movedown(); 264 | } 265 | 266 | 267 | 268 | //buttun actions 269 | int button = readBut(); 270 | 271 | if (button == 1) //up=rotate 272 | rotate(); 273 | if (button == 2) //right=moveright 274 | moveright(); 275 | if (button == 3) //left=moveleft 276 | moveleft(); 277 | if (button == 4) //down=movedown 278 | movedown(); 279 | 280 | 281 | Serial.print(analogRead(A4)); 282 | Serial.print(analogRead(A5)); 283 | Serial.print(analogRead(A6)); 284 | Serial.println(analogRead(A7)); 285 | 286 | 287 | } 288 | 289 | boolean moveleft() 290 | { 291 | if (space_left()) 292 | { 293 | int i; 294 | int j; 295 | for (i=0;i<7;i++) 296 | { 297 | for (j=0;j<16;j++) 298 | { 299 | block[i][j]=block[i+1][j]; 300 | } 301 | } 302 | 303 | for (j=0;j<16;j++) 304 | { 305 | block[7][j]=0; 306 | } 307 | 308 | updateLED(); 309 | return 1; 310 | } 311 | 312 | return 0; 313 | } 314 | 315 | boolean moveright() 316 | { 317 | if (space_right()) 318 | { 319 | int i; 320 | int j; 321 | for (i=7;i>0;i--) 322 | { 323 | for (j=0;j<16;j++) 324 | { 325 | block[i][j]=block[i-1][j]; 326 | } 327 | } 328 | 329 | for (j=0;j<16;j++) 330 | { 331 | block[0][j]=0; 332 | } 333 | 334 | updateLED(); 335 | return 1; 336 | 337 | } 338 | return 0; 339 | } 340 | 341 | int readBut() 342 | { 343 | if (bdelay > millis()) 344 | { 345 | return 0; 346 | } 347 | if (analogRead(A4) > 500) 348 | { 349 | //left 350 | bdelay = millis() + btsidedelay; 351 | return 3; 352 | } 353 | 354 | if (analogRead(A5) > 500) 355 | { 356 | //down 357 | bdelay = millis() + btdowndelay; 358 | return 4; 359 | } 360 | if (analogRead(A6) > 500) 361 | { 362 | //right 363 | bdelay = millis() + btsidedelay; 364 | return 2; 365 | } 366 | if (analogRead(A7) > 500) 367 | { 368 | //up 369 | bdelay = millis() + buttondelay; 370 | return 1; 371 | } 372 | 373 | return 0; 374 | } 375 | 376 | void updateLED() 377 | { 378 | int i; 379 | int j; 380 | for (i=0;i<8;i++) 381 | { 382 | for (j=0;j<16;j++) 383 | { 384 | disp[i][j] = block[i][j] | pile[i][j]; 385 | } 386 | } 387 | } 388 | 389 | void rotate() 390 | { 391 | 392 | //skip for square block(3) 393 | if (blocktype == 3) return; 394 | 395 | int xi; 396 | int yi; 397 | int i; 398 | int j; 399 | //detect left 400 | for (i=7;i>=0;i--) 401 | { 402 | for (j=0;j<16;j++) 403 | { 404 | if (block[i][j]) 405 | { 406 | xi = i; 407 | } 408 | } 409 | } 410 | 411 | //detect up 412 | for (i=15;i>=0;i--) 413 | { 414 | for (j=0;j<8;j++) 415 | { 416 | if (block[j][i]) 417 | { 418 | yi = i; 419 | } 420 | } 421 | } 422 | 423 | if (blocktype == 0) 424 | { 425 | if (blockrotation == 0) 426 | { 427 | 428 | 429 | if (!space_left()) 430 | { 431 | if (space_right3()) 432 | { 433 | if (!moveright()) 434 | return; 435 | xi++; 436 | } 437 | else return; 438 | } 439 | else if (!space_right()) 440 | { 441 | if (space_left3()) 442 | { 443 | if (!moveleft()) 444 | return; 445 | if (!moveleft()) 446 | return; 447 | xi--; 448 | xi--; 449 | } 450 | else 451 | return; 452 | } 453 | else if (!space_right2()) 454 | { 455 | if (space_left2()) 456 | { 457 | if (!moveleft()) 458 | return; 459 | xi--; 460 | } 461 | else 462 | return; 463 | } 464 | 465 | 466 | 467 | 468 | 469 | block[xi][yi]=0; 470 | block[xi][yi+2]=0; 471 | block[xi][yi+3]=0; 472 | 473 | block[xi-1][yi+1]=1; 474 | block[xi+1][yi+1]=1; 475 | block[xi+2][yi+1]=1; 476 | 477 | blockrotation = 1; 478 | } 479 | else 480 | { 481 | block[xi][yi]=0; 482 | block[xi+2][yi]=0; 483 | block[xi+3][yi]=0; 484 | 485 | block[xi+1][yi-1]=1; 486 | block[xi+1][yi+1]=1; 487 | block[xi+1][yi+2]=1; 488 | 489 | blockrotation = 0; 490 | } 491 | } 492 | 493 | //offset to mid 494 | xi ++; 495 | yi ++; 496 | 497 | if (blocktype == 1) 498 | { 499 | if (blockrotation == 0) 500 | { 501 | block[xi-1][yi-1] = 0; 502 | block[xi-1][yi] = 0; 503 | block[xi+1][yi] = 0; 504 | 505 | block[xi][yi-1] = 1; 506 | block[xi+1][yi-1] = 1; 507 | block[xi][yi+1] = 1; 508 | 509 | blockrotation = 1; 510 | } 511 | else if (blockrotation == 1) 512 | { 513 | if (!space_left()) 514 | { 515 | if (!moveright()) 516 | return; 517 | xi++; 518 | } 519 | xi--; 520 | 521 | block[xi][yi-1] = 0; 522 | block[xi+1][yi-1] = 0; 523 | block[xi][yi+1] = 0; 524 | 525 | block[xi-1][yi] = 1; 526 | block[xi+1][yi] = 1; 527 | block[xi+1][yi+1] = 1; 528 | 529 | blockrotation = 2; 530 | } 531 | else if (blockrotation == 2) 532 | { 533 | yi --; 534 | 535 | block[xi-1][yi] = 0; 536 | block[xi+1][yi] = 0; 537 | block[xi+1][yi+1] = 0; 538 | 539 | block[xi][yi-1] = 1; 540 | block[xi][yi+1] = 1; 541 | block[xi-1][yi+1] = 1; 542 | 543 | blockrotation = 3; 544 | } 545 | else 546 | { 547 | if (!space_right()) 548 | { 549 | if (!moveleft()) 550 | return; 551 | xi--; 552 | } 553 | block[xi][yi-1] = 0; 554 | block[xi][yi+1] = 0; 555 | block[xi-1][yi+1] = 0; 556 | 557 | block[xi-1][yi-1] = 1; 558 | block[xi-1][yi] = 1; 559 | block[xi+1][yi] = 1; 560 | 561 | blockrotation = 0; 562 | } 563 | } 564 | 565 | 566 | 567 | if (blocktype == 2) 568 | { 569 | if (blockrotation == 0) 570 | { 571 | block[xi+1][yi-1] = 0; 572 | block[xi-1][yi] = 0; 573 | block[xi+1][yi] = 0; 574 | 575 | block[xi][yi-1] = 1; 576 | block[xi+1][yi+1] = 1; 577 | block[xi][yi+1] = 1; 578 | 579 | blockrotation = 1; 580 | } 581 | else if (blockrotation == 1) 582 | { 583 | if (!space_left()) 584 | { 585 | if (!moveright()) 586 | return; 587 | xi++; 588 | } 589 | xi--; 590 | 591 | block[xi][yi-1] = 0; 592 | block[xi+1][yi+1] = 0; 593 | block[xi][yi+1] = 0; 594 | 595 | block[xi-1][yi] = 1; 596 | block[xi+1][yi] = 1; 597 | block[xi-1][yi+1] = 1; 598 | 599 | blockrotation = 2; 600 | } 601 | else if (blockrotation == 2) 602 | { 603 | yi --; 604 | 605 | block[xi-1][yi] = 0; 606 | block[xi+1][yi] = 0; 607 | block[xi-1][yi+1] = 0; 608 | 609 | block[xi][yi-1] = 1; 610 | block[xi][yi+1] = 1; 611 | block[xi-1][yi-1] = 1; 612 | 613 | blockrotation = 3; 614 | } 615 | else 616 | { 617 | if (!space_right()) 618 | { 619 | if (!moveleft()) 620 | return; 621 | xi--; 622 | } 623 | block[xi][yi-1] = 0; 624 | block[xi][yi+1] = 0; 625 | block[xi-1][yi-1] = 0; 626 | 627 | block[xi+1][yi-1] = 1; 628 | block[xi-1][yi] = 1; 629 | block[xi+1][yi] = 1; 630 | 631 | blockrotation = 0; 632 | } 633 | } 634 | 635 | if (blocktype == 4) 636 | { 637 | if (blockrotation == 0) 638 | { 639 | block[xi+1][yi-1] = 0; 640 | block[xi-1][yi] = 0; 641 | 642 | block[xi+1][yi] = 1; 643 | block[xi+1][yi+1] = 1; 644 | 645 | blockrotation = 1; 646 | } 647 | else 648 | { 649 | if (!space_left()) 650 | { 651 | if (!moveright()) 652 | return; 653 | xi++; 654 | } 655 | xi--; 656 | 657 | block[xi+1][yi] = 0; 658 | block[xi+1][yi+1] = 0; 659 | 660 | block[xi-1][yi] = 1; 661 | block[xi+1][yi-1] = 1; 662 | 663 | blockrotation = 0; 664 | } 665 | } 666 | 667 | 668 | if (blocktype == 5) 669 | { 670 | if (blockrotation == 0) 671 | { 672 | block[xi][yi-1] = 0; 673 | block[xi-1][yi] = 0; 674 | block[xi+1][yi] = 0; 675 | 676 | block[xi][yi-1] = 1; 677 | block[xi+1][yi] = 1; 678 | block[xi][yi+1] = 1; 679 | 680 | blockrotation = 1; 681 | } 682 | else if (blockrotation == 1) 683 | { 684 | if (!space_left()) 685 | { 686 | if (!moveright()) 687 | return; 688 | xi++; 689 | } 690 | xi--; 691 | 692 | block[xi][yi-1] = 0; 693 | block[xi+1][yi] = 0; 694 | block[xi][yi+1] = 0; 695 | 696 | block[xi-1][yi] = 1; 697 | block[xi+1][yi] = 1; 698 | block[xi][yi+1] = 1; 699 | 700 | blockrotation = 2; 701 | } 702 | else if (blockrotation == 2) 703 | { 704 | yi --; 705 | 706 | block[xi-1][yi] = 0; 707 | block[xi+1][yi] = 0; 708 | block[xi][yi+1] = 0; 709 | 710 | block[xi][yi-1] = 1; 711 | block[xi-1][yi] = 1; 712 | block[xi][yi+1] = 1; 713 | 714 | blockrotation = 3; 715 | } 716 | else 717 | { 718 | if (!space_right()) 719 | { 720 | if (!moveleft()) 721 | return; 722 | xi--; 723 | } 724 | block[xi][yi-1] = 0; 725 | block[xi-1][yi] = 0; 726 | block[xi][yi+1] = 0; 727 | 728 | block[xi][yi-1] = 1; 729 | block[xi-1][yi] = 1; 730 | block[xi+1][yi] = 1; 731 | 732 | blockrotation = 0; 733 | } 734 | } 735 | 736 | if (blocktype == 6) 737 | { 738 | if (blockrotation == 0) 739 | { 740 | block[xi-1][yi-1] = 0; 741 | block[xi][yi-1] = 0; 742 | 743 | block[xi+1][yi-1] = 1; 744 | block[xi][yi+1] = 1; 745 | 746 | blockrotation = 1; 747 | } 748 | else 749 | { 750 | if (!space_left()) 751 | { 752 | if (!moveright()) 753 | return; 754 | xi++; 755 | } 756 | xi--; 757 | 758 | block[xi+1][yi-1] = 0; 759 | block[xi][yi+1] = 0; 760 | 761 | block[xi-1][yi-1] = 1; 762 | block[xi][yi-1] = 1; 763 | 764 | blockrotation = 0; 765 | } 766 | } 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | //if rotating made block and pile overlap, push rows up 775 | while (!check_overlap()) 776 | { 777 | for (i=0;i<18;i++) 778 | { 779 | for (j=0;j<8;j++) 780 | { 781 | block[j][i] = block[j][i+1]; 782 | } 783 | } 784 | delays = millis() + delay_; 785 | } 786 | 787 | 788 | updateLED(); 789 | 790 | 791 | 792 | } 793 | 794 | void movedown() 795 | { 796 | if (space_below()) 797 | { 798 | //move down 799 | int i; 800 | for (i=15;i>=0;i--) 801 | { 802 | int j; 803 | for (j=0;j<8;j++) 804 | { 805 | block[j][i] = block[j][i-1]; 806 | } 807 | } 808 | for (i=0;i<7;i++) 809 | { 810 | block[i][0] = 0; 811 | } 812 | } 813 | else 814 | { 815 | //merge and new block 816 | int i; 817 | int j; 818 | for (i=0;i<8;i++) 819 | { 820 | for(j=0;j<16;j++) 821 | { 822 | if (block[i][j]) 823 | { 824 | pile[i][j]=1; 825 | block[i][j]=0; 826 | } 827 | } 828 | } 829 | newBlock(); 830 | } 831 | updateLED(); 832 | } 833 | 834 | boolean check_overlap() 835 | { 836 | int i; 837 | int j; 838 | for (i=0;i<16;i++) 839 | { 840 | for (j=0;j<7;j++) 841 | { 842 | if (block[j][i]) 843 | { 844 | if (pile[j][i]) 845 | return false; 846 | } 847 | } 848 | } 849 | for (i=16;i<18;i++) 850 | { 851 | for (j=0;j<7;j++) 852 | { 853 | if (block[j][i]) 854 | { 855 | return false; 856 | } 857 | } 858 | } 859 | return true; 860 | } 861 | 862 | void check_gameover() 863 | { 864 | int i; 865 | int j; 866 | int cnt=0;; 867 | 868 | for(i=15;i>=0;i--) 869 | { 870 | cnt=0; 871 | for (j=0;j<8;j++) 872 | { 873 | if (pile[j][i]) 874 | { 875 | cnt ++; 876 | } 877 | } 878 | if (cnt == 8) 879 | { 880 | lines++; 881 | for (j=0;j<8;j++) 882 | { 883 | pile[j][i]=0; 884 | } 885 | updateLED(); 886 | delay(50); 887 | 888 | int k; 889 | for(k=i;k>0;k--) 890 | { 891 | for (j=0;j<8;j++) 892 | { 893 | pile[j][k] = pile[j][k-1]; 894 | } 895 | } 896 | for (j=0;j<8;j++) 897 | { 898 | pile[j][0] = 0; 899 | } 900 | updateLED(); 901 | delay(50); 902 | i++; 903 | 904 | 905 | 906 | } 907 | } 908 | 909 | 910 | for(i=0;i<8;i++) 911 | { 912 | if (pile[i][0]) 913 | gameover(); 914 | } 915 | return; 916 | } 917 | 918 | void gameover() 919 | { 920 | int i; 921 | int j; 922 | 923 | //close blind 924 | for (i=0;i<8;i++) 925 | { 926 | for (j=0;j<16;j++) 927 | { 928 | if (j%2) 929 | { 930 | disp[i][j]=1; 931 | } 932 | else 933 | { 934 | disp[7-i][j]=1; 935 | } 936 | } 937 | delay(60); 938 | } 939 | 940 | //calculate score board 941 | 942 | int num_lines; 943 | num_lines = 2; 944 | boolean score[8][17]; 945 | 946 | for (i=0;i<8;i++) 947 | { 948 | for (j=0;j<16;j++) 949 | { 950 | score[i][j] = 0; 951 | } 952 | } 953 | 954 | int digit1 = (lines/10) % 10; 955 | int digit2 = (lines) % 10; 956 | 957 | for (i=0;i<5;i++) 958 | for (j=0;j<8;j++) 959 | { 960 | score[7-j][i+3] = lib[digit1][i][j]; 961 | } 962 | for (i=0;i<5;i++) 963 | for (j=0;j<8;j++) 964 | { 965 | score[7-j][i+9] = lib[digit2][i][j]; 966 | } 967 | 968 | for (i=0;i<16;i++) 969 | { 970 | score[0][i]=0; 971 | } 972 | 973 | 974 | //open blind with score 975 | for (i=0;i<8;i++) 976 | { 977 | for (j=0;j<16;j++) 978 | { 979 | if (j%2) 980 | { 981 | disp[i][j]=score[i][j]; 982 | } 983 | else 984 | { 985 | disp[7-i][j]=score[7-i][j]; 986 | } 987 | } 988 | delay(60); 989 | } 990 | 991 | delay(100); 992 | 993 | while(true) 994 | { 995 | for (i=0;i<8;i++) 996 | { 997 | for (j=0;j<16;j++) 998 | { 999 | disp[i][j] = score[i][j]; 1000 | } 1001 | } 1002 | 1003 | boolean tmpline[8]; 1004 | for (i=0;i<8;i++) 1005 | { 1006 | score[i][16]=score[i][0]; 1007 | } 1008 | 1009 | for (i=0;i<8;i++) 1010 | { 1011 | for (j=0;j<16;j++) 1012 | { 1013 | score[i][j] = score[i][j+1]; 1014 | } 1015 | } 1016 | 1017 | 1018 | delay(100); 1019 | } 1020 | 1021 | } 1022 | 1023 | void newBlock() 1024 | { 1025 | check_gameover(); 1026 | 1027 | 1028 | blocktype = random(7); 1029 | 1030 | 1031 | if (blocktype == 0) 1032 | // 0 1033 | // 0 1034 | // 0 1035 | // 0 1036 | { 1037 | block[3][0]=1; 1038 | block[3][1]=1; 1039 | block[3][2]=1; 1040 | block[3][3]=1; 1041 | } 1042 | 1043 | if (blocktype == 1) 1044 | // 0 1045 | // 0 0 0 1046 | { 1047 | block[2][0]=1; 1048 | block[2][1]=1; 1049 | block[3][1]=1; 1050 | block[4][1]=1; 1051 | } 1052 | 1053 | if (blocktype == 2) 1054 | // 0 1055 | // 0 0 0 1056 | { 1057 | block[4][0]=1; 1058 | block[2][1]=1; 1059 | block[3][1]=1; 1060 | block[4][1]=1; 1061 | } 1062 | 1063 | if (blocktype == 3) 1064 | // 0 0 1065 | // 0 0 1066 | { 1067 | block[3][0]=1; 1068 | block[3][1]=1; 1069 | block[4][0]=1; 1070 | block[4][1]=1; 1071 | } 1072 | 1073 | if (blocktype == 4) 1074 | // 0 0 1075 | // 0 0 1076 | { 1077 | block[4][0]=1; 1078 | block[5][0]=1; 1079 | block[3][1]=1; 1080 | block[4][1]=1; 1081 | } 1082 | 1083 | if (blocktype == 5) 1084 | // 0 1085 | // 0 0 0 1086 | { 1087 | block[4][0]=1; 1088 | block[3][1]=1; 1089 | block[4][1]=1; 1090 | block[5][1]=1; 1091 | } 1092 | 1093 | if (blocktype == 6) 1094 | // 0 0 1095 | // 0 0 1096 | { 1097 | block[3][0]=1; 1098 | block[4][0]=1; 1099 | block[4][1]=1; 1100 | block[5][1]=1; 1101 | } 1102 | 1103 | blockrotation = 0; 1104 | } 1105 | 1106 | boolean space_below() 1107 | { 1108 | int i; 1109 | int j; 1110 | for (i=15;i>=0;i--) 1111 | { 1112 | for (j=0;j<8;j++) 1113 | { 1114 | if (block[j][i]) 1115 | { 1116 | if (i == 15) 1117 | return false; 1118 | if (pile[j][i+1]) 1119 | { 1120 | return false; 1121 | } 1122 | } 1123 | } 1124 | } 1125 | return true; 1126 | } 1127 | 1128 | boolean space_left2() 1129 | { 1130 | int i; 1131 | int j; 1132 | for (i=15;i>=0;i--) 1133 | { 1134 | for (j=0;j<8;j++) 1135 | { 1136 | if (block[j][i]) 1137 | { 1138 | if (j == 0 || j == 1) 1139 | return false; 1140 | if (pile[j-1][i] | pile[j-2][i]) 1141 | { 1142 | return false; 1143 | } 1144 | } 1145 | } 1146 | } 1147 | return true; 1148 | } 1149 | 1150 | boolean space_left3() 1151 | { 1152 | int i; 1153 | int j; 1154 | for (i=15;i>=0;i--) 1155 | { 1156 | for (j=0;j<8;j++) 1157 | { 1158 | if (block[j][i]) 1159 | { 1160 | if (j == 0 || j == 1 ||j == 2 ) 1161 | return false; 1162 | if (pile[j-1][i] | pile[j-2][i]|pile[j-3][i]) 1163 | { 1164 | return false; 1165 | } 1166 | } 1167 | } 1168 | } 1169 | return true; 1170 | } 1171 | 1172 | boolean space_left() 1173 | { 1174 | int i; 1175 | int j; 1176 | for (i=15;i>=0;i--) 1177 | { 1178 | for (j=0;j<8;j++) 1179 | { 1180 | if (block[j][i]) 1181 | { 1182 | if (j == 0) 1183 | return false; 1184 | if (pile[j-1][i]) 1185 | { 1186 | return false; 1187 | } 1188 | } 1189 | } 1190 | } 1191 | return true; 1192 | } 1193 | 1194 | boolean space_right() 1195 | { 1196 | int i; 1197 | int j; 1198 | for (i=15;i>=0;i--) 1199 | { 1200 | for (j=0;j<8;j++) 1201 | { 1202 | if (block[j][i]) 1203 | { 1204 | if (j == 7) 1205 | return false; 1206 | if (pile[j+1][i]) 1207 | { 1208 | return false; 1209 | } 1210 | } 1211 | } 1212 | } 1213 | return true; 1214 | } 1215 | 1216 | boolean space_right3() 1217 | { 1218 | int i; 1219 | int j; 1220 | for (i=15;i>=0;i--) 1221 | { 1222 | for (j=0;j<8;j++) 1223 | { 1224 | if (block[j][i]) 1225 | { 1226 | if (j == 7||j == 6||j == 5) 1227 | return false; 1228 | if (pile[j+1][i] |pile[j+2][i] | pile[j+3][i]) 1229 | { 1230 | return false; 1231 | } 1232 | } 1233 | } 1234 | } 1235 | return true; 1236 | } 1237 | 1238 | boolean space_right2() 1239 | { 1240 | int i; 1241 | int j; 1242 | for (i=15;i>=0;i--) 1243 | { 1244 | for (j=0;j<8;j++) 1245 | { 1246 | if (block[j][i]) 1247 | { 1248 | if (j == 7 || j == 6) 1249 | return false; 1250 | if (pile[j+1][i] |pile[j+2][i]) 1251 | { 1252 | return false; 1253 | } 1254 | } 1255 | } 1256 | } 1257 | return true; 1258 | } 1259 | 1260 | 1261 | 1262 | ISR(TIMER1_COMPA_vect){ //change the 0 to 1 for timer1 and 2 for timer2 1263 | LEDRefresh(); 1264 | } 1265 | 1266 | void LEDRefresh() 1267 | { 1268 | int i; 1269 | int k; 1270 | //////////////////////////////////////////////// 1271 | // I soldered pins wrong. (12345670 instead of 01234567). 1272 | // so this portion of code is to software correct this issue. 1273 | boolean tmpdisp[8][16]; 1274 | for (k=0;k<16;k++) 1275 | { 1276 | for(i=1;i<8;i++) 1277 | { 1278 | tmpdisp[i][k]=disp[i-1][k]; 1279 | } 1280 | tmpdisp[0][k]=disp[7][k]; 1281 | } 1282 | ////////////////////////////////////////////// 1283 | 1284 | for(i=0;i<8;i++) 1285 | { 1286 | int j; 1287 | 1288 | if (i == 0) 1289 | j = rowPin+7; 1290 | else 1291 | j = rowPin+i-1; 1292 | 1293 | byte upper = 0; 1294 | int b; 1295 | for(b = 0;b<8;b++) 1296 | { 1297 | upper <<= 1; 1298 | if (!tmpdisp[b][i]) upper |= 1; 1299 | } 1300 | 1301 | 1302 | byte lower = 0; 1303 | for(b = 0;b<8;b++) 1304 | { 1305 | lower <<= 1; 1306 | if (!tmpdisp[b][i+8]) lower |= 1; 1307 | } 1308 | 1309 | 1310 | digitalWrite(j,LOW); 1311 | digitalWrite(latchPin, LOW); 1312 | shiftOut(dataPin, clockPin, LSBFIRST, lower); 1313 | shiftOut(dataPin, clockPin, LSBFIRST, upper); 1314 | digitalWrite(latchPin, HIGH); 1315 | digitalWrite(rowPin+i,HIGH); 1316 | delay(1); 1317 | } 1318 | digitalWrite(rowPin+7,LOW); 1319 | } 1320 | 1321 | 1322 | 1323 | 1324 | 1325 | 1326 | --------------------------------------------------------------------------------