如何用C语言写一个控制台版的2048

发布时间:2021-10-27 15:53:53 作者:柒染
来源:亿速云 阅读:198

如何用C语言写一个控制台版的2048

2048是一款非常流行的数字益智游戏,玩家通过滑动数字方块,使相同数字的方块合并,最终达到2048的方块。本文将介绍如何使用C语言编写一个简单的控制台版2048游戏。

1. 游戏规则

2048的游戏规则非常简单: - 游戏在一个4x4的方格中进行。 - 每次操作,玩家可以选择上、下、左、右四个方向滑动方块。 - 滑动后,所有方块会朝该方向移动,直到碰到边界或其他方块。 - 如果两个相同数字的方块在移动过程中相遇,它们会合并成一个方块,数字为两者之和。 - 每次滑动后,系统会在空白位置随机生成一个2或4的方块。 - 游戏目标是通过合并方块,最终得到一个2048的方块。

2. 游戏设计

2.1 数据结构

首先,我们需要一个4x4的二维数组来表示游戏棋盘:

int board[4][4];

2.2 初始化棋盘

游戏开始时,棋盘上应该有两个随机位置的2或4。我们可以使用以下代码来初始化棋盘:

void init_board() {
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            board[i][j] = 0;
        }
    }
    add_random_tile();
    add_random_tile();
}

2.3 添加随机方块

每次滑动后,我们需要在空白位置随机添加一个2或4的方块:

void add_random_tile() {
    int empty_cells[16][2];
    int count = 0;

    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            if (board[i][j] == 0) {
                empty_cells[count][0] = i;
                empty_cells[count][1] = j;
                count++;
            }
        }
    }

    if (count > 0) {
        int index = rand() % count;
        int value = (rand() % 10 == 0) ? 4 : 2;
        board[empty_cells[index][0]][empty_cells[index][1]] = value;
    }
}

2.4 滑动方块

滑动方块的逻辑比较复杂,我们需要分别处理上、下、左、右四个方向的滑动。以向左滑动为例:

void slide_left() {
    for (int i = 0; i < 4; i++) {
        int last_merged = -1;
        for (int j = 1; j < 4; j++) {
            if (board[i][j] != 0) {
                int k = j;
                while (k > 0 && board[i][k - 1] == 0) {
                    board[i][k - 1] = board[i][k];
                    board[i][k] = 0;
                    k--;
                }
                if (k > 0 && board[i][k - 1] == board[i][k] && last_merged != k - 1) {
                    board[i][k - 1] *= 2;
                    board[i][k] = 0;
                    last_merged = k - 1;
                }
            }
        }
    }
}

其他方向的滑动逻辑类似,只是遍历的顺序和方向不同。

2.5 判断游戏结束

游戏结束的条件是棋盘上没有空白位置,并且无法通过滑动合并任何方块。我们可以通过以下代码来判断:

int is_game_over() {
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            if (board[i][j] == 0) {
                return 0;
            }
            if (i < 3 && board[i][j] == board[i + 1][j]) {
                return 0;
            }
            if (j < 3 && board[i][j] == board[i][j + 1]) {
                return 0;
            }
        }
    }
    return 1;
}

2.6 主循环

游戏的主循环负责处理用户输入、更新棋盘状态、显示棋盘等操作:

void game_loop() {
    char input;
    while (1) {
        print_board();
        if (is_game_over()) {
            printf("Game Over!\n");
            break;
        }
        input = getchar();
        switch (input) {
            case 'w': slide_up(); break;
            case 's': slide_down(); break;
            case 'a': slide_left(); break;
            case 'd': slide_right(); break;
            default: continue;
        }
        add_random_tile();
    }
}

3. 完整代码

以下是完整的C语言代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int board[4][4];

void init_board() {
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            board[i][j] = 0;
        }
    }
    add_random_tile();
    add_random_tile();
}

