Created
July 15, 2018 16:37
-
-
Save beiweiqiang/f196587aadf88cd2b1d50899fa20c9da to your computer and use it in GitHub Desktop.
2048 in c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <time.h> | |
// 定义方格边大小 | |
#define SIZE 4 | |
#define INIT_RAND_COUNT 2 | |
// 表示位置 | |
typedef struct { int x; int y; } pos; | |
/* | |
* 打印结果 ui | |
* */ | |
void print_result (int result[][SIZE]) { | |
printf("|"); | |
for (int i = 0; i < SIZE; ++i) { | |
printf("-----|"); | |
} | |
printf("\n"); | |
for (int j = 0; j < SIZE; ++j) { | |
printf("|"); | |
for (int i = 0; i < SIZE; ++i) { | |
printf("%5d|", result[j][i]); | |
} | |
printf("\n"); | |
printf("|"); | |
for (int i = 0; i < SIZE; ++i) { | |
printf("-----|"); | |
} | |
printf("\n"); | |
} | |
} | |
/* | |
* 设置 0 坐标数组 | |
* 返回 0 坐标的个数 | |
* */ | |
int get_empty_pos(int result[][SIZE], pos * position) { | |
int len = 0; | |
for (int i = 0; i < SIZE; ++i) { | |
for (int j = 0; j < SIZE; ++j) { | |
if (result[i][j] == 0) { | |
position->x = i; | |
position->y = j; | |
position++; | |
len++; | |
} | |
} | |
} | |
return len; | |
} | |
/* | |
* 随机取一个 0 的位置, 置值为 2 | |
* */ | |
void rand_set_init_value (int result[][SIZE]) { | |
pos * pos_arr = malloc(SIZE * SIZE * sizeof(pos)); | |
int len = get_empty_pos(result, pos_arr); | |
int ran_pos = rand() % len; | |
result[pos_arr[ran_pos].x][pos_arr[ran_pos].y] = 2; | |
free(pos_arr); | |
} | |
/* | |
* 将数组内的非 0 数, 往前移动 | |
* */ | |
void array_forward_move(int arr[], int len) { | |
int index = 0; | |
for (int i = 0; i < len; ++i) { | |
if (arr[i] != 0) { | |
arr[index] = arr[i]; | |
index++; | |
} | |
} | |
for (int j = index; j < len; ++j) { | |
arr[j] = 0; | |
} | |
} | |
/* | |
* 合并相邻的两个相同的数 | |
* */ | |
void merge_adjacent_same(int arr[], int len) { | |
for (int i = 0; i < len; ++i) { | |
if (arr[i] == arr[i + 1]) { | |
arr[i] *= 2; | |
arr[i + 1] = 0; | |
++i; | |
} | |
} | |
} | |
void result_up(int result[][SIZE]) { | |
for (int i = 0; i < SIZE; ++i) { | |
int arr[SIZE]; | |
for (int j = 0; j < SIZE; ++j) { | |
arr[j] = result[j][i]; | |
} | |
array_forward_move(arr, SIZE); | |
merge_adjacent_same(arr, SIZE); | |
array_forward_move(arr, SIZE); | |
for (int k = 0; k < SIZE; ++k) { | |
result[k][i] = arr[k]; | |
} | |
} | |
rand_set_init_value(result); | |
} | |
void result_down(int result[][SIZE]) { | |
for (int i = 0; i < SIZE; ++i) { | |
int arr[SIZE]; | |
for (int j = 0; j < SIZE; ++j) { | |
arr[j] = result[SIZE - 1 - j][i]; | |
} | |
array_forward_move(arr, SIZE); | |
merge_adjacent_same(arr, SIZE); | |
array_forward_move(arr, SIZE); | |
for (int k = 0; k < SIZE; ++k) { | |
result[SIZE - 1 - k][i] = arr[k]; | |
} | |
} | |
rand_set_init_value(result); | |
} | |
void result_left(int result[][SIZE]) { | |
for (int i = 0; i < SIZE; ++i) { | |
int arr[SIZE]; | |
for (int j = 0; j < SIZE; ++j) { | |
arr[j] = result[i][j]; | |
} | |
array_forward_move(arr, SIZE); | |
merge_adjacent_same(arr, SIZE); | |
array_forward_move(arr, SIZE); | |
for (int k = 0; k < SIZE; ++k) { | |
result[i][k] = arr[k]; | |
} | |
} | |
rand_set_init_value(result); | |
} | |
void result_right(int result[][SIZE]) { | |
for (int i = 0; i < SIZE; ++i) { | |
int arr[SIZE]; | |
for (int j = 0; j < SIZE; ++j) { | |
arr[j] = result[i][SIZE - 1 - j]; | |
} | |
array_forward_move(arr, SIZE); | |
merge_adjacent_same(arr, SIZE); | |
array_forward_move(arr, SIZE); | |
for (int k = 0; k < SIZE; ++k) { | |
result[i][SIZE - 1 - k] = arr[k]; | |
} | |
} | |
rand_set_init_value(result); | |
} | |
/* | |
* 以下是单元测试代码 | |
* */ | |
void test_array_forward_move() { | |
int arr[] = {0, 0, 2, 2}; | |
int len = sizeof(arr) / sizeof(arr[0]); | |
array_forward_move(arr, len); | |
for (int i = 0; i < len; ++i) { | |
printf("%d ", arr[i]); | |
} | |
} | |
void test_merge_adjacent_same() { | |
int arr[] = {2, 2, 4, 2, 2, 4, 0, 0}; | |
int len = sizeof(arr) / sizeof(arr[0]); | |
merge_adjacent_same(arr, len); | |
for (int i = 0; i < len; ++i) { | |
printf("%d ", arr[i]); | |
} | |
} | |
void test_game(int result[][SIZE]) { | |
print_result(result); | |
int c; | |
while ((c = getchar()) != EOF) { | |
switch (c) { | |
case 'w': | |
result_up(result); | |
break; | |
case 's': | |
result_down(result); | |
break; | |
case 'a': | |
result_left(result); | |
break; | |
case 'd': | |
result_right(result); | |
break; | |
default: | |
break; | |
} | |
if (c != '\n') { | |
print_result(result); | |
} | |
} | |
} | |
int main() { | |
// 定义结果二维数组 | |
int result[SIZE][SIZE] = {0}; | |
// 产生随机初始数据 | |
srand(time(NULL)); | |
for (int i = 0; i < INIT_RAND_COUNT; ++i) { | |
rand_set_init_value(result); | |
} | |
test_game(result); | |
// test_array_forward_move(); | |
// test_merge_adjacent_same(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment