跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 实现 2048 游戏核心逻辑解析

C++ 2048 游戏实现涉及棋盘初始化、随机数生成、用户输入响应及移动合并逻辑。核心数据结构为 4x4 二维数组,通过遍历与条件判断实现数字滑动与同值合并。胜负判定基于是否达到 2048 数值或棋盘无法继续移动。代码展示了上下左右四个方向的移动算法及游戏结束检测机制。

宁静发布于 2026/3/29更新于 2026/10/2589 浏览
C++ 实现 2048 游戏核心逻辑解析

2048 游戏规则简述

在动手编写之前,先明确核心机制:棋盘初始随机生成两个数字(通常是 2 或 4),玩家通过方向键移动方块,相同数字碰撞合并,目标达成 2048。若棋盘填满且无法移动则结束。

因此,我们可以将开发流程拆解为几个关键步骤:初始化界面、随机生成数字、处理用户输入、更新界面以及判断游戏状态。

1. 初始化游戏界面

我们需要一个二维数组来模拟 4x4 的棋盘,每个元素代表一个格子,初始值设为 0。

#define SIZE 4
int gameBoard[SIZE][SIZE] = {0};

这里定义了 SIZE 常量,方便后续统一修改棋盘大小。所有元素初始化为 0 表示空位。

2. 随机生成数字

游戏开始时,需要在棋盘的两个空白格中随机填入 2 或 4。使用 <cstdlib> 和 <ctime> 库可以生成伪随机数。

注意,实际运行时建议调用 srand(time(NULL)) 初始化随机种子,否则每次运行生成的序列可能相同。生成坐标后,将数值赋给对应位置即可。

#include <cstdlib>
#include <ctime>

void generateRandomNumbers() {
    srand(time(NULL)); // 初始化随机种子
    int x1 = rand() % SIZE;
    int y1 = rand() % SIZE;
    int x2 = rand() % SIZE;
    int y2 = rand() % SIZE;

    int num1 = (rand() % 2 + 1) * 2;
    int num2 = (rand() % 2 + 1) * 2;

    gameBoard[x1][y1] = num1;
    gameBoard[x2][y2] = num2;
}

3. 处理用户输入

捕捉用户的键盘操作,根据输入指令触发相应的移动逻辑。这里使用 getchar() 获取字符,并通过 switch 语句分发到不同方向的处理函数。

void processUserInput() {
    char userInput = getchar();
    switch (userInput) {
        case 'w':
            moveUp(gameBoard);
            break;
        case 's':
            moveDown(gameBoard);
            break;
        case 'a':
            moveLeft(gameBoard);
            break;
        case 'd':
            moveRight(gameBoard);
            break;
        default:
            break;
    }
}

4. 更新游戏界面

这是最核心的部分。当用户按下方向键时,需要将数字向指定方向移动,并填充空白格子。如果相邻的两个格子数字相同,则合并为一个,数值翻倍。

以向上移动为例,遍历每一列,从第二行开始检查。如果遇到非零元素,尝试将其向上'浮'直到遇到边界或其他数字。如果上方数字与当前相同,则合并。

bool moveUp(int board[SIZE][SIZE]) {
    bool moved = false;
    for (int j = 0; j < SIZE; j++) {
        for (int i = 1; i < SIZE; 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--;
                    moved = true;
                }
                if (k > 0 && board[k-1][j] == board[k][j]) {
                    board[k-1][j] *= 2;
                    board[k][j] = 0;
                    moved = true;
                }
            }
        }
    }
    return moved;
}

// 向下、向左、向右的逻辑类似,只需调整循环方向和比较索引
bool moveDown(int board[SIZE][SIZE]) {
    bool moved = false;
    for (int j = 0; j < SIZE; j++) {
        for (int i = SIZE - 2; i >= 0; i--) {
            if (board[i][j] != 0) {
                int k = i;
                while (k < SIZE - 1 && board[k+1][j] == 0) {
                    board[k+1][j] = board[k][j];
                    board[k][j] = 0;
                    k++;
                    moved = true;
                }
                if (k < SIZE - 1 && board[k+1][j] == board[k][j]) {
                    board[k+1][j] *= 2;
                    board[k][j] = 0;
                    moved = true;
                }
            }
        }
    }
    return moved;
}