void add_random_tile() {
    int empty_cells[16][2];
    int count = 0;

    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            if (board[i][j] == 0) {
                empty_cells[count][0] = i;
                empty_cells[count][1] = j;
                count++;
            }
        }
    }

    if (count > 0) {
        int index = rand() % count;
        int value = (rand() % 10 == 0) ? 4 : 2;
        board[empty_cells[index][0]][empty_cells[index][1]] = value;
    }
}

void slide_left() {
    for (int i = 0; i < 4; i++) {
        int last_merged = -1;
        for (int j = 1; j < 4; j++) {
            if (board[i][j] != 0) {
                int k = j;
                while (k > 0 && board[i][k - 1] == 0) {
                    board[i][k - 1] = board[i][k];
                    board[i][k] = 0;
                    k--;
                }
                if (k > 0 && board[i][k - 1] == board[i][k] && last_merged != k - 1) {
                    board[i][k - 1] *= 2;
                    board[i][k] = 0;
                    last_merged = k - 1;
                }
            }
        }
    }
}

void slide_right() {
    for (int i = 0; i < 4; i++) {
        int last_merged = -1;
        for (int j = 2; j >= 0; j--) {
            if (board[i][j] != 0) {
                int k = j;
                while (k < 3 && board[i][k + 1] == 0) {
                    board[i][k + 1] = board[i][k];
                    board[i][k] = 0;
                    k++;
                }
                if (k < 3 && board[i][k + 1] == board[i][k] && last_merged != k + 1) {
                    board[i][k + 1] *= 2;
                    board[i][k] = 0;
                    last_merged = k + 1;
                }
            }
        }
    }
}

void slide_up() {
    for (int j = 0; j < 4; j++) {
        int last_merged = -1;
        for (int i = 1; i < 4; i++) {
            if (board[i][j] != 0) {
                int k = i;
                while (k > 0 && board[k - 1][j] == 0) {
                    board[k - 1][j] = board[k][j];
                    board[k][j] = 0;
                    k--;
                }
                if (k > 0 && board[k - 1][j] == board[k][j] && last_merged != k - 1) {
                    board[k - 1][j] *= 2;
                    board[k][j] = 0;
                    last_merged = k - 1;
                }
            }
        }
    }
}

void slide_down() {
    for (int j = 0; j < 4; j++) {
        int last_merged = -1;
        for (int i = 2; i >= 0; i--) {
            if (board[i][j] != 0) {
                int k = i;
                while (k < 3 && board[k + 1][j] == 0) {
                    board[k + 1][j] = board[k][j];
                    board[k][j] = 0;
                    k++;
                }
                if (k < 3 && board[k + 1][j] == board[k][j] && last_merged != k + 1) {
                    board[k + 1][j] *= 2;
                    board[k][j] = 0;
                    last_merged = k + 1;
                }
            }
        }
    }
}

int is_game_over() {
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            if (board[i][j] == 0) {
                return 0;
            }
            if (i < 3 && board[i][j] == board[i + 1][j]) {
                return 0;
            }
            if (j < 3 && board[i][j] == board[i][j + 1]) {
                return 0;
            }
        }
    }
    return 1;
}

void print_board() {
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%4d", board[i][j]);
        }
        printf("\n");
    }
}

void game_loop() {
    char input;
    while (1) {
        print_board();
        if (is_game_over()) {
            printf("Game Over!\n");
            break;
        }
        input = getchar();
        switch (input) {
            case 'w': slide_up(); break;
            case 's': slide_down(); break;
            case 'a': slide_left(); break;
            case 'd': slide_right(); break;
            default: continue;
        }
        add_random_tile();
    }
}

int main() {
    srand(time(NULL));
    init_board();
    game_loop();
    return 0;
}

4. 总结

通过以上步骤,我们实现了一个简单的控制台版2048游戏。虽然这个版本没有图形界面,但它展示了如何使用C语言实现游戏的核心逻辑。你可以在此基础上进一步扩展,比如添加分数统计、游戏存档等功能。

推荐阅读:
  1. 400行代码编C语言控制台界版2048游戏,编写疯子一样的C语言代码
  2. 2048网页版源代码

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c语言

上一篇:怎么用keil编程C语言

下一篇:Mysql数据分组排名实现的示例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》