5 bool move_possible_north(board *b);
6 bool move_possible_south(board *b);
7 bool move_possible_east(board *b);
8 bool move_possible_west(board *b);
10 void move_north(board *b);
11 void move_south(board *b);
12 void move_east(board *b);
13 void move_west(board *b);
14 void merge(board *b, const int d);
15 void merge_north(board *b);
16 void merge_south(board *b);
17 void merge_east(board *b);
18 void merge_west(board *b);
20 void place_new_piece(board *b);
21 void game_loop(board *b);
24 board *tmp = malloc(sizeof(board));
29 void init_board(board *b) {
30 for(int i = 0; i < 4; ++i) {
31 for(int j = 0; j < 4; ++j)
36 srand((uint)time(NULL));
38 // second piece will be placed in game_loop
42 board *b = new_board();
48 void game_loop(board *b) {
52 while(move_possible_any(b)) {
56 printf("Make a move:\n");
57 fgets(c, sizeof(c), stdin);
75 printf("Invalid move: %c\n", c[0]);
80 if(!move_possible(b, d)) {
81 printf("Move not possible: %c\n", c[0]);
88 void place_new_piece(board *b) {
89 int prob = rand() % 100;
95 for(int i = 0; i < 4; ++i) {
96 for(int j = 0; j < 4; ++j) {
106 rx = possibs[2*pair];
107 ry = possibs[2*pair+1];
108 assert(b->x[rx][ry] == 0);
117 void free_board(board *b) {
121 void make_move(board *b, const int d) {
122 bool ok = (d == south) ||
128 * checked before already
129 * if(!move_possible(b, d))
137 bool move_possible_any(board *b) {
140 if(move_possible_south(b))
142 if(move_possible_east(b))
144 if(move_possible_north(b))
146 if(move_possible_west(b))
151 bool move_possible(board *b, const int d) {
152 bool ok = (d == south) ||
159 return move_possible_north(b);
161 return move_possible_south(b);
163 return move_possible_east(b);
165 return move_possible_west(b);
166 default: // will never execute anyway
171 void move(board *b, const int d) {
172 bool ok = (d == south) ||
190 default: // will never execute anyway
195 void merge(board *b, const int d) {
196 bool ok = (d == south) ||
214 default: // will never execute anyway
219 bool move_possible_south(board *b) {
220 for(int i = 0; i < 4; ++i) {
221 for(int j = 0; j < 3; ++j) {
222 if(b->x[i][j] != 0) {
223 if(b->x[i][j+1] == 0)
225 if(b->x[i][j] == b->x[i][j+1])
233 bool move_possible_north(board *b) {
234 for(int i = 0; i < 4; ++i) {
235 for(int j = 1; j < 4; ++j) {
236 if(b->x[i][j] != 0) {
237 if(b->x[i][j-1] == 0)
239 if(b->x[i][j] == b->x[i][j-1])
247 bool move_possible_east(board *b) {
248 for(int i = 0; i < 3; ++i) {
249 for(int j = 0; j < 4; ++j) {
250 if(b->x[i][j] != 0) {
251 if(b->x[i+1][j] == 0)
253 if(b->x[i+1][j] == b->x[i][j])
261 bool move_possible_west(board *b) {
262 for(int i = 1; i < 4; ++i) {
263 for(int j = 0; j < 4; ++j) {
264 if(b->x[i][j] != 0) {
265 if(b->x[i-1][j] == 0)
267 if(b->x[i-1][j] == b->x[i][j])
275 void move_north(board *b) {
277 for(int i = 0; i < 4; ++i) {
278 for(int j = 1; j < 4; ++j) {
279 if(b->x[i][j] != 0) {
281 while(b->x[i][k-1] == 0) {
282 b->x[i][k-1] = b->x[i][k];
293 void move_south(board *b) {
295 for(int i = 0; i < 4; ++i) {
296 for(int j = 2; j >= 0; --j) {
297 if(b->x[i][j] != 0) {
299 while(b->x[i][k+1] == 0) {
300 b->x[i][k+1] = b->x[i][k];
311 void move_east(board *b) {
313 for(int i = 2; i >= 0; --i) {
314 for(int j = 0; j < 4; ++j) {
315 if(b->x[i][j] != 0) {
317 while(b->x[k+1][j] == 0) {
318 b->x[k+1][j] = b->x[k][j];
329 void move_west(board *b) {
331 for(int i = 1; i < 4; ++i) {
332 for(int j = 0; j < 4; ++j) {
333 if(b->x[i][j] != 0) {
335 while(b->x[k-1][j] == 0) {
336 b->x[k-1][j] = b->x[k][j];
347 void merge_north(board *b) {
348 for(int i = 0; i < 4; ++i) {
349 for(int j = 1; j < 4; ++j) {
350 if(b->x[i][j] != 0 && b->x[i][j] == b->x[i][j-1]) {
354 b->points += b->x[i][j-1];
360 void merge_south(board *b) {
361 for(int i = 0; i < 4; ++i) {
362 for(int j = 2; j >= 0; --j) {
363 if(b->x[i][j] != 0 && b->x[i][j] == b->x[i][j+1]) {
367 b->points += b->x[i][j+1];
373 void merge_east(board *b) {
374 for(int i = 2; i >= 0; --i) {
375 for(int j = 0; j < 4; ++j) {
376 if(b->x[i][j] != 0 && b->x[i+1][j] == b->x[i][j]) {
378 b->points += b->x[i+1][j];
386 void merge_west(board *b) {
387 for(int i = 1; i < 4; ++i) {
388 for(int j = 0; j < 4; ++j) {
389 if(b->x[i][j] != 0 && b->x[i-1][j] == b->x[i][j]) {
391 b->points += b->x[i-1][j];
400 printf("||--------------------------------------------------------------||\n");
403 void print_board_line(board *b, int l) {
404 printf("||\t%u\t|\t%u\t|\t%u\t|\t%u\t||\n", b->x[0][l], b->x[1][l], b->x[2][l], b->x[3][l]);
408 void print_board(board *b) {
409 printf("Score: %u\n", b->points);
411 for(int i = 0; i < 4; ++i) {
412 print_board_line(b, i);
417 void print_score(board *b) {
418 printf("Game Over\nScore:%u\n", b->points);
422 board *b = new_board();
426 assert(b->x[3][0] == 4);
430 board *b = new_board();
438 assert(b->x[0][0] == 4);
442 board *b = new_board();
448 assert(b->x[0][0] == 4);
452 board *b = new_board();
458 assert(b->x[0][3] == 4);
461 void move_merge_test1() {
462 board *b = new_board();
471 assert(b->x[3][3] == 4);
474 void move_north_test() {
475 board *b = new_board();
491 assert(b->x[2][0] == 8);
492 assert(b->x[0][0] == 2);
495 void move_merge_test2() {
496 board *b = new_board();
506 assert(b->x[3][1] == 4);
509 void move_merge_test3() {
510 board *b = new_board();
532 assert(b->x[3][1] == 4);