![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
2048 game on mbed LPC1768 using a UVGAII serial connection. The program starts with the game ready to play. Player uses 4 push buttons to direct the tiles in the desired direction: UP, DOWN, LEFT or RIGHT. The goal is to combine the numbers and get to the 2048 tile! The game ends when the player is either stuck (no possible moves in any direction) or if the 2048 tile is reached. To restart the game, player must press the reset button on the mbed.
main.cpp@0:fabe2250ba03, 2014-10-22 (annotated)
- Committer:
- reinaldo422
- Date:
- Wed Oct 22 05:26:08 2014 +0000
- Revision:
- 0:fabe2250ba03
initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
reinaldo422 | 0:fabe2250ba03 | 1 | // 2048 Game by Reinaldo Cruz and Douglas Sigelbaum |
reinaldo422 | 0:fabe2250ba03 | 2 | // ECE 4180 Gatech |
reinaldo422 | 0:fabe2250ba03 | 3 | |
reinaldo422 | 0:fabe2250ba03 | 4 | #include "mbed.h" |
reinaldo422 | 0:fabe2250ba03 | 5 | #include "TFT_4DGL.h" |
reinaldo422 | 0:fabe2250ba03 | 6 | #include <math.h> |
reinaldo422 | 0:fabe2250ba03 | 7 | #include <sstream> |
reinaldo422 | 0:fabe2250ba03 | 8 | Serial printer(USBTX, USBRX); |
reinaldo422 | 0:fabe2250ba03 | 9 | |
reinaldo422 | 0:fabe2250ba03 | 10 | // overwrite 4DGL library screen size settings in TFT_4DGL.h |
reinaldo422 | 0:fabe2250ba03 | 11 | #define SIZE_X 479 |
reinaldo422 | 0:fabe2250ba03 | 12 | #define SIZE_Y 639 |
reinaldo422 | 0:fabe2250ba03 | 13 | // |
reinaldo422 | 0:fabe2250ba03 | 14 | #define BOARD_SIZE 4 |
reinaldo422 | 0:fabe2250ba03 | 15 | #define MOVE_UP 1 |
reinaldo422 | 0:fabe2250ba03 | 16 | #define MOVE_DOWN 2 |
reinaldo422 | 0:fabe2250ba03 | 17 | #define MOVE_LEFT 3 |
reinaldo422 | 0:fabe2250ba03 | 18 | #define MOVE_RIGHT 4 |
reinaldo422 | 0:fabe2250ba03 | 19 | |
reinaldo422 | 0:fabe2250ba03 | 20 | |
reinaldo422 | 0:fabe2250ba03 | 21 | class Piece { |
reinaldo422 | 0:fabe2250ba03 | 22 | public: |
reinaldo422 | 0:fabe2250ba03 | 23 | Piece(); |
reinaldo422 | 0:fabe2250ba03 | 24 | Piece(int); |
reinaldo422 | 0:fabe2250ba03 | 25 | int level; |
reinaldo422 | 0:fabe2250ba03 | 26 | bool matches(const Piece&); |
reinaldo422 | 0:fabe2250ba03 | 27 | void makeEmpty(); |
reinaldo422 | 0:fabe2250ba03 | 28 | void setLevel(int); |
reinaldo422 | 0:fabe2250ba03 | 29 | void upgrade(); |
reinaldo422 | 0:fabe2250ba03 | 30 | bool isEmpty(); |
reinaldo422 | 0:fabe2250ba03 | 31 | |
reinaldo422 | 0:fabe2250ba03 | 32 | }; |
reinaldo422 | 0:fabe2250ba03 | 33 | class GameBoard { |
reinaldo422 | 0:fabe2250ba03 | 34 | public: |
reinaldo422 | 0:fabe2250ba03 | 35 | GameBoard(); |
reinaldo422 | 0:fabe2250ba03 | 36 | GameBoard(const GameBoard&); |
reinaldo422 | 0:fabe2250ba03 | 37 | ~GameBoard(); |
reinaldo422 | 0:fabe2250ba03 | 38 | void addRandomPiece(); |
reinaldo422 | 0:fabe2250ba03 | 39 | bool moveBoard(int); |
reinaldo422 | 0:fabe2250ba03 | 40 | bool move(int, int, int); |
reinaldo422 | 0:fabe2250ba03 | 41 | Piece* pieces[BOARD_SIZE]; |
reinaldo422 | 0:fabe2250ba03 | 42 | unsigned colors[]; |
reinaldo422 | 0:fabe2250ba03 | 43 | TFT_4DGL* panel; |
reinaldo422 | 0:fabe2250ba03 | 44 | void repaint(int, int, int); |
reinaldo422 | 0:fabe2250ba03 | 45 | unsigned score; |
reinaldo422 | 0:fabe2250ba03 | 46 | void updateScore(); |
reinaldo422 | 0:fabe2250ba03 | 47 | bool checkLose(); |
reinaldo422 | 0:fabe2250ba03 | 48 | void lose(); |
reinaldo422 | 0:fabe2250ba03 | 49 | int empty; |
reinaldo422 | 0:fabe2250ba03 | 50 | }; |
reinaldo422 | 0:fabe2250ba03 | 51 | |
reinaldo422 | 0:fabe2250ba03 | 52 | Piece::Piece() { |
reinaldo422 | 0:fabe2250ba03 | 53 | this->level = 0; |
reinaldo422 | 0:fabe2250ba03 | 54 | } |
reinaldo422 | 0:fabe2250ba03 | 55 | |
reinaldo422 | 0:fabe2250ba03 | 56 | |
reinaldo422 | 0:fabe2250ba03 | 57 | void Piece::setLevel(int level) { |
reinaldo422 | 0:fabe2250ba03 | 58 | this->level = level; |
reinaldo422 | 0:fabe2250ba03 | 59 | } |
reinaldo422 | 0:fabe2250ba03 | 60 | |
reinaldo422 | 0:fabe2250ba03 | 61 | void Piece::upgrade() { |
reinaldo422 | 0:fabe2250ba03 | 62 | this->level = (this->level)*2; |
reinaldo422 | 0:fabe2250ba03 | 63 | } |
reinaldo422 | 0:fabe2250ba03 | 64 | |
reinaldo422 | 0:fabe2250ba03 | 65 | bool Piece::isEmpty() { |
reinaldo422 | 0:fabe2250ba03 | 66 | return this->level == 0; |
reinaldo422 | 0:fabe2250ba03 | 67 | } |
reinaldo422 | 0:fabe2250ba03 | 68 | Piece::Piece(int lev) { |
reinaldo422 | 0:fabe2250ba03 | 69 | this->level = lev; |
reinaldo422 | 0:fabe2250ba03 | 70 | } |
reinaldo422 | 0:fabe2250ba03 | 71 | |
reinaldo422 | 0:fabe2250ba03 | 72 | bool Piece::matches(const Piece& piece) { |
reinaldo422 | 0:fabe2250ba03 | 73 | return piece.level == this->level && piece.level != 0; |
reinaldo422 | 0:fabe2250ba03 | 74 | } |
reinaldo422 | 0:fabe2250ba03 | 75 | |
reinaldo422 | 0:fabe2250ba03 | 76 | void Piece::makeEmpty() { |
reinaldo422 | 0:fabe2250ba03 | 77 | this->level = 0; |
reinaldo422 | 0:fabe2250ba03 | 78 | } |
reinaldo422 | 0:fabe2250ba03 | 79 | |
reinaldo422 | 0:fabe2250ba03 | 80 | GameBoard::GameBoard() { |
reinaldo422 | 0:fabe2250ba03 | 81 | score = 0; |
reinaldo422 | 0:fabe2250ba03 | 82 | empty = 16; |
reinaldo422 | 0:fabe2250ba03 | 83 | panel = new TFT_4DGL(p9, p10, p11); |
reinaldo422 | 0:fabe2250ba03 | 84 | panel->baudrate(115200); |
reinaldo422 | 0:fabe2250ba03 | 85 | panel->text_mode(TRANSPARENT); |
reinaldo422 | 0:fabe2250ba03 | 86 | //// added - Set Display to 640 by 480 mode |
reinaldo422 | 0:fabe2250ba03 | 87 | panel->display_control(0x0c, 0x01); |
reinaldo422 | 0:fabe2250ba03 | 88 | srand(NULL); |
reinaldo422 | 0:fabe2250ba03 | 89 | for(int i = 0; i < BOARD_SIZE; i++) { |
reinaldo422 | 0:fabe2250ba03 | 90 | pieces[i] = new Piece[BOARD_SIZE]; |
reinaldo422 | 0:fabe2250ba03 | 91 | } |
reinaldo422 | 0:fabe2250ba03 | 92 | addRandomPiece(); |
reinaldo422 | 0:fabe2250ba03 | 93 | addRandomPiece(); |
reinaldo422 | 0:fabe2250ba03 | 94 | for(int i = 0; i < 4; i++) { |
reinaldo422 | 0:fabe2250ba03 | 95 | for(int j = 0; j < 4; j++) { |
reinaldo422 | 0:fabe2250ba03 | 96 | repaint(pieces[i][j].level, j, i); |
reinaldo422 | 0:fabe2250ba03 | 97 | } |
reinaldo422 | 0:fabe2250ba03 | 98 | } |
reinaldo422 | 0:fabe2250ba03 | 99 | panel->graphic_string("2048", 280, 10, FONT_8X8, WHITE, 2, 2); |
reinaldo422 | 0:fabe2250ba03 | 100 | panel->graphic_string("Score: ", 125, 440, FONT_8X8, WHITE, 2, 2); |
reinaldo422 | 0:fabe2250ba03 | 101 | } |
reinaldo422 | 0:fabe2250ba03 | 102 | |
reinaldo422 | 0:fabe2250ba03 | 103 | void GameBoard::repaint(int level, int x, int y) { |
reinaldo422 | 0:fabe2250ba03 | 104 | switch(level) { |
reinaldo422 | 0:fabe2250ba03 | 105 | case 0: |
reinaldo422 | 0:fabe2250ba03 | 106 | panel->text_button(" ", UP, x*100+125, y*100+50, BG_COLOR, FONT_8X8, DTEXT, 2, 8); |
reinaldo422 | 0:fabe2250ba03 | 107 | break; |
reinaldo422 | 0:fabe2250ba03 | 108 | case 2: |
reinaldo422 | 0:fabe2250ba03 | 109 | panel->text_button(" 2 ", UP, x*100+125, y*100+50, LGREY, FONT_8X8, DTEXT, 2, 8); |
reinaldo422 | 0:fabe2250ba03 | 110 | break; |
reinaldo422 | 0:fabe2250ba03 | 111 | case 4: |
reinaldo422 | 0:fabe2250ba03 | 112 | panel->text_button(" 4 ", UP, x*100+125, y*100+50, DGREY, FONT_8X8, DTEXT, 2, 8); |
reinaldo422 | 0:fabe2250ba03 | 113 | break; |
reinaldo422 | 0:fabe2250ba03 | 114 | case 8: |
reinaldo422 | 0:fabe2250ba03 | 115 | panel->text_button(" 8 ", UP, x*100+125, y*100+50, LORANGE, FONT_8X8, LTEXT, 2, 8); |
reinaldo422 | 0:fabe2250ba03 | 116 | break; |
reinaldo422 | 0:fabe2250ba03 | 117 | case 16: |
reinaldo422 | 0:fabe2250ba03 | 118 | panel->text_button(" 16 ", UP, x*100+125, y*100+50, DORANGE, FONT_8X8, LTEXT, 2, 8); |
reinaldo422 | 0:fabe2250ba03 | 119 | break; |
reinaldo422 | 0:fabe2250ba03 | 120 | case 32: |
reinaldo422 | 0:fabe2250ba03 | 121 | panel->text_button(" 32 ", UP, x*100+125, y*100+50, LRED, FONT_8X8, LTEXT, 2, 8); |
reinaldo422 | 0:fabe2250ba03 | 122 | break; |
reinaldo422 | 0:fabe2250ba03 | 123 | case 64: |
reinaldo422 | 0:fabe2250ba03 | 124 | panel->text_button(" 64 ", UP, x*100+125, y*100+50, DRED, FONT_8X8, LTEXT, 2, 8); |
reinaldo422 | 0:fabe2250ba03 | 125 | break; |
reinaldo422 | 0:fabe2250ba03 | 126 | case 128: |
reinaldo422 | 0:fabe2250ba03 | 127 | panel->text_button("128 ", UP, x*100+125, y*100+50, GOLD128, FONT_8X8, LTEXT, 2, 8); |
reinaldo422 | 0:fabe2250ba03 | 128 | break; |
reinaldo422 | 0:fabe2250ba03 | 129 | case 256: |
reinaldo422 | 0:fabe2250ba03 | 130 | panel->text_button("256 ", UP, x*100+125, y*100+50, GOLD256, FONT_8X8, LTEXT, 2, 8); |
reinaldo422 | 0:fabe2250ba03 | 131 | break; |
reinaldo422 | 0:fabe2250ba03 | 132 | case 512: |
reinaldo422 | 0:fabe2250ba03 | 133 | panel->text_button("512 ", UP, x*100+125, y*100+50, GOLD512, FONT_8X8, LTEXT, 2, 8); |
reinaldo422 | 0:fabe2250ba03 | 134 | break; |
reinaldo422 | 0:fabe2250ba03 | 135 | case 1024: |
reinaldo422 | 0:fabe2250ba03 | 136 | panel->text_button("1024", UP, x*100+125, y*100+50, GOLD1024, FONT_8X8, LTEXT, 2, 8); |
reinaldo422 | 0:fabe2250ba03 | 137 | break; |
reinaldo422 | 0:fabe2250ba03 | 138 | case 2048: |
reinaldo422 | 0:fabe2250ba03 | 139 | panel->text_button("2048", UP, x*100+125, y*100+50, BLUE2048, FONT_8X8, LTEXT, 2, 8); |
reinaldo422 | 0:fabe2250ba03 | 140 | panel->graphic_string("YOU WIN", 80, 200, FONT_8X8, BLUE2048, 8, 8); |
reinaldo422 | 0:fabe2250ba03 | 141 | break; |
reinaldo422 | 0:fabe2250ba03 | 142 | } |
reinaldo422 | 0:fabe2250ba03 | 143 | } |
reinaldo422 | 0:fabe2250ba03 | 144 | |
reinaldo422 | 0:fabe2250ba03 | 145 | |
reinaldo422 | 0:fabe2250ba03 | 146 | bool GameBoard::moveBoard(int dir) { |
reinaldo422 | 0:fabe2250ba03 | 147 | bool moved = false; |
reinaldo422 | 0:fabe2250ba03 | 148 | int i,j; |
reinaldo422 | 0:fabe2250ba03 | 149 | switch(dir) { |
reinaldo422 | 0:fabe2250ba03 | 150 | case MOVE_UP: |
reinaldo422 | 0:fabe2250ba03 | 151 | for(j = 0; j < BOARD_SIZE; j++) { |
reinaldo422 | 0:fabe2250ba03 | 152 | for(i = 1; i < BOARD_SIZE; i++) { |
reinaldo422 | 0:fabe2250ba03 | 153 | if(move(j,i,dir)) moved = true; |
reinaldo422 | 0:fabe2250ba03 | 154 | } |
reinaldo422 | 0:fabe2250ba03 | 155 | } |
reinaldo422 | 0:fabe2250ba03 | 156 | break; |
reinaldo422 | 0:fabe2250ba03 | 157 | case MOVE_DOWN: |
reinaldo422 | 0:fabe2250ba03 | 158 | for(j = 0; j < BOARD_SIZE; j++) { |
reinaldo422 | 0:fabe2250ba03 | 159 | for(i = BOARD_SIZE - 2; i >= 0; i--) { |
reinaldo422 | 0:fabe2250ba03 | 160 | if(move(j,i,dir)) moved = true; |
reinaldo422 | 0:fabe2250ba03 | 161 | } |
reinaldo422 | 0:fabe2250ba03 | 162 | } |
reinaldo422 | 0:fabe2250ba03 | 163 | break; |
reinaldo422 | 0:fabe2250ba03 | 164 | case MOVE_LEFT: |
reinaldo422 | 0:fabe2250ba03 | 165 | for(i = 0; i < BOARD_SIZE; i++) { |
reinaldo422 | 0:fabe2250ba03 | 166 | for(j = 1; j < BOARD_SIZE; j++) { |
reinaldo422 | 0:fabe2250ba03 | 167 | if(move(j,i,dir)) moved = true; |
reinaldo422 | 0:fabe2250ba03 | 168 | } |
reinaldo422 | 0:fabe2250ba03 | 169 | } |
reinaldo422 | 0:fabe2250ba03 | 170 | break; |
reinaldo422 | 0:fabe2250ba03 | 171 | case MOVE_RIGHT: |
reinaldo422 | 0:fabe2250ba03 | 172 | for(i = 0; i < BOARD_SIZE; i++) { |
reinaldo422 | 0:fabe2250ba03 | 173 | for(j = BOARD_SIZE - 2; j >= 0; j--) { |
reinaldo422 | 0:fabe2250ba03 | 174 | if(move(j,i,dir)) moved = true; |
reinaldo422 | 0:fabe2250ba03 | 175 | } |
reinaldo422 | 0:fabe2250ba03 | 176 | } |
reinaldo422 | 0:fabe2250ba03 | 177 | break; |
reinaldo422 | 0:fabe2250ba03 | 178 | } |
reinaldo422 | 0:fabe2250ba03 | 179 | return moved; |
reinaldo422 | 0:fabe2250ba03 | 180 | } |
reinaldo422 | 0:fabe2250ba03 | 181 | void GameBoard::updateScore() { |
reinaldo422 | 0:fabe2250ba03 | 182 | std::string s; |
reinaldo422 | 0:fabe2250ba03 | 183 | std::stringstream out; |
reinaldo422 | 0:fabe2250ba03 | 184 | out << score; |
reinaldo422 | 0:fabe2250ba03 | 185 | s = out.str(); |
reinaldo422 | 0:fabe2250ba03 | 186 | panel->rectangle(230, 440, 400, 460, BLACK); |
reinaldo422 | 0:fabe2250ba03 | 187 | panel->graphic_string(s.c_str(), 230, 440, FONT_8X8, WHITE, 2, 2); |
reinaldo422 | 0:fabe2250ba03 | 188 | } |
reinaldo422 | 0:fabe2250ba03 | 189 | |
reinaldo422 | 0:fabe2250ba03 | 190 | |
reinaldo422 | 0:fabe2250ba03 | 191 | void GameBoard::lose() { |
reinaldo422 | 0:fabe2250ba03 | 192 | panel->graphic_string("YOU LOSE", 80, 200, FONT_8X8, DRED, 8, 8); |
reinaldo422 | 0:fabe2250ba03 | 193 | } |
reinaldo422 | 0:fabe2250ba03 | 194 | |
reinaldo422 | 0:fabe2250ba03 | 195 | |
reinaldo422 | 0:fabe2250ba03 | 196 | bool GameBoard::checkLose() { |
reinaldo422 | 0:fabe2250ba03 | 197 | for (int i = 0; i < 4; i++) { |
reinaldo422 | 0:fabe2250ba03 | 198 | for (int j = 1; j < 4; j++) { |
reinaldo422 | 0:fabe2250ba03 | 199 | if (pieces[i][j].level == pieces[i][j-1].level || |
reinaldo422 | 0:fabe2250ba03 | 200 | pieces[j][i].level == pieces[j-1][i].level) |
reinaldo422 | 0:fabe2250ba03 | 201 | return true; |
reinaldo422 | 0:fabe2250ba03 | 202 | } |
reinaldo422 | 0:fabe2250ba03 | 203 | } |
reinaldo422 | 0:fabe2250ba03 | 204 | return false; |
reinaldo422 | 0:fabe2250ba03 | 205 | } |
reinaldo422 | 0:fabe2250ba03 | 206 | |
reinaldo422 | 0:fabe2250ba03 | 207 | bool GameBoard::move(int x, int y, int dir) { |
reinaldo422 | 0:fabe2250ba03 | 208 | bool moved = false; |
reinaldo422 | 0:fabe2250ba03 | 209 | switch(dir) { |
reinaldo422 | 0:fabe2250ba03 | 210 | case MOVE_UP: |
reinaldo422 | 0:fabe2250ba03 | 211 | while(y-1 >= 0 && !(pieces[y][x].isEmpty())){ |
reinaldo422 | 0:fabe2250ba03 | 212 | if(pieces[y-1][x].isEmpty()) { |
reinaldo422 | 0:fabe2250ba03 | 213 | pieces[y-1][x].setLevel(pieces[y][x].level); |
reinaldo422 | 0:fabe2250ba03 | 214 | repaint(pieces[y-1][x].level, x, y-1); |
reinaldo422 | 0:fabe2250ba03 | 215 | pieces[y][x].makeEmpty(); |
reinaldo422 | 0:fabe2250ba03 | 216 | repaint(pieces[y][x].level, x, y); |
reinaldo422 | 0:fabe2250ba03 | 217 | y--; |
reinaldo422 | 0:fabe2250ba03 | 218 | moved = true; |
reinaldo422 | 0:fabe2250ba03 | 219 | } else if(pieces[y-1][x].matches(pieces[y][x])) { |
reinaldo422 | 0:fabe2250ba03 | 220 | score += pieces[y][x].level * 2; |
reinaldo422 | 0:fabe2250ba03 | 221 | pieces[y-1][x].upgrade(); |
reinaldo422 | 0:fabe2250ba03 | 222 | repaint(pieces[y-1][x].level, x, y-1); |
reinaldo422 | 0:fabe2250ba03 | 223 | pieces[y][x].makeEmpty(); |
reinaldo422 | 0:fabe2250ba03 | 224 | repaint(pieces[y][x].level, x, y); |
reinaldo422 | 0:fabe2250ba03 | 225 | moved = true; |
reinaldo422 | 0:fabe2250ba03 | 226 | empty++; |
reinaldo422 | 0:fabe2250ba03 | 227 | updateScore(); |
reinaldo422 | 0:fabe2250ba03 | 228 | break; |
reinaldo422 | 0:fabe2250ba03 | 229 | } else { |
reinaldo422 | 0:fabe2250ba03 | 230 | return moved; |
reinaldo422 | 0:fabe2250ba03 | 231 | } |
reinaldo422 | 0:fabe2250ba03 | 232 | } |
reinaldo422 | 0:fabe2250ba03 | 233 | break; |
reinaldo422 | 0:fabe2250ba03 | 234 | case MOVE_DOWN: |
reinaldo422 | 0:fabe2250ba03 | 235 | while(y+1 < BOARD_SIZE && !(pieces[y][x].isEmpty())){ |
reinaldo422 | 0:fabe2250ba03 | 236 | if(pieces[y+1][x].isEmpty()) { |
reinaldo422 | 0:fabe2250ba03 | 237 | pieces[y+1][x].setLevel(pieces[y][x].level); |
reinaldo422 | 0:fabe2250ba03 | 238 | repaint(pieces[y+1][x].level, x, y+1); |
reinaldo422 | 0:fabe2250ba03 | 239 | pieces[y][x].makeEmpty(); |
reinaldo422 | 0:fabe2250ba03 | 240 | repaint(pieces[y][x].level, x, y); |
reinaldo422 | 0:fabe2250ba03 | 241 | y++; |
reinaldo422 | 0:fabe2250ba03 | 242 | moved = true; |
reinaldo422 | 0:fabe2250ba03 | 243 | } else if(pieces[y+1][x].matches(pieces[y][x])) { |
reinaldo422 | 0:fabe2250ba03 | 244 | score += pieces[y][x].level * 2; |
reinaldo422 | 0:fabe2250ba03 | 245 | pieces[y+1][x].upgrade(); |
reinaldo422 | 0:fabe2250ba03 | 246 | repaint(pieces[y+1][x].level, x, y+1); |
reinaldo422 | 0:fabe2250ba03 | 247 | pieces[y][x].makeEmpty(); |
reinaldo422 | 0:fabe2250ba03 | 248 | repaint(pieces[y][x].level, x, y); |
reinaldo422 | 0:fabe2250ba03 | 249 | moved = true; |
reinaldo422 | 0:fabe2250ba03 | 250 | empty++; |
reinaldo422 | 0:fabe2250ba03 | 251 | updateScore(); |
reinaldo422 | 0:fabe2250ba03 | 252 | break; |
reinaldo422 | 0:fabe2250ba03 | 253 | } else { |
reinaldo422 | 0:fabe2250ba03 | 254 | return moved; |
reinaldo422 | 0:fabe2250ba03 | 255 | } |
reinaldo422 | 0:fabe2250ba03 | 256 | } |
reinaldo422 | 0:fabe2250ba03 | 257 | break; |
reinaldo422 | 0:fabe2250ba03 | 258 | case MOVE_LEFT: |
reinaldo422 | 0:fabe2250ba03 | 259 | while(x-1 >= 0 && !(pieces[y][x].isEmpty())){ |
reinaldo422 | 0:fabe2250ba03 | 260 | if(pieces[y][x-1].isEmpty()) { |
reinaldo422 | 0:fabe2250ba03 | 261 | pieces[y][x-1].setLevel(pieces[y][x].level); |
reinaldo422 | 0:fabe2250ba03 | 262 | repaint(pieces[y][x-1].level, x-1, y); |
reinaldo422 | 0:fabe2250ba03 | 263 | pieces[y][x].makeEmpty(); |
reinaldo422 | 0:fabe2250ba03 | 264 | repaint(pieces[y][x].level, x, y); |
reinaldo422 | 0:fabe2250ba03 | 265 | x--; |
reinaldo422 | 0:fabe2250ba03 | 266 | moved = true; |
reinaldo422 | 0:fabe2250ba03 | 267 | } else if(pieces[y][x-1].matches(pieces[y][x])) { |
reinaldo422 | 0:fabe2250ba03 | 268 | score += pieces[y][x].level * 2; |
reinaldo422 | 0:fabe2250ba03 | 269 | pieces[y][x-1].upgrade(); |
reinaldo422 | 0:fabe2250ba03 | 270 | repaint(pieces[y][x-1].level, x-1, y); |
reinaldo422 | 0:fabe2250ba03 | 271 | pieces[y][x].makeEmpty(); |
reinaldo422 | 0:fabe2250ba03 | 272 | repaint(pieces[y][x].level, x, y); |
reinaldo422 | 0:fabe2250ba03 | 273 | moved = true; |
reinaldo422 | 0:fabe2250ba03 | 274 | empty++; |
reinaldo422 | 0:fabe2250ba03 | 275 | updateScore(); |
reinaldo422 | 0:fabe2250ba03 | 276 | break; |
reinaldo422 | 0:fabe2250ba03 | 277 | } else { |
reinaldo422 | 0:fabe2250ba03 | 278 | return moved; |
reinaldo422 | 0:fabe2250ba03 | 279 | } |
reinaldo422 | 0:fabe2250ba03 | 280 | } |
reinaldo422 | 0:fabe2250ba03 | 281 | break; |
reinaldo422 | 0:fabe2250ba03 | 282 | case MOVE_RIGHT: |
reinaldo422 | 0:fabe2250ba03 | 283 | while(x+1 < BOARD_SIZE && !(pieces[y][x].isEmpty())){ |
reinaldo422 | 0:fabe2250ba03 | 284 | if(pieces[y][x+1].isEmpty()) { |
reinaldo422 | 0:fabe2250ba03 | 285 | pieces[y][x+1].setLevel(pieces[y][x].level); |
reinaldo422 | 0:fabe2250ba03 | 286 | repaint(pieces[y][x+1].level, x+1, y); |
reinaldo422 | 0:fabe2250ba03 | 287 | pieces[y][x].makeEmpty(); |
reinaldo422 | 0:fabe2250ba03 | 288 | repaint(pieces[y][x].level, x, y); |
reinaldo422 | 0:fabe2250ba03 | 289 | x++; |
reinaldo422 | 0:fabe2250ba03 | 290 | moved = true; |
reinaldo422 | 0:fabe2250ba03 | 291 | } else if(pieces[y][x+1].matches(pieces[y][x])) { |
reinaldo422 | 0:fabe2250ba03 | 292 | score += pieces[y][x].level * 2; |
reinaldo422 | 0:fabe2250ba03 | 293 | pieces[y][x+1].upgrade(); |
reinaldo422 | 0:fabe2250ba03 | 294 | repaint(pieces[y][x+1].level, x+1, y); |
reinaldo422 | 0:fabe2250ba03 | 295 | pieces[y][x].makeEmpty(); |
reinaldo422 | 0:fabe2250ba03 | 296 | repaint(pieces[y][x].level, x, y); |
reinaldo422 | 0:fabe2250ba03 | 297 | moved = true; |
reinaldo422 | 0:fabe2250ba03 | 298 | empty++; |
reinaldo422 | 0:fabe2250ba03 | 299 | updateScore(); |
reinaldo422 | 0:fabe2250ba03 | 300 | break; |
reinaldo422 | 0:fabe2250ba03 | 301 | } else { |
reinaldo422 | 0:fabe2250ba03 | 302 | return moved; |
reinaldo422 | 0:fabe2250ba03 | 303 | } |
reinaldo422 | 0:fabe2250ba03 | 304 | } |
reinaldo422 | 0:fabe2250ba03 | 305 | break; |
reinaldo422 | 0:fabe2250ba03 | 306 | } |
reinaldo422 | 0:fabe2250ba03 | 307 | return moved; |
reinaldo422 | 0:fabe2250ba03 | 308 | } |
reinaldo422 | 0:fabe2250ba03 | 309 | |
reinaldo422 | 0:fabe2250ba03 | 310 | void GameBoard::addRandomPiece() { |
reinaldo422 | 0:fabe2250ba03 | 311 | int spot1x, spot1y; |
reinaldo422 | 0:fabe2250ba03 | 312 | do { |
reinaldo422 | 0:fabe2250ba03 | 313 | spot1x = rand() % BOARD_SIZE; |
reinaldo422 | 0:fabe2250ba03 | 314 | spot1y = rand() % BOARD_SIZE; |
reinaldo422 | 0:fabe2250ba03 | 315 | } while(!(pieces[spot1y][spot1x].isEmpty())); |
reinaldo422 | 0:fabe2250ba03 | 316 | float randFloat = static_cast <float> (rand()) / static_cast <float> (RAND_MAX); |
reinaldo422 | 0:fabe2250ba03 | 317 | int val = 0; |
reinaldo422 | 0:fabe2250ba03 | 318 | if(randFloat < 0.875) { |
reinaldo422 | 0:fabe2250ba03 | 319 | val = 2; |
reinaldo422 | 0:fabe2250ba03 | 320 | } else { |
reinaldo422 | 0:fabe2250ba03 | 321 | val = 4; |
reinaldo422 | 0:fabe2250ba03 | 322 | } |
reinaldo422 | 0:fabe2250ba03 | 323 | pieces[spot1y][spot1x].level = val; |
reinaldo422 | 0:fabe2250ba03 | 324 | repaint(pieces[spot1y][spot1x].level, spot1x, spot1y); |
reinaldo422 | 0:fabe2250ba03 | 325 | empty--; |
reinaldo422 | 0:fabe2250ba03 | 326 | } |
reinaldo422 | 0:fabe2250ba03 | 327 | |
reinaldo422 | 0:fabe2250ba03 | 328 | |
reinaldo422 | 0:fabe2250ba03 | 329 | int main() { |
reinaldo422 | 0:fabe2250ba03 | 330 | GameBoard board; |
reinaldo422 | 0:fabe2250ba03 | 331 | DigitalIn left(p21); |
reinaldo422 | 0:fabe2250ba03 | 332 | DigitalIn down(p22); |
reinaldo422 | 0:fabe2250ba03 | 333 | DigitalIn up(p23); |
reinaldo422 | 0:fabe2250ba03 | 334 | DigitalIn right(p24); |
reinaldo422 | 0:fabe2250ba03 | 335 | left.mode(PullUp); |
reinaldo422 | 0:fabe2250ba03 | 336 | down.mode(PullUp); |
reinaldo422 | 0:fabe2250ba03 | 337 | up.mode(PullUp); |
reinaldo422 | 0:fabe2250ba03 | 338 | right.mode(PullUp); |
reinaldo422 | 0:fabe2250ba03 | 339 | wait(0.5); |
reinaldo422 | 0:fabe2250ba03 | 340 | bool moved = false; |
reinaldo422 | 0:fabe2250ba03 | 341 | while(1) { |
reinaldo422 | 0:fabe2250ba03 | 342 | moved = false; |
reinaldo422 | 0:fabe2250ba03 | 343 | if(left.read() == 0) { |
reinaldo422 | 0:fabe2250ba03 | 344 | moved = board.moveBoard(MOVE_LEFT); |
reinaldo422 | 0:fabe2250ba03 | 345 | printer.printf("MOVE LEFT\n"); |
reinaldo422 | 0:fabe2250ba03 | 346 | } else if(right.read() == 0) { |
reinaldo422 | 0:fabe2250ba03 | 347 | moved = board.moveBoard(MOVE_RIGHT); |
reinaldo422 | 0:fabe2250ba03 | 348 | printer.printf("MOVE RIGHT\n"); |
reinaldo422 | 0:fabe2250ba03 | 349 | } else if(up.read() == 0) { |
reinaldo422 | 0:fabe2250ba03 | 350 | moved = board.moveBoard(MOVE_UP); |
reinaldo422 | 0:fabe2250ba03 | 351 | printer.printf("MOVE UP\n"); |
reinaldo422 | 0:fabe2250ba03 | 352 | } else if(down.read() == 0) { |
reinaldo422 | 0:fabe2250ba03 | 353 | moved = board.moveBoard(MOVE_DOWN); |
reinaldo422 | 0:fabe2250ba03 | 354 | printer.printf("MOVE DOWN\n"); |
reinaldo422 | 0:fabe2250ba03 | 355 | } |
reinaldo422 | 0:fabe2250ba03 | 356 | if(moved) { |
reinaldo422 | 0:fabe2250ba03 | 357 | board.addRandomPiece(); |
reinaldo422 | 0:fabe2250ba03 | 358 | if(board.empty == 0 && !(board.checkLose())) board.lose(); |
reinaldo422 | 0:fabe2250ba03 | 359 | } |
reinaldo422 | 0:fabe2250ba03 | 360 | else |
reinaldo422 | 0:fabe2250ba03 | 361 | wait(0.2); |
reinaldo422 | 0:fabe2250ba03 | 362 | } |
reinaldo422 | 0:fabe2250ba03 | 363 | } |