
使用 C++ 实现 2048 小游戏
2048 小游戏基于 C++ 语言开发,涵盖棋盘初始化、随机数生成、用户指令解析、数字合并移动逻辑及胜负判定机制。核心功能包括二维数组管理、方向键输入处理、相同数值合并算法以及游戏状态检测。

2048 小游戏基于 C++ 语言开发,涵盖棋盘初始化、随机数生成、用户指令解析、数字合并移动逻辑及胜负判定机制。核心功能包括二维数组管理、方向键输入处理、相同数值合并算法以及游戏状态检测。



在编写游戏前,需明确 2048 的基本规则:
实现步骤如下:
使用二维数组表示棋盘,元素初始值为 0。
定义一个 4x4 的二维数组 gameBoard,并将所有元素初始化为 0。
int gameBoard[4][4] = {0};
游戏开始时,在界面的两个格子中随机生成数字 2 或 4。
使用 rand() 函数生成伪随机数,并限定范围后填入随机位置。
#include <cstdlib>
#include <ctime>
void generateRandomNumbers() {
int x1 = rand() % 4;
int y1 = rand() % 4;
int x2 = rand() % 4;
int y2 = rand() % 4;
int num1 = (rand() % 2 + 1) * 2;
int num2 = (rand() % 2 + 1) * 2;
gameBoard[x1][y1] = num1;
gameBoard[x2][y2] = num2;
}
捕捉用户键盘输入,根据操作移动格子。
使用 getchar() 获取输入,并根据字符执行对应方向操作。
void processUserInput() {
char userInput = getchar();
switch (userInput) {
case 'w':
// 处理上键操作
break;
case 's':
// 处理下键操作
break;
case 'a':
// 处理左键操作
break;
case 'd':
// 处理右键操作
break;
default:
break;
}
}
将数字向指定方向移动,并填充空白格子。
当相邻两个格子数字相同时,合并为一个,结果放入新位置。
将所有数字向指定方向移动,填补空白。
#define SIZE 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;
}
判断是否达到 2048 或无法继续移动。
遍历棋盘,若存在 2048 则获胜。
检查是否有空位或可合并项,若无则失败。
bool isGameWon() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (gameBoard[i][j] == 2048) {
return true;
}
}
}
return false;
}
bool isGameOver() {
bool canMove = false;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (gameBoard[i][j] == 0) {
canMove = true;
break;
}
if (i < 3 && gameBoard[i][j] == gameBoard[i + 1][j]) {
canMove = true;
break;
}
if (j < 3 && gameBoard[i][j] == gameBoard[i][j + 1]) {
canMove = true;
break;
}
}
}
return !canMove;
}

本文实现了 2048 小游戏的核心逻辑,包括界面管理、数据生成、交互处理及状态判定。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online