C语言版2048小游戏
一、游戏特点2048是一款数字益智类游戏玩家需要使用键盘控制数字方块的移动合并相同数字的方块最终达到数字方块上出现“2048”的目标。为用C语言实现2048的小游戏项目我们需先观察2048小游戏的特点和我们需要实现的一些功能1.需要一个棋盘来储存数字用什么来表示棋盘2.需要控制数字的移动怎样控制数字的移动3.需要在数字移动的过程中产生新的随机数怎么生成新的随机数4.需要控制数字是否需要合成怎么判断数字是否需要合成和怎么合成5.需要判断判定游戏是否成功怎么判断游戏是否结束6.需要丰富游戏的界面怎样使游戏界面好看一点二、游戏运行示意图三、工具准备1.代码运行平台Visual Studio 2022官网地址https://visualstudio.microsoft.com/zh-hans/2.图形库Easyx官网地址https://easyx.cn/四、代码实现流程一、核心逻辑1、棋盘制作用二维数组来存储数字制作与显示棋盘/* by 01022.hk - online tools website : 01022.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); } }2、控制数字的移动与合成/* by 01022.hk - online tools website : 01022.hk/zh/quchong.html */ //向左边移动 void Left() { //遍历行 for (int row 0; row 4; row) { for (int column 0; column 4; column) { //如果当前格子为空则向右移动 if (arr[row][column] 0) { //从后面找一个不为空的格子如果找到则交换位置 for (int i column 1; i 4; i) { if (arr[row][i]! 0) { arr[row][column] arr[row][i]; arr[row][i] 0; //处理一个非空位置后条件不成立不能往后走了 break; } } } //如果不为0表示要合并 if (arr[row][column] ! 0) { //从后面找一个和当前数据相同的数据遇到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] 0) continue; else break; } } } } CreateRandData(1); } //向右边移动 void Right() { for (int row 0; row 4; row) { for (int column 3; column 0; column--) { //如果当前格子为空则向左移动 if (arr[row][column] 0) { //从后面找一个不为空的格子如果找到则交换位置 for (int i column - 1; i 0; i--) { if (arr[row][i] ! 0) { arr[row][column] arr[row][i]; arr[row][i] 0; //处理一个非空位置后条件不成立不能往后走了 break; } } } //如果不为0表示要合并 if (arr[row][column] ! 0) { //从后面找一个和当前数据相同的数据遇到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] 0) continue; else break; } } } } CreateRandData(1); } //向上边移动 void Up() { for (int column 0; column 4; column) { for (int row 0; row 4; row) { //如果当前格子为空则向下移动 if (arr[row][column] 0) { //从后面找一个不为空的格子如果找到则交换位置 for (int i row 1; i 4; i) { if (arr[i][column] ! 0) { arr[row][column] arr[i][column]; arr[i][column] 0; //处理一个非空位置后条件不成立不能往后走了 break; } } } //如果不为0表示要合并 if (arr[row][column] ! 0) { //从后面找一个和当前数据相同的数据遇到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] 0) continue; else break; } } } } CreateRandData(1); } //向下边移动 void Down() { for (int column 0; column 4; column) { for (int row 3; row 0; row--) { //如果当前格子为空则向上移动 if (arr[row][column] 0) { //从后面找一个不为空的格子如果找到则交换位置 for (int i row - 1; i 0; i--) { if (arr[i][column] ! 0) { arr[row][column] arr[i][column]; arr[i][column] 0; //处理一个非空位置后条件不成立不能往后走了 break; } } } //如果不为0表示要合并 if (arr[row][column] ! 0) { //从后面找一个和当前数据相同的数据遇到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] 0) continue; else break; } } } } CreateRandData(1); }3、判断是否可以合成//是否可以合成 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; }4、判断棋盘是否已满//是否已经满了 int IsFull() { for (int row 0; row 4; row) { for (int column 0; column 4; column) { if (arr[row][column] 0) { //没有满 return 1; } } } //整个循环结束没有返回1已经满了 return 0; } ··· 5、在空位生成随机数 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] 0) { //记录下来行和列 nullPos[0][nullCount] row;//nullPos[0]记录行 nullPos[1][nullCount] column;//nullPos[1]记录列 //更新空位个数 nullCount; } } } return nullCount; } //生成随机数据 void CreateRandData(int count) { srand(time(0)); //判断是否有空位同时更新空位的数据 for (int c 0; c count; c) { if (GetNullPos() 0) 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 1) * 2; } }6、初始化游戏数据// 初始化游戏数据 void InitData() { // 初始化数据 for (int row 0; row 4; row) { for (int column 0; column 4; column) { arr[row][column] 0; } } // 生成 2 个随机数 CreateRandData(2); }二、界面渲染1、创建游戏窗口//调用图形库 #includeeasyx.h void InitWindow() { //创建一个窗口 windowinitgraph(700, 750); //设置标题 settextcolor(WHITE);//确定颜色 settextstyle(60, 0, _T(黑体));//设置字体 outtextxy(250, 0, _T(2048));//标题位置 }2、显示矩阵棋盘//图片数组 const TCHAR* Lpicture[] { _T(Image/0.png),_T(Image/2.png), _T(Image/4.png), _T(Image/8.png), _T(Image/16.png), _T(Image/32.png), _T(Image/64.png), _T(Image/128.png), _T(Image/256.png), _T(Image/512.png), _T(Image/1024.png), _T(Image/1024.png) }; //控制图片输出 int log(int n) { if (n 1) return 0; int count 0; while (n1) { 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(15010)*column, 70(15010)*row, img); } } }3、游戏结束界面渲染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() 0) { 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(50); // 降低 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(10); } closegraph(); }需要注意的事项1、图片资源必须与代码在同一目录下方便调用。最后的话那么关于用C语言来实现游戏2048就讲解到这里啦~如果有说的不够充分或者有错误的地方还希望各位能在评论区积极指出我也会积极学习的完整2048小游戏的源码和图片资源可在项目源码处获取

