Tetris for the RA8875, derived from another users implementation.
Fork of Tetris by
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.
Block.cpp@2:6b6986c3d2bd, 2017-03-03 (annotated)
- 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?
User | Revision | Line number | New 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 | } |