核心内容摘要
【瑞芯微平台实时Linux方案系列】第十七篇 - 瑞芯微平台边缘AI与实时控制协同方案
游戏特点2048是一款数字益智类游戏玩家需要使用键盘控制数字方块的移动合并相同数字的方块最终达到数字方块上出现“2048”的目标。
为用C语言实现2048的小游戏项目我们需先观察2048小游戏的特点和我们需要实现的一些功能
需要一个棋盘来储存数字用什么来表示棋盘
需要控制数字的移动怎样控制数字的移动
需要在数字移动的过程中产生新的随机数怎么生成新的随机数
需要控制数字是否需要合成怎么判断数字是否需要合成和怎么合成
需要判断判定游戏是否成功怎么判断游戏是否结束
需要丰富游戏的界面怎样使游戏界面好看一点
游戏运行示意图
工具准备
代码运行平台Visual Studio 2022官网地址https://visualstudio.microsoft.com/zh-hans/
图形库Easyx官网地址https://easyx.cn/
代码实现流程
核心逻辑
棋盘制作用二维数组来存储数字制作与显示棋盘/* by
hk - online tools website :
hk/zh/quchong.html */ //用整型数组表示矩阵方格 int arr[4][4] { 0 }; //打印矩阵方格的数据 void PrintArr() { for (int row 0; row 4; row) { for (int column 0; column 4; column) { printf(%d\t, arr[row][column]); } printf(\n); } }
控制数字的移动与合成/* by
hk - online tools website :
hk/zh/quchong.html */ //向左边移动 void Left() { //遍历行 for (int row 0; row 4; row) { for (int column 0; column 4; column) { //如果当前格子为空则向右移动 if (arr[row][column]
{ //从后面找一个不为空的格子如果找到则交换位置 for (int i column 1; i 4; i) { if (arr[row][i]!
{ arr[row][column] arr[row][i]; arr[row][i] 0; //处理一个非空位置后条件不成立不能往后走了 break; } } } //如果不为0表示要合并 if (arr[row][column] !
{ //从后面找一个和当前数据相同的数据遇到0就跳过遇到不同的退出 for (int i column 1; i 4; i) { if (arr[row][i] arr[row][column]) { //数据合并 arr[row][column] * 2; arr[row][i] 0; //合并完成就结束查找 break; } else if (arr[row][i]
continue; else break; } } } } CreateRandData(
; } //向右边移动 void Right() { for (int row 0; row 4; row) { for (int column 3; column 0; column--) { //如果当前格子为空则向左移动 if (arr[row][column]
{ //从后面找一个不为空的格子如果找到则交换位置 for (int i column - 1; i 0; i--) { if (arr[row][i] !
{ arr[row][column] arr[row][i]; arr[row][i] 0; //处理一个非空位置后条件不成立不能往后走了 break; } } } //如果不为0表示要合并 if (arr[row][column] !
{ //从后面找一个和当前数据相同的数据遇到0就跳过遇到不同的退出 for (int i column - 1; i 0; i--) { if (arr[row][i] arr[row][column]) { //数据合并 arr[row][column] * 2; arr[row][i] 0; //合并完成就结束查找 break; } else if (arr[row][i]
continue; else break; } } } } CreateRandData(
; } //向上边移动 void Up() { for (int column 0; column 4; column) { for (int row 0; row 4; row) { //如果当前格子为空则向下移动 if (arr[row][column]
{ //从后面找一个不为空的格子如果找到则交换位置 for (int i row 1; i 4; i) { if (arr[i][column] !
{ arr[row][column] arr[i][column]; arr[i][column] 0; //处理一个非空位置后条件不成立不能往后走了 break; } } } //如果不为0表示要合并 if (arr[row][column] !
{ //从后面找一个和当前数据相同的数据遇到0就跳过遇到不同的退出 for (int i row 1; i 4; i) { if (arr[i][column] arr[row][column]) { //数据合并 arr[row][column] * 2; arr[i][column] 0; //合并完成就结束查找 break; } else if (arr[i][column]
continue; else break; } } } } CreateRandData(
; } //向下边移动 void Down() { for (int column 0; column 4; column) { for (int row 3; row 0; row--) { //如果当前格子为空则向上移动 if (arr[row][column]
{ //从后面找一个不为空的格子如果找到则交换位置 for (int i row - 1; i 0; i--) { if (arr[i][column] !
{ arr[row][column] arr[i][column]; arr[i][column] 0; //处理一个非空位置后条件不成立不能往后走了 break; } } } //如果不为0表示要合并 if (arr[row][column] !
{ //从后面找一个和当前数据相同的数据遇到0就跳过遇到不同的退出 for (int i row - 1; i 0; i--) { if (arr[i][column] arr[row][column]) { //数据合并 arr[row][column] * 2; arr[i][column] 0; //合并完成就结束查找 break; } else if (arr[i][column]
continue; else break; } } } } CreateRandData(
; }
判断是否可以合成//是否可以合成 int CamMerge() { for (int row 0; row 4; row) { for (int column 0; column 4; column) { if (column14(arr[row][column] arr[row][column1])|| row14(arr[row][column] arr[row1][column ])) { //可以合并 return 1; } } } //没有可以合并的数据 return 0; }
判断棋盘是否已满//是否已经满了 int IsFull() { for (int row 0; row 4; row) { for (int column 0; column 4; column) { if (arr[row][column]
{ //没有满 return 1; } } } //整个循环结束没有返回1已经满了 return 0; } ···
在空位生成随机数 C //调用头文件 #includestdlib.h #includetime.h //空位数组 int nullCount 0;//记录空位的数量 int nullPos[2][16] { 0 };//记录空位的行列数据 //获取空位数据 int GetNullPos() { //把空位数量归零 nullCount 0; for (int row 0; row 4; row) { for (int column 0; column 4; column) { if (arr[row][column]
{ //记录下来行和列 nullPos[0][nullCount] row;//nullPos[0]记录行 nullPos[1][nullCount] column;//nullPos[1]记录列 //更新空位个数 nullCount; } } } return nullCount; } //生成随机数据 void CreateRandData(int count) { srand(time(
); //判断是否有空位同时更新空位的数据 for (int c 0; c count; c) { if (GetNullPos()
return; //随机随机一个数表示在nullPos的位置 int pos rand() % nullCount;//0到nullCount-1 //生成2/4 int row nullPos[0][pos]; int column nullPos[1][pos]; arr[row][column] (rand() % 2
* 2; } }
初始化游戏数据// 初始化游戏数据 void InitData() { // 初始化数据 for (int row 0; row 4; row) { for (int column 0; column 4; column) { arr[row][column] 0; } } // 生成 2 个随机数 CreateRandData(
; }
界面渲染
创建游戏窗口//调用图形库 #includeeasyx.h void InitWindow() { //创建一个窗口 windowinitgraph(700,
; //设置标题 settextcolor(WHITE);//确定颜色 settextstyle(60, 0, _T(黑体));//设置字体 outtextxy(250, 0, _T(
);//标题位置 }
显示矩阵棋盘//图片数组 const TCHAR* Lpicture[] { _T(Image/
png),_T(Image/
png), _T(Image/
png), _T(Image/
png), _T(Image/
png), _T(Image/
png), _T(Image/
png), _T(Image/
png), _T(Image/
png), _T(Image/
png), _T(Image/
png), _T(Image/
png) }; //控制图片输出 int log(int n) { if (n
return 0; int count 0; while (n
{ count; n / 2; } return count; } //生成游戏界面 void updata() { //生成矩阵格子 for (int row 0; row 4; row) { for (int column 0; column 4; column) { int pos log(arr[row][column]); //加载图片 IMAGE img; loadimage(img, Lpicture[pos]); //显示图片 putimage(20(
*column, 70(
*row, img); } } }
游戏结束界面渲染void DrawGameOver() { cleardevice(); settextstyle(60, 0, _T(黑体)); outtextxy(250, 250, _T(Game Over)); }
主函数编写//头文件调用 #include windows.h //窗口句柄 HWND window nullptr; int main() { // 初始化数据 InitData(); // 初始化窗口 InitWindow(); // 游戏的主逻辑 while (IsWindow(window)) { // 每帧更新并处理事件 updata(); // 如果游戏结束绘制一次并进入等待逻辑 if (GetNullPos() 0 CamMerge()
{ DrawGameOver(); // 等待玩家操作Enter 重启Esc 退出 while (IsWindow(window)) { ExMessage msg; if (peekmessage(msg)) { if (msg.message WM_KEYDOWN) { if (msg.vkcode VK_RETURN) // 回车重启 { InitData(); cleardevice(); break; // 退出等待回到主循环 } else if (msg.vkcode VK_ESCAPE) // Esc 退出 { closegraph(); return 0; } } } Sleep(
; // 降低 CPU 占用避免高频重绘 } } // 处理输入并移动保持原有逻辑 ExMessage msg; if (peekmessage(msg)) { if (msg.message WM_KEYDOWN) { switch (msg.vkcode) { case VK_UP: Up(); break; case VK_DOWN: Down(); break; case VK_LEFT: Left(); break; case VK_RIGHT: Right(); break; default: break; } } } // 小睡一会儿避免空循环耗尽 CPU Sleep(
; } closegraph(); }需要注意的事项
图片资源必须与代码在同一目录下方便调用。
最后的话那么关于用C语言来实现游戏2048就讲解到这里啦~如果有说的不够充分或者有错误的地方还希望各位能在评论区积极指出我也会积极学习的完整2048小游戏的源码和图片资源可在项目源码处获取