相关新闻

【小程序毕设源码分享】基于springboot+Android在线医疗系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【小程序毕设源码分享】基于springboot+Android在线医疗系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/3 15:36:05 阅读更多 →
水利网关DTU:智慧水利监测系统的核心中枢

水利网关DTU:智慧水利监测系统的核心中枢

工业网关(DTU)作为智慧水利监测系统的核心设备,贯穿河道、水库、湖泊等场景的数据采集、传输、处理全流程,凭借多协议兼容、多网络接入、工业级稳定特性,实现水利监测从 “人工巡查” 向 “智能感知” 的转型&#xff…

2026/7/3 15:36:06 阅读更多 →
移动端Vue组件库选型指南

移动端Vue组件库选型指南

移动端Vue组件库选型指南 在移动端开发中,选择合适的Vue组件库对提升开发效率、保证用户体验和降低维护成本至关重要。本文将从业务场景适配、技术性能、生态扩展性、学习成本及长期维护性五个维度,结合2025年最新技术趋势与真实项目案例,为…

2026/7/5 9:21:51 阅读更多 →

最新新闻

编程启蒙|Scratch 转 Python 系列第 3 天完整教程

编程启蒙|Scratch 转 Python 系列第 3 天完整教程

本篇是零基础 Python 自学系列 Scratch 转 Python 第 3 天笔记,适合纯小白入门,内容包含实操代码、详细讲解与配套练习题,全程 Scratch 积木代码 Python 双向对照教学。 一、昨日内容复盘(Scratch 转 Python Day2 for 循环与 ra…

2026/7/5 13:36:11 阅读更多 →
玄鹿电竞:用技术重构游戏服务体验,驱动专业护航

玄鹿电竞:用技术重构游戏服务体验,驱动专业护航

在《三角洲行动》的战场中,你是否曾因“老六蹲撤”“摸金翻车”“任务卡关”而遗憾?玄鹿电竞以技术为引擎,打造全链路专业护航平台,从下单、匹配、服务到售后,用数字化架构重构游戏服务体验,让“稳撤满载”…

2026/7/5 13:34:10 阅读更多 →
18、<简单>寻找距离2的幂最近的数字

18、<简单>寻找距离2的幂最近的数字

#include <iostream> using namespace std;int main() {int n;cout << "请输入整数n&#xff1a;";cin >> n;// 先找到小于等于n的最大2的幂 lowint low 1;while (low * 2 < n){low * 2;}int high low * 2; // 大于n的最小2的幂int dis_low …

2026/7/5 13:32:10 阅读更多 →
抖店违规检测工具使用步骤:上架前 3 类素材(主图 / 标题 / 详情)风险筛查指南

抖店违规检测工具使用步骤:上架前 3 类素材(主图 / 标题 / 详情)风险筛查指南

全网通用电商商品违规检测最全教程&#xff1a;新手小白零门槛避坑指南很多电商创业新手、副业小白做店铺运营时&#xff0c;最容易踩的坑就是商品违规。不管是做抖音、抖音小店、微信小店、微信小商城、视频号小店、拼多多、小红书、淘宝等全平台电商&#xff0c;绝大多数新手…

2026/7/5 13:30:10 阅读更多 →
3分钟免费激活Windows系统:KMS_VL_ALL_AIO智能激活工具完全指南

3分钟免费激活Windows系统:KMS_VL_ALL_AIO智能激活工具完全指南

3分钟免费激活Windows系统&#xff1a;KMS_VL_ALL_AIO智能激活工具完全指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活而烦恼吗&#xff1f;每次开机看到那个烦人的激…

2026/7/5 13:30:10 阅读更多 →
奇迹 MU 剑与翼手游官网下载:奇迹 MU 剑与翼最新官方下载渠道

奇迹 MU 剑与翼手游官网下载:奇迹 MU 剑与翼最新官方下载渠道

奇迹 MU 剑与翼手游官网下载&#xff1a;奇迹 MU 剑与翼最新官方下载渠道 《奇迹 MU 剑与翼》又名复古 1.03H 奇迹正版、卓越打金奇迹手游&#xff0c;由安徽游昕联合忆往游戏正版运维复刻的经典魔幻 MMORPG。游戏完整还原原版奇迹端游 1.03H 全部内容&#xff0c;勇者大陆、仙…

2026/7/5 13:28:09 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools&#xff1a;5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里&#xff0c;参与了关于混合后量子密码学的讨论&#xff0c;应付端点攻击找茬的人&#xff0c;还参与留言板讨论后&#xff0c;发现“威胁模型”对多数人仍是陌生概念&#xff0c;且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”&#xff1a;我理解的渗透测试到底是什么&#xff1f;每次看到新闻里说某个大公司的数据被“黑”了&#xff0c;或者某个网站被攻击导致服务瘫痪&#xff0c;你是不是和我一样&#xff0c;心里会冒出两个念头&#xff1a;一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools&#xff1a;5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里&#xff0c;参与了关于混合后量子密码学的讨论&#xff0c;应付端点攻击找茬的人&#xff0c;还参与留言板讨论后&#xff0c;发现“威胁模型”对多数人仍是陌生概念&#xff0c;且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”&#xff1a;我理解的渗透测试到底是什么&#xff1f;每次看到新闻里说某个大公司的数据被“黑”了&#xff0c;或者某个网站被攻击导致服务瘫痪&#xff0c;你是不是和我一样&#xff0c;心里会冒出两个念头&#xff1a;一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