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.

Dependencies:   4DGLtest mbed

Committer:
reinaldo422
Date:
Wed Oct 22 05:26:08 2014 +0000
Revision:
0:fabe2250ba03
initial commit

Who changed what in which revision?

UserRevisionLine numberNew 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 }