bool moveLeft(int board[SIZE][SIZE]) {
    bool moved = false;
    for (int i = 0; i < SIZE; i++) {
        for (int j = 1; j < SIZE; 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--;
                    moved = true;
                }
                if (k > 0 && board[i][k-1] == board[i][k]) {
                    board[i][k-1] *= 2;
                    board[i][k] = 0;
                    moved = true;
                }
            }
        }
    }
    return moved;
}

bool moveRight(int board[SIZE][SIZE]) {
    bool moved = false;
    for (int i = 0; i < SIZE; i++) {
        for (int j = SIZE - 2; j >= 0; j--) {
            if (board[i][j] != 0) {
                int k = j;
                while (k < SIZE - 1 && board[i][k+1] == 0) {
                    board[i][k+1] = board[i][k];
                    board[i][k] = 0;
                    k++;
                    moved = true;
                }
                if (k < SIZE - 1 && board[i][k+1] == board[i][k]) {
                    board[i][k+1] *= 2;
                    board[i][k] = 0;
                    moved = true;
                }
            }
        }
    }
    return moved;
}

5. 判断游戏结束

游戏结束通常有两种情况:一是达到了胜利条件(出现 2048),二是失败条件(棋盘已满且无相邻可合并项)。

bool isGameWon() {
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            if (gameBoard[i][j] == 2048) {
                return true;
            }
        }
    }
    return false;
}

bool isGameOver() {
    bool canMove = false;
    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            // 如果有空位,说明还能继续
            if (gameBoard[i][j] == 0) {
                canMove = true;
                break;
            }
            // 检查右侧是否有相同数字
            if (j < SIZE - 1 && gameBoard[i][j] == gameBoard[i][j + 1]) {
                canMove = true;
                break;
            }
            // 检查下方是否有相同数字
            if (i < SIZE - 1 && gameBoard[i][j] == gameBoard[i + 1][j]) {
                canMove = true;
                break;
            }
        }
        if (canMove) break;
    }
    return !canMove;
}

通过以上模块组合,即可完成基础版 2048 的核心逻辑。重点在于数组操作与状态判断的准确性。

目录

  1. 2048 游戏规则简述
  2. 1. 初始化游戏界面
  3. 2. 随机生成数字
  4. 3. 处理用户输入
  5. 4. 更新游戏界面
  6. 5. 判断游戏结束

更多推荐文章

查看全部
  • AGV调度系统:基于改进A*算法的路径规划方案
  • UI UX Pro Max 驱动的现代前端 UI 工作流指南
  • Flutter mediapipe_core 鸿蒙化适配指南:端侧 AI 推理与视觉任务集成
  • Spring AI Agent Skills 接入实战指南
  • 高精度磁电绝对式编码器算法及方案实现
  • Python 3.12.0 的安装、环境配置与实战准备
  • 语义化 AI 驱动器:提示词工程的技术演进与未来应用
  • 10 款 AIGC 降重与论文辅助工具介绍
  • Python 结合 Vulkan 实现场景加速渲染技术解析
  • AIGC 辅助软件开发全流程实战:需求与设计篇
  • Palantir Foundry 五层架构模型详解
  • Windows 下 Docker Desktop 安装与配置指南
  • 县域烟花禁燃监管实践:Java 调用高德地图盘点销售点
  • Python 核心语法:函数
  • RabbitMQ C++ 客户端开发与 AMQP 协议解析
  • Llama-Factory 中启用梯度裁剪保护训练稳定性
  • GPT-OSS-20B 模型本地部署及 WebUI 交互指南
  • Arch Linux 使用 KDE Plasma 复刻 macOS 桌面风格指南
  • Lada 本地 AI 视频修复工具
  • 自适应图像变焦与边界框变换用于无人机目标检测

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online