Tetris for the RA8875, derived from another users implementation.

Dependencies:   RA8875

Fork of Tetris by Sergejs Popovs

Tetris, adapted to the RA8875 graphics library and display.

As currently implemented, this version is defined for the 800x480 display. A number of macros can adapt it for other screen resolutions.

Further, while presently configured for landscape mode, it should be fairly easy to reconfigure it for portrait mode.

Committer:
sergun2311
Date:
Fri Mar 03 13:19:26 2017 +0000
Revision:
2:6b6986c3d2bd
Parent:
1:b4aa36ae11ac
Child:
3:36de55e63fdf
TETRIS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sergun2311 0:645509d95b8d 1 #include "Block.h"
sergun2311 0:645509d95b8d 2 #include "mbed.h"
sergun2311 0:645509d95b8d 3 #include "playGround.h"
sergun2311 0:645509d95b8d 4 #include "Piece.h"
sergun2311 0:645509d95b8d 5 #include "Field.h"
sergun2311 1:b4aa36ae11ac 6
sergun2311 1:b4aa36ae11ac 7 Block::Block()
sergun2311 2:6b6986c3d2bd 8 {
sergun2311 2:6b6986c3d2bd 9 if (nextForm > 6)
sergun2311 2:6b6986c3d2bd 10 nextForm = rand() % 7;
sergun2311 2:6b6986c3d2bd 11 form = nextForm;
sergun2311 2:6b6986c3d2bd 12 nextForm = rand() % 7;
sergun2311 0:645509d95b8d 13 angle = rand() % 4;
sergun2311 0:645509d95b8d 14 x = 4 + rand() % 2;
sergun2311 1:b4aa36ae11ac 15 y = -1;
sergun2311 1:b4aa36ae11ac 16 }
sergun2311 1:b4aa36ae11ac 17
sergun2311 1:b4aa36ae11ac 18 Block::~Block()
sergun2311 1:b4aa36ae11ac 19 {
sergun2311 1:b4aa36ae11ac 20 }
sergun2311 0:645509d95b8d 21
sergun2311 1:b4aa36ae11ac 22 void Block::rotateLeft()
sergun2311 1:b4aa36ae11ac 23 {
sergun2311 2:6b6986c3d2bd 24 if ( !CheckRotateLeft() ) {
sergun2311 2:6b6986c3d2bd 25 if ( angle == 0 )
sergun2311 2:6b6986c3d2bd 26 angle = 3;
sergun2311 2:6b6986c3d2bd 27 else
sergun2311 2:6b6986c3d2bd 28 angle = ( abs(angle - 1) ) % 4;
sergun2311 2:6b6986c3d2bd 29 }
sergun2311 0:645509d95b8d 30 }
sergun2311 1:b4aa36ae11ac 31
sergun2311 1:b4aa36ae11ac 32 void Block::rotateRight()
sergun2311 1:b4aa36ae11ac 33 {
sergun2311 2:6b6986c3d2bd 34 if ( !CheckRotateLeft() ) {
sergun2311 2:6b6986c3d2bd 35 if ( angle == 3 )
sergun2311 2:6b6986c3d2bd 36 angle = 0;
sergun2311 2:6b6986c3d2bd 37 else
sergun2311 2:6b6986c3d2bd 38 angle = ( abs(angle + 1) ) % 4;
sergun2311 2:6b6986c3d2bd 39 }
sergun2311 1:b4aa36ae11ac 40 }
sergun2311 0:645509d95b8d 41
sergun2311 1:b4aa36ae11ac 42 void Block::moveLeft()
sergun2311 1:b4aa36ae11ac 43 {
sergun2311 1:b4aa36ae11ac 44 if ( !CheckLeft() )
sergun2311 1:b4aa36ae11ac 45 x--;
sergun2311 1:b4aa36ae11ac 46 }
sergun2311 1:b4aa36ae11ac 47
sergun2311 1:b4aa36ae11ac 48 void Block::moveRight()
sergun2311 1:b4aa36ae11ac 49 {
sergun2311 1:b4aa36ae11ac 50 if ( !CheckRight() )
sergun2311 1:b4aa36ae11ac 51 x++;
sergun2311 1:b4aa36ae11ac 52 }
sergun2311 0:645509d95b8d 53
sergun2311 0:645509d95b8d 54 bool Block::CheckBottom()
sergun2311 0:645509d95b8d 55 {
sergun2311 0:645509d95b8d 56 int xx, yy;
sergun2311 0:645509d95b8d 57 for ( xx = 0 ; xx < 5 ; xx++ ) {
sergun2311 1:b4aa36ae11ac 58 for (yy = 0 ; yy < 5 ; yy++ ) {
sergun2311 1:b4aa36ae11ac 59 if ( (Piece[form][angle][xx][yy] != 0)
sergun2311 1:b4aa36ae11ac 60 && (Field[y + yy - 1][x + xx - 2] != 0) &&
sergun2311 1:b4aa36ae11ac 61 ( y + yy - 1 > 0 ) )
sergun2311 1:b4aa36ae11ac 62 return 1;
sergun2311 1:b4aa36ae11ac 63 if ( (Piece[form][angle][xx][yy] != 0) && ( yy + y == 13 ) )
sergun2311 0:645509d95b8d 64 return 1;
sergun2311 0:645509d95b8d 65 }
sergun2311 0:645509d95b8d 66 }
sergun2311 0:645509d95b8d 67 return 0;
sergun2311 1:b4aa36ae11ac 68 }
sergun2311 1:b4aa36ae11ac 69
sergun2311 1:b4aa36ae11ac 70 bool Block::CheckLeft()
sergun2311 1:b4aa36ae11ac 71 {
sergun2311 1:b4aa36ae11ac 72 int xx, yy;
sergun2311 1:b4aa36ae11ac 73 for ( xx = 0 ; xx < 5 ; xx++ ) {
sergun2311 1:b4aa36ae11ac 74 for (yy = 0 ; yy < 5 ; yy++ ) {
sergun2311 1:b4aa36ae11ac 75 if ( (Piece[form][angle][xx][yy] != 0)
sergun2311 2:6b6986c3d2bd 76 && (Field[y + yy - 2][x + xx - 3] != 0) &&
sergun2311 1:b4aa36ae11ac 77 ( y + yy - 3 > 0 ) )
sergun2311 1:b4aa36ae11ac 78 return 1;
sergun2311 1:b4aa36ae11ac 79 if ( (Piece[form][angle][xx][yy] != 0) && ( xx + x == 2 ) )
sergun2311 1:b4aa36ae11ac 80 return 1;
sergun2311 1:b4aa36ae11ac 81 }
sergun2311 1:b4aa36ae11ac 82 }
sergun2311 1:b4aa36ae11ac 83 return 0;
sergun2311 1:b4aa36ae11ac 84 }
sergun2311 1:b4aa36ae11ac 85
sergun2311 1:b4aa36ae11ac 86 bool Block::CheckRight()
sergun2311 1:b4aa36ae11ac 87 {
sergun2311 1:b4aa36ae11ac 88 int xx, yy;
sergun2311 1:b4aa36ae11ac 89 for ( xx = 0 ; xx < 5 ; xx++ ) {
sergun2311 1:b4aa36ae11ac 90 for (yy = 0 ; yy < 5 ; yy++ ) {
sergun2311 1:b4aa36ae11ac 91 if ( (Piece[form][angle][xx][yy] != 0)
sergun2311 2:6b6986c3d2bd 92 && (Field[y + yy - 2][x + xx - 1] != 0) &&
sergun2311 1:b4aa36ae11ac 93 ( y + yy - 3 > 0 ) )
sergun2311 1:b4aa36ae11ac 94 return 1;
sergun2311 2:6b6986c3d2bd 95 if ( (Piece[form][angle][xx][yy] != 0) && ( xx + x == 11 ) )
sergun2311 2:6b6986c3d2bd 96 return 1;
sergun2311 2:6b6986c3d2bd 97 }
sergun2311 2:6b6986c3d2bd 98 }
sergun2311 2:6b6986c3d2bd 99 return 0;
sergun2311 2:6b6986c3d2bd 100 }
sergun2311 2:6b6986c3d2bd 101
sergun2311 2:6b6986c3d2bd 102 bool Block::CheckRotateLeft()
sergun2311 2:6b6986c3d2bd 103 {
sergun2311 2:6b6986c3d2bd 104 int xx, yy;
sergun2311 2:6b6986c3d2bd 105 for ( xx = 0 ; xx < 5 ; xx++ ) {
sergun2311 2:6b6986c3d2bd 106 for (yy = 0 ; yy < 5 ; yy++ ) {
sergun2311 2:6b6986c3d2bd 107 if ( (Piece[form][( abs(angle - 1) ) % 4][xx][yy] != 0)
sergun2311 2:6b6986c3d2bd 108 && (Field[y + yy - 1][x + xx - 2] != 0) &&
sergun2311 2:6b6986c3d2bd 109 ( y + yy - 3 > 0 ) )
sergun2311 2:6b6986c3d2bd 110 return 1;
sergun2311 2:6b6986c3d2bd 111 if ( (Piece[form][( abs(angle + 1) ) % 4][xx][yy] != 0) && (( xx + x == 1 ) || ( xx + x == 11 )) )
sergun2311 2:6b6986c3d2bd 112 return 1;
sergun2311 2:6b6986c3d2bd 113 }
sergun2311 2:6b6986c3d2bd 114 }
sergun2311 2:6b6986c3d2bd 115 return 0;
sergun2311 2:6b6986c3d2bd 116 }
sergun2311 2:6b6986c3d2bd 117
sergun2311 2:6b6986c3d2bd 118 bool Block::CheckRotateRight()
sergun2311 2:6b6986c3d2bd 119 {
sergun2311 2:6b6986c3d2bd 120 int xx, yy;
sergun2311 2:6b6986c3d2bd 121 for ( xx = 0 ; xx < 5 ; xx++ ) {
sergun2311 2:6b6986c3d2bd 122 for (yy = 0 ; yy < 5 ; yy++ ) {
sergun2311 2:6b6986c3d2bd 123 if ( (Piece[form][( abs(angle + 1) ) % 4][xx][yy] != 0)
sergun2311 2:6b6986c3d2bd 124 && (Field[y + yy - 1][x + xx - 2] != 0) &&
sergun2311 2:6b6986c3d2bd 125 ( y + yy - 3 > 0 ) )
sergun2311 2:6b6986c3d2bd 126 return 1;
sergun2311 2:6b6986c3d2bd 127 if ( (Piece[form][( abs(angle + 1) ) % 4][xx][yy] != 0) && (( xx + x == 1 ) || ( xx + x == 12 )) )
sergun2311 1:b4aa36ae11ac 128 return 1;
sergun2311 1:b4aa36ae11ac 129 }
sergun2311 1:b4aa36ae11ac 130 }
sergun2311 1:b4aa36ae11ac 131 return 0;
sergun2311 1:b4aa36ae11ac 132 }