Skip to content

Instantly share code, notes, and snippets.

@beiweiqiang
Created July 15, 2018 16:37
Show Gist options
  • Save beiweiqiang/f196587aadf88cd2b1d50899fa20c9da to your computer and use it in GitHub Desktop.
Save beiweiqiang/f196587aadf88cd2b1d50899fa20c9da to your computer and use it in GitHub Desktop.
2048 in c
#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