Simple tetris game to show usage of C12832 LCD.

Dependencies:   C12832_lcd mbed

Committer:
PrzemekWirkus
Date:
Mon Mar 17 19:47:49 2014 +0000
Revision:
0:644f70b470b5
Child:
1:cdd5880742fc
First draft, game loop is still poor.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
PrzemekWirkus 0:644f70b470b5 1 #ifndef MBED_MTRIS_MAIN_HEADER_H
PrzemekWirkus 0:644f70b470b5 2 #define MBED_MTRIS_MAIN_HEADER_H
PrzemekWirkus 0:644f70b470b5 3
PrzemekWirkus 0:644f70b470b5 4 #include <string>
PrzemekWirkus 0:644f70b470b5 5 #include <utility>
PrzemekWirkus 0:644f70b470b5 6
PrzemekWirkus 0:644f70b470b5 7 #define LCD_W 16
PrzemekWirkus 0:644f70b470b5 8 #define LCD_H 16
PrzemekWirkus 0:644f70b470b5 9 #define BRICK_SIZE_X 4
PrzemekWirkus 0:644f70b470b5 10 #define BRICK_SIZE_Y 4
PrzemekWirkus 0:644f70b470b5 11
PrzemekWirkus 0:644f70b470b5 12 /* QUBE
PrzemekWirkus 0:644f70b470b5 13 .... .... .... ....
PrzemekWirkus 0:644f70b470b5 14 .##. .##. .##. .##.
PrzemekWirkus 0:644f70b470b5 15 .##. .##. .##. .##.
PrzemekWirkus 0:644f70b470b5 16 .... .... .... ....
PrzemekWirkus 0:644f70b470b5 17 */
PrzemekWirkus 0:644f70b470b5 18 #define BRICK_QUBE_1 {0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 19 #define BRICK_QUBE_2 {0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 20 #define BRICK_QUBE_3 {0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 21 #define BRICK_QUBE_4 {0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 22
PrzemekWirkus 0:644f70b470b5 23 /* T-agon
PrzemekWirkus 0:644f70b470b5 24 .... .... .... ....
PrzemekWirkus 0:644f70b470b5 25 .#.. #... .... .#..
PrzemekWirkus 0:644f70b470b5 26 ###. ##.. ###. ##..
PrzemekWirkus 0:644f70b470b5 27 .... #... .#.. .#..
PrzemekWirkus 0:644f70b470b5 28 */
PrzemekWirkus 0:644f70b470b5 29 #define BRICK_T_1 {0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 30 #define BRICK_T_2 {0,0,0,0,1,0,0,0,1,1,0,0,1,0,0,0}
PrzemekWirkus 0:644f70b470b5 31 #define BRICK_T_3 {0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0}
PrzemekWirkus 0:644f70b470b5 32 #define BRICK_T_4 {0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0}
PrzemekWirkus 0:644f70b470b5 33
PrzemekWirkus 0:644f70b470b5 34 /* L-agon
PrzemekWirkus 0:644f70b470b5 35 #... .... .... ....
PrzemekWirkus 0:644f70b470b5 36 #... ###. ##.. ..#.
PrzemekWirkus 0:644f70b470b5 37 ##.. #... .#.. ###.
PrzemekWirkus 0:644f70b470b5 38 .... .... .#.. ....
PrzemekWirkus 0:644f70b470b5 39 */
PrzemekWirkus 0:644f70b470b5 40 #define BRICK_L_1 {1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 41 #define BRICK_L_2 {0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 42 #define BRICK_L_3 {0,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0}
PrzemekWirkus 0:644f70b470b5 43 #define BRICK_L_4 {0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 44
PrzemekWirkus 0:644f70b470b5 45 /* I-agon
PrzemekWirkus 0:644f70b470b5 46 .#.. .... .#.. ....
PrzemekWirkus 0:644f70b470b5 47 .#.. #### .#.. ####
PrzemekWirkus 0:644f70b470b5 48 .#.. .... .#.. ....
PrzemekWirkus 0:644f70b470b5 49 .#.. .... .#.. ....
PrzemekWirkus 0:644f70b470b5 50 */
PrzemekWirkus 0:644f70b470b5 51 #define BRICK_I_1 {0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}
PrzemekWirkus 0:644f70b470b5 52 #define BRICK_I_2 {0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 53 #define BRICK_I_3 {0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}
PrzemekWirkus 0:644f70b470b5 54 #define BRICK_I_4 {0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 55
PrzemekWirkus 0:644f70b470b5 56
PrzemekWirkus 0:644f70b470b5 57 /* +-agon
PrzemekWirkus 0:644f70b470b5 58 .#.. .#.. .#.. .#..
PrzemekWirkus 0:644f70b470b5 59 ###. ###. ###. ###.
PrzemekWirkus 0:644f70b470b5 60 .#.. .#.. .#.. .#..
PrzemekWirkus 0:644f70b470b5 61 .... .... .... ....
PrzemekWirkus 0:644f70b470b5 62 */
PrzemekWirkus 0:644f70b470b5 63 #define BRICK_P_1 {0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 64 #define BRICK_P_2 {0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 65 #define BRICK_P_3 {0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 66 #define BRICK_P_4 {0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 67
PrzemekWirkus 0:644f70b470b5 68 /* *-agon
PrzemekWirkus 0:644f70b470b5 69 .... .... .... ....
PrzemekWirkus 0:644f70b470b5 70 .#.. .#.. .#.. .#..
PrzemekWirkus 0:644f70b470b5 71 .... .... .... ....
PrzemekWirkus 0:644f70b470b5 72 .... .... .... ....
PrzemekWirkus 0:644f70b470b5 73 */
PrzemekWirkus 0:644f70b470b5 74 #define BRICK_S_1 {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 75 #define BRICK_S_2 {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 76 #define BRICK_S_3 {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 77 #define BRICK_S_4 {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 78
PrzemekWirkus 0:644f70b470b5 79 /* 4-agon
PrzemekWirkus 0:644f70b470b5 80 #... .... #... ....
PrzemekWirkus 0:644f70b470b5 81 ##.. .##. ##.. .##.
PrzemekWirkus 0:644f70b470b5 82 .#.. ##.. .#.. ##..
PrzemekWirkus 0:644f70b470b5 83 .... .... .... ....
PrzemekWirkus 0:644f70b470b5 84 */
PrzemekWirkus 0:644f70b470b5 85 #define BRICK_4_1 {1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 86 #define BRICK_4_2 {0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 87 #define BRICK_4_3 {1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 88 #define BRICK_4_4 {0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0}
PrzemekWirkus 0:644f70b470b5 89
PrzemekWirkus 0:644f70b470b5 90 #define MTRIX_BRICOK_COUNT 7
PrzemekWirkus 0:644f70b470b5 91
PrzemekWirkus 0:644f70b470b5 92 template <class T>
PrzemekWirkus 0:644f70b470b5 93 class MBEDtrisBrick
PrzemekWirkus 0:644f70b470b5 94 {
PrzemekWirkus 0:644f70b470b5 95 public:
PrzemekWirkus 0:644f70b470b5 96 typedef T brick_pattern[BRICK_SIZE_X][BRICK_SIZE_Y];
PrzemekWirkus 0:644f70b470b5 97
PrzemekWirkus 0:644f70b470b5 98 MBEDtrisBrick::MBEDtrisBrick()
PrzemekWirkus 0:644f70b470b5 99 {
PrzemekWirkus 0:644f70b470b5 100 brick_index = 0;
PrzemekWirkus 0:644f70b470b5 101 brick_rotate_index = 0;
PrzemekWirkus 0:644f70b470b5 102 }
PrzemekWirkus 0:644f70b470b5 103
PrzemekWirkus 0:644f70b470b5 104 char getcell(int posx, int posy)
PrzemekWirkus 0:644f70b470b5 105 {
PrzemekWirkus 0:644f70b470b5 106 static T brick[MTRIX_BRICOK_COUNT][4][BRICK_SIZE_X][BRICK_SIZE_Y] =
PrzemekWirkus 0:644f70b470b5 107 {
PrzemekWirkus 0:644f70b470b5 108 {BRICK_QUBE_1, BRICK_QUBE_2, BRICK_QUBE_3, BRICK_QUBE_4},
PrzemekWirkus 0:644f70b470b5 109 {BRICK_T_1, BRICK_T_2, BRICK_T_3, BRICK_T_4},
PrzemekWirkus 0:644f70b470b5 110 {BRICK_L_1, BRICK_L_2, BRICK_L_3, BRICK_L_4},
PrzemekWirkus 0:644f70b470b5 111 {BRICK_I_1, BRICK_I_2, BRICK_I_3, BRICK_I_4},
PrzemekWirkus 0:644f70b470b5 112 {BRICK_P_1, BRICK_P_2, BRICK_P_3, BRICK_P_4},
PrzemekWirkus 0:644f70b470b5 113 {BRICK_S_1, BRICK_S_2, BRICK_S_3, BRICK_S_4},
PrzemekWirkus 0:644f70b470b5 114 {BRICK_4_1, BRICK_4_2, BRICK_4_3, BRICK_4_4}
PrzemekWirkus 0:644f70b470b5 115 };
PrzemekWirkus 0:644f70b470b5 116
PrzemekWirkus 0:644f70b470b5 117 return brick[brick_index][brick_rotate_index][posx][posy];
PrzemekWirkus 0:644f70b470b5 118 }
PrzemekWirkus 0:644f70b470b5 119
PrzemekWirkus 0:644f70b470b5 120 int rotate_next() { return brick_rotate_index = (brick_rotate_index + 1) % 4; }
PrzemekWirkus 0:644f70b470b5 121 int rotate_prev() { return brick_rotate_index = (brick_rotate_index == 0) ? 3 : brick_rotate_index - 1; }
PrzemekWirkus 0:644f70b470b5 122
PrzemekWirkus 0:644f70b470b5 123 int brick_next() { return brick_index = (brick_index + 1) % MTRIX_BRICOK_COUNT; }
PrzemekWirkus 0:644f70b470b5 124 int brick_prev() { return brick_index = (brick_index == 0) ? (MTRIX_BRICOK_COUNT - 1) : brick_rotate_index - 1; }
PrzemekWirkus 0:644f70b470b5 125
PrzemekWirkus 0:644f70b470b5 126 protected:
PrzemekWirkus 0:644f70b470b5 127 int brick_index;
PrzemekWirkus 0:644f70b470b5 128 int brick_rotate_index;
PrzemekWirkus 0:644f70b470b5 129 };
PrzemekWirkus 0:644f70b470b5 130
PrzemekWirkus 0:644f70b470b5 131
PrzemekWirkus 0:644f70b470b5 132 template <class T>
PrzemekWirkus 0:644f70b470b5 133 class MBEDtrisTheGame
PrzemekWirkus 0:644f70b470b5 134 {
PrzemekWirkus 0:644f70b470b5 135 public:
PrzemekWirkus 0:644f70b470b5 136 MBEDtrisTheGame::MBEDtrisTheGame()
PrzemekWirkus 0:644f70b470b5 137 {
PrzemekWirkus 0:644f70b470b5 138 fill_matrix(0);
PrzemekWirkus 0:644f70b470b5 139 }
PrzemekWirkus 0:644f70b470b5 140
PrzemekWirkus 0:644f70b470b5 141 void set_new_brick_pos()
PrzemekWirkus 0:644f70b470b5 142 {
PrzemekWirkus 0:644f70b470b5 143 int g_brick_pos_x = (LCD_W) / 2;
PrzemekWirkus 0:644f70b470b5 144 int g_brick_pos_y = 0;
PrzemekWirkus 0:644f70b470b5 145 }
PrzemekWirkus 0:644f70b470b5 146
PrzemekWirkus 0:644f70b470b5 147 void fill_matrix(char pattern)
PrzemekWirkus 0:644f70b470b5 148 {
PrzemekWirkus 0:644f70b470b5 149 for (int x = 0; x < LCD_W; x++)
PrzemekWirkus 0:644f70b470b5 150 {
PrzemekWirkus 0:644f70b470b5 151 for (int y = 0; y < LCD_H; y++)
PrzemekWirkus 0:644f70b470b5 152 {
PrzemekWirkus 0:644f70b470b5 153 lcd_matrix[x][y] = pattern;
PrzemekWirkus 0:644f70b470b5 154 }
PrzemekWirkus 0:644f70b470b5 155 }
PrzemekWirkus 0:644f70b470b5 156 }
PrzemekWirkus 0:644f70b470b5 157
PrzemekWirkus 0:644f70b470b5 158 public:
PrzemekWirkus 0:644f70b470b5 159 bool detect_brick_bottom_collision(int offset_x, int offset_y);
PrzemekWirkus 0:644f70b470b5 160 bool detect_brick_collision(int offset_x, int offset_y);
PrzemekWirkus 0:644f70b470b5 161 bool detect_brick_side_collision(int offset_x, int offset_y);
PrzemekWirkus 0:644f70b470b5 162 bool append_brick_to_matrix();
PrzemekWirkus 0:644f70b470b5 163
PrzemekWirkus 0:644f70b470b5 164 bool try_move_left();
PrzemekWirkus 0:644f70b470b5 165 bool try_move_right();
PrzemekWirkus 0:644f70b470b5 166 bool try_move_down();
PrzemekWirkus 0:644f70b470b5 167 bool try_rotate();
PrzemekWirkus 0:644f70b470b5 168
PrzemekWirkus 0:644f70b470b5 169 void move_brick_left(int offset = 1) { g_brick_pos_x -= offset; }
PrzemekWirkus 0:644f70b470b5 170 void move_brick_right(int offset = 1) { g_brick_pos_x += offset; }
PrzemekWirkus 0:644f70b470b5 171 void move_brick_up(int offset = 1) { g_brick_pos_y -= offset; }
PrzemekWirkus 0:644f70b470b5 172 void move_brick_down(int offset = 1) { try_move_down(); }
PrzemekWirkus 0:644f70b470b5 173
PrzemekWirkus 0:644f70b470b5 174 T get_matrix_cell(int pos_x, int pos_y) { return lcd_matrix[pos_x][pos_y]; }
PrzemekWirkus 0:644f70b470b5 175 T get_brick_cell(int pos_x, int pos_y) { return brick.getcell(pos_x, pos_y); }
PrzemekWirkus 0:644f70b470b5 176 std::pair<int, int> get_brick_pos() { return std::make_pair(g_brick_pos_x, g_brick_pos_y); }
PrzemekWirkus 0:644f70b470b5 177
PrzemekWirkus 0:644f70b470b5 178 protected:
PrzemekWirkus 0:644f70b470b5 179 // Brick in use
PrzemekWirkus 0:644f70b470b5 180 MBEDtrisBrick<T> brick;
PrzemekWirkus 0:644f70b470b5 181
PrzemekWirkus 0:644f70b470b5 182 // Display with solid elements
PrzemekWirkus 0:644f70b470b5 183 T lcd_matrix[LCD_W][LCD_H];
PrzemekWirkus 0:644f70b470b5 184
PrzemekWirkus 0:644f70b470b5 185 // Curent brick screen posiotion
PrzemekWirkus 0:644f70b470b5 186 int g_brick_pos_x;
PrzemekWirkus 0:644f70b470b5 187 int g_brick_pos_y;
PrzemekWirkus 0:644f70b470b5 188 };
PrzemekWirkus 0:644f70b470b5 189
PrzemekWirkus 0:644f70b470b5 190 template <class T>
PrzemekWirkus 0:644f70b470b5 191 bool MBEDtrisTheGame<T>::detect_brick_bottom_collision(int offset_x, int offset_y)
PrzemekWirkus 0:644f70b470b5 192 {
PrzemekWirkus 0:644f70b470b5 193 for (int x = 0; x < BRICK_SIZE_X; x++)
PrzemekWirkus 0:644f70b470b5 194 {
PrzemekWirkus 0:644f70b470b5 195 for (int y = 0; y < BRICK_SIZE_Y; y++)
PrzemekWirkus 0:644f70b470b5 196 {
PrzemekWirkus 0:644f70b470b5 197 if (brick.getcell(x, y) && (g_brick_pos_y + offset_y + y >= LCD_H))
PrzemekWirkus 0:644f70b470b5 198 {
PrzemekWirkus 0:644f70b470b5 199 return true;
PrzemekWirkus 0:644f70b470b5 200 }
PrzemekWirkus 0:644f70b470b5 201 }
PrzemekWirkus 0:644f70b470b5 202 }
PrzemekWirkus 0:644f70b470b5 203 return false;
PrzemekWirkus 0:644f70b470b5 204 }
PrzemekWirkus 0:644f70b470b5 205
PrzemekWirkus 0:644f70b470b5 206 template <class T>
PrzemekWirkus 0:644f70b470b5 207 bool MBEDtrisTheGame<T>::detect_brick_collision(int offset_x, int offset_y)
PrzemekWirkus 0:644f70b470b5 208 {
PrzemekWirkus 0:644f70b470b5 209 for (int x = 0; x < BRICK_SIZE_X; x++)
PrzemekWirkus 0:644f70b470b5 210 {
PrzemekWirkus 0:644f70b470b5 211 for (int y = 0; y < BRICK_SIZE_Y; y++)
PrzemekWirkus 0:644f70b470b5 212 {
PrzemekWirkus 0:644f70b470b5 213 if (brick.getcell(x, y) && lcd_matrix[g_brick_pos_x + offset_x + x][g_brick_pos_y + offset_y + y])
PrzemekWirkus 0:644f70b470b5 214 {
PrzemekWirkus 0:644f70b470b5 215 return true;
PrzemekWirkus 0:644f70b470b5 216 }
PrzemekWirkus 0:644f70b470b5 217 }
PrzemekWirkus 0:644f70b470b5 218 }
PrzemekWirkus 0:644f70b470b5 219 return false;
PrzemekWirkus 0:644f70b470b5 220 }
PrzemekWirkus 0:644f70b470b5 221
PrzemekWirkus 0:644f70b470b5 222 template <class T>
PrzemekWirkus 0:644f70b470b5 223 bool MBEDtrisTheGame<T>::detect_brick_side_collision(int offset_x, int offset_y)
PrzemekWirkus 0:644f70b470b5 224 {
PrzemekWirkus 0:644f70b470b5 225 for (int x = 0; x < BRICK_SIZE_X; x++)
PrzemekWirkus 0:644f70b470b5 226 {
PrzemekWirkus 0:644f70b470b5 227 for (int y = 0; y < BRICK_SIZE_Y; y++)
PrzemekWirkus 0:644f70b470b5 228 {
PrzemekWirkus 0:644f70b470b5 229 if (brick.getcell(x, y) && g_brick_pos_x + offset_x + x < 0)
PrzemekWirkus 0:644f70b470b5 230 {
PrzemekWirkus 0:644f70b470b5 231 return true;
PrzemekWirkus 0:644f70b470b5 232 }
PrzemekWirkus 0:644f70b470b5 233 if (brick.getcell(x, y) && (g_brick_pos_x + offset_x + x >= LCD_W))
PrzemekWirkus 0:644f70b470b5 234 {
PrzemekWirkus 0:644f70b470b5 235 return true;
PrzemekWirkus 0:644f70b470b5 236 }
PrzemekWirkus 0:644f70b470b5 237 }
PrzemekWirkus 0:644f70b470b5 238 }
PrzemekWirkus 0:644f70b470b5 239 return false;
PrzemekWirkus 0:644f70b470b5 240 }
PrzemekWirkus 0:644f70b470b5 241
PrzemekWirkus 0:644f70b470b5 242 template <class T>
PrzemekWirkus 0:644f70b470b5 243 bool MBEDtrisTheGame<T>::append_brick_to_matrix()
PrzemekWirkus 0:644f70b470b5 244 {
PrzemekWirkus 0:644f70b470b5 245 for (int x = 0; x < BRICK_SIZE_X; x++)
PrzemekWirkus 0:644f70b470b5 246 {
PrzemekWirkus 0:644f70b470b5 247 for (int y = 0; y < BRICK_SIZE_Y; y++)
PrzemekWirkus 0:644f70b470b5 248 {
PrzemekWirkus 0:644f70b470b5 249 if (brick.getcell(x, y))
PrzemekWirkus 0:644f70b470b5 250 {
PrzemekWirkus 0:644f70b470b5 251 lcd_matrix[g_brick_pos_x + x][g_brick_pos_y + y] = brick.getcell(x, y);
PrzemekWirkus 0:644f70b470b5 252 }
PrzemekWirkus 0:644f70b470b5 253 }
PrzemekWirkus 0:644f70b470b5 254 }
PrzemekWirkus 0:644f70b470b5 255 return true;
PrzemekWirkus 0:644f70b470b5 256 }
PrzemekWirkus 0:644f70b470b5 257
PrzemekWirkus 0:644f70b470b5 258 template <class T>
PrzemekWirkus 0:644f70b470b5 259 bool MBEDtrisTheGame<T>::try_move_left()
PrzemekWirkus 0:644f70b470b5 260 {
PrzemekWirkus 0:644f70b470b5 261 bool collision_size = detect_brick_side_collision(-1, 0);
PrzemekWirkus 0:644f70b470b5 262 bool collision_brick = detect_brick_collision(-1, 0);
PrzemekWirkus 0:644f70b470b5 263 if (!collision_size && !collision_brick)
PrzemekWirkus 0:644f70b470b5 264 {
PrzemekWirkus 0:644f70b470b5 265 g_brick_pos_x--;
PrzemekWirkus 0:644f70b470b5 266 return true;
PrzemekWirkus 0:644f70b470b5 267 }
PrzemekWirkus 0:644f70b470b5 268 return false;
PrzemekWirkus 0:644f70b470b5 269 }
PrzemekWirkus 0:644f70b470b5 270
PrzemekWirkus 0:644f70b470b5 271 template <class T>
PrzemekWirkus 0:644f70b470b5 272 bool MBEDtrisTheGame<T>::try_move_right()
PrzemekWirkus 0:644f70b470b5 273 {
PrzemekWirkus 0:644f70b470b5 274 bool collision_size = detect_brick_side_collision(1, 0);
PrzemekWirkus 0:644f70b470b5 275 bool collision_brick = detect_brick_collision(1, 0);
PrzemekWirkus 0:644f70b470b5 276 if (!collision_size && !collision_brick)
PrzemekWirkus 0:644f70b470b5 277 {
PrzemekWirkus 0:644f70b470b5 278 g_brick_pos_x++;
PrzemekWirkus 0:644f70b470b5 279 return true;
PrzemekWirkus 0:644f70b470b5 280 }
PrzemekWirkus 0:644f70b470b5 281 return false;
PrzemekWirkus 0:644f70b470b5 282 }
PrzemekWirkus 0:644f70b470b5 283
PrzemekWirkus 0:644f70b470b5 284 template <class T>
PrzemekWirkus 0:644f70b470b5 285 bool MBEDtrisTheGame<T>::try_move_down()
PrzemekWirkus 0:644f70b470b5 286 {
PrzemekWirkus 0:644f70b470b5 287 bool brick_collision = detect_brick_collision(0, 1);
PrzemekWirkus 0:644f70b470b5 288 bool brick_bottom_collision = detect_brick_bottom_collision(0, 1);
PrzemekWirkus 0:644f70b470b5 289
PrzemekWirkus 0:644f70b470b5 290 if (brick_collision || brick_bottom_collision)
PrzemekWirkus 0:644f70b470b5 291 {
PrzemekWirkus 0:644f70b470b5 292 append_brick_to_matrix();
PrzemekWirkus 0:644f70b470b5 293 // Create new brick
PrzemekWirkus 0:644f70b470b5 294 brick.brick_next();
PrzemekWirkus 0:644f70b470b5 295 g_brick_pos_x = (LCD_W - BRICK_SIZE_X) / 2;
PrzemekWirkus 0:644f70b470b5 296 g_brick_pos_y = 0;
PrzemekWirkus 0:644f70b470b5 297 return false;
PrzemekWirkus 0:644f70b470b5 298 }
PrzemekWirkus 0:644f70b470b5 299 g_brick_pos_y++;
PrzemekWirkus 0:644f70b470b5 300 return true;
PrzemekWirkus 0:644f70b470b5 301 }
PrzemekWirkus 0:644f70b470b5 302
PrzemekWirkus 0:644f70b470b5 303 template <class T>
PrzemekWirkus 0:644f70b470b5 304 bool MBEDtrisTheGame<T>::try_rotate()
PrzemekWirkus 0:644f70b470b5 305 {
PrzemekWirkus 0:644f70b470b5 306 brick.rotate_next();
PrzemekWirkus 0:644f70b470b5 307 bool brick_collision = detect_brick_collision(0, 1);
PrzemekWirkus 0:644f70b470b5 308 bool brick_bottom_collision = detect_brick_bottom_collision(0, 1);
PrzemekWirkus 0:644f70b470b5 309 bool brick_side_collision = detect_brick_side_collision(0, 0);
PrzemekWirkus 0:644f70b470b5 310
PrzemekWirkus 0:644f70b470b5 311 if (brick_collision || brick_bottom_collision || brick_side_collision)
PrzemekWirkus 0:644f70b470b5 312 {
PrzemekWirkus 0:644f70b470b5 313 brick.rotate_prev();
PrzemekWirkus 0:644f70b470b5 314 return false;
PrzemekWirkus 0:644f70b470b5 315 }
PrzemekWirkus 0:644f70b470b5 316 return true;
PrzemekWirkus 0:644f70b470b5 317 }
PrzemekWirkus 0:644f70b470b5 318
PrzemekWirkus 0:644f70b470b5 319 #endif