- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
-
- int array[4][4] = {
- {0, 0, 0, 0},
- {0, 0, 0, 0},
- {0, 0, 0, 0},
- {0, 0, 0, 0}
- };
-
- // 显示游戏板
- void print_board() {
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- printf("%4d ", array[i][j]);
- }
- printf("\n");
- }
- printf("\n");
- }
-
- // 随机在空位置生成2或4
- void add_random_tile() {
- int empty_tiles[16][2];
- int empty_count = 0;
-
- // 找到所有空位置
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- if (array[i][j] == 0) {
- empty_tiles[empty_count][0] = i;
- empty_tiles[empty_count][1] = j;
- empty_count++;
- }
- }
- }
-
- // 如果有空位置,随机选择一个并生成2或4
- if (empty_count > 0) {
- int random_index = rand() % empty_count;
- int random_value = (rand() % 2 + 1) * 2;
- array[empty_tiles[random_index][0]][empty_tiles[random_index][1]] = random_value;
- }
- }
-
- // 向上移动
- void move_up() {
- for (int j = 0; j < 4; j++) {
- int last_merge = -1; // 记录上次合并的位置
- for (int i = 1; i < 4; i++) {
- if (array[i][j] != 0) {
- int k = i;
- while (k > 0 && array[k-1][j] == 0) {
- array[k-1][j] = array[k][j];
- array[k][j] = 0;
- k--;
- }
- if (k > 0 && array[k-1][j] == array[k][j] && last_merge != k-1) {
- array[k-1][j] *= 2;
- array[k][j] = 0;
- last_merge = k-1;
- }
- }
- }
- }
- }
-
- // 向下移动
- void move_down() {
- for (int j = 0; j < 4; j++) {
- int last_merge = -1;
- for (int i = 2; i >= 0; i--) {
- if (array[i][j] != 0) {
- int k = i;
- while (k < 3 && array[k+1][j] == 0) {
- array[k+1][j] = array[k][j];
- array[k][j] = 0;
- k++;
- }
- if (k < 3 && array[k+1][j] == array[k][j] && last_merge != k+1) {
- array[k+1][j] *= 2;
- array[k][j] = 0;
- last_merge = k+1;
- }
- }
- }
- }
- }
-
- // 向左移动
- void move_left() {
- for (int i = 0; i < 4; i++) {
- int last_merge = -1;
- for (int j = 1; j < 4; j++) {
- if (array[i][j] != 0) {
- int k = j;
- while (k > 0 && array[i][k-1] == 0) {
- array[i][k-1] = array[i][k];
- array[i][k] = 0;
- k--;
- }
- if (k > 0 && array[i][k-1] == array[i][k] && last_merge != k-1) {
- array[i][k-1] *= 2;
- array[i][k] = 0;
- last_merge = k-1;
- }
- }
- }
- }
- }
-
- // 向右移动
- void move_right() {
- for (int i = 0; i < 4; i++) {
- int last_merge = -1;
- for (int j = 2; j >= 0; j--) {
- if (array[i][j] != 0) {
- int k = j;
- while (k < 3 && array[i][k+1] == 0) {
- array[i][k+1] = array[i][k];
- array[i][k] = 0;
- k++;
- }
- if (k < 3 && array[i][k+1] == array[i][k] && last_merge != k+1) {
- array[i][k+1] *= 2;
- array[i][k] = 0;
- last_merge = k+1;
- }
- }
- }
- }
- }
-
- // 检查游戏是否结束
- int check_game_over() {
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- if (array[i][j] == 0) return 0; // 还有空位
- if (i > 0 && array[i][j] == array[i-1][j]) return 0; // 上下相等
- if (j > 0 && array[i][j] == array[i][j-1]) return 0; // 左右相等
- }
- }
- return 1; // 游戏结束
- }
-
- int main() {
- srand(time(NULL));
- add_random_tile();
- add_random_tile();
-
- char command;
- while (1) {
- print_board();
- if (check_game_over()) {
- printf("Game Over!\n");
- break;
- }
-
- printf("Enter move (w=up, s=down, a=left, d=right): ");
- command = getchar();
- getchar(); // 消耗掉换行符
-
- switch (command) {
- case 'w': move_up(); break;
- case 's': move_down(); break;
- case 'a': move_left(); break;
- case 'd': move_right(); break;
- default: printf("Invalid move!\n"); continue;
- }
-
- add_random_tile();
- }
-
- return 0;
- }
复制代码
|