在Linux环境用C语言实现2048小游戏,本质是用终端模拟一个4x4的数字矩阵,通过方向键控制行或列的滑动合并。不需要复杂依赖,掌握数组操作和终端输入读取即可完成。

一、游戏数据结构设计
使用二维数组保存棋盘状态,再用一个变量记录当前分数。每次移动后判断是否还能生成新方块。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 4
int board[SIZE][SIZE]; // 棋盘,0表示空
int score = 0;
// 初始化棋盘
void init_board() {
int i, j;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
board[i][j] = 0;
}
}
// 初始随机两个方块
board[rand() % SIZE][rand() % SIZE] = 2;
board[rand() % SIZE][rand() % SIZE] = 2;
}
二、核心合并逻辑
以向左滑动为例,每一行先压缩非零值到左侧,再相邻相同合并,合并后再次压缩。其他方向可借由矩阵旋转复用该逻辑。
// 处理单行向左合并,返回是否发生变化
int merge_left(int row[]) {
int i, j, changed = 0;
int tmp[SIZE] = {0};
int idx = 0;
// 压缩
for (i = 0; i < SIZE; i++) {
if (row[i] != 0) {
tmp[idx++] = row[i];
}
}
// 合并
for (i = 0; i < idx - 1; i++) {
if (tmp[i] == tmp[i + 1]) {
tmp[i] *= 2;
score += tmp[i];
tmp[i + 1] = 0;
changed = 1;
}
}
// 再次压缩
idx = 0;
for (i = 0; i < SIZE; i++) {
if (tmp[i] != 0) {
row[idx++] = tmp[i];
}
}
for (i = idx; i < SIZE; i++) {
row[i] = 0;
}
return changed;
}
三、随机生成新方块
每次有效移动后,在值为0的格子中等概率生成2(90%)或4(10%)。
void spawn() {
int empty[SIZE * SIZE];
int count = 0, i, j, pos;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
if (board[i][j] == 0) {
empty[count++] = i * SIZE + j;
}
}
}
if (count == 0) return;
pos = empty[rand() % count];
board[pos / SIZE][pos % SIZE] = (rand() % 10 == 0) ? 4 : 2;
}
四、终端输入与刷新
用system("clear")清屏重绘,方向键在Linux终端通常返回转义序列,可用getchar循环读取。下面给出简化输入判断:
// 读取方向:返回 'l','r','u','d' 或 'q'退出
char read_input() {
char c = getchar();
if (c == 'a') return 'l';
if (c == 'd') return 'r';
if (c == 'w') return 'u';
if (c == 's') return 'd';
if (c == 'q') return 'q';
return ' ';
}
五、主循环与绘制
主循环不断读取输入、更新棋盘、生成方块并绘制。绘制时按行列打印数值,空位显示点号。
void draw() {
int i, j;
system("clear");
printf("Score: %dn", score);
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
if (board[i][j] == 0)
printf(". ");
else
printf("%d ", board[i][j]);
}
printf("n");
}
}
int main() {
srand(time(NULL));
init_board();
char cmd;
do {
draw();
cmd = read_input();
// 此处应根据cmd调用对应合并与旋转函数
} while (cmd != 'q');
return 0;
}
六、小结
上述代码展示了Linux下C语言实现2048的关键模块。实际项目中可加入ncurses库隐藏光标、支持方向键转义,并将四个方向的移动统一为旋转加向左合并再逆旋转,从而大幅精简逻辑。
linux2048_gameC_language修改时间:2026-07-31 10:57:23