【附C++源码】从零开始实现 2048 游戏
【附C源码】从零开始实现 2048 游戏项目概述2048 是一款经典的数字合并游戏通过滑动方块使相同数字合并目标是合成 2048。本文将详细介绍基于 EGEEasy Graphics Engine图形库实现的图形化版本。核心技术架构1. 游戏数据结构设计constintGRID_SIZE100;// 网格尺寸constintGRID_COUNT4;// 4x4 网格constintWIN_SIZEGRID_SIZE*GRID_COUNT;constintMARGIN10;// 单元格间距constintCELL_SIZEGRID_SIZE-MARGIN*2;intboard[4][4]{0};// 游戏棋盘intscore0;// 当前分数boolgameOverfalse;// 游戏结束标志boolgameWinfalse;// 胜利标志设计要点使用二维数组board[4][4]存储棋盘状态0 表示空位通过全局变量管理游戏状态便于各函数访问2. 视觉渲染系统颜色映射机制color_tgetNumberColor(intnum){switch(num){case0:returnEGERGB(205,193,180);// 空位灰case2:returnEGERGB(238,228,218);// 浅黄case4:returnEGERGB(237,224,200);// 米色case8:returnEGERGB(242,177,121);// 橙色// ... 更多颜色映射default:returnEGERGB(60,58,50);// 深色背景}}技术细节采用经典 2048 配色方案通过 EGE 的EGERGB宏实现 RGB 颜色值转换。棋盘绘制流程voiddrawGame(){// 1. 清空画布并设置背景色setbkcolor(EGERGB(187,173,160));cleardevice();// 2. 绘制每个单元格for(inti0;i4;i){for(intj0;j4;j){intxj*GRID_SIZEMARGIN;intyi*GRID_SIZEMARGIN;intnumboard[i][j];// 绘制单元格背景setfillcolor(getNumberColor(num));bar(x,y,xCELL_SIZE,yCELL_SIZE);// 绘制数字非空时if(num!0){// 根据数字大小动态调整字体if(num100)setfont(40,0,宋体);elseif(num1000)setfont(36,0,宋体);elsesetfont(32,0,宋体);// 居中绘制outtextxy(x(CELL_SIZE-textwidth(str))/2,y(CELL_SIZE-textheight(str))/2,str);}}}// 3. 绘制分数和状态信息// ...}关键技术使用bar()函数绘制填充矩形作为单元格通过textwidth()和textheight()实现文本居中根据数字位数动态调整字体大小保证显示美观3. 核心游戏逻辑方块移动算法voidmergeAndMoveLeft(intarr[4]){// 阶段1: 压缩——将非零数字移到左侧inttemp[4]{0};intidx0;for(inti0;i4;i){if(arr[i]!0){temp[idx]arr[i];}}// 阶段2: 合并——相邻相同数字合并for(inti0;i3;i){if(temp[i]!0temp[i]temp[i1]){temp[i]*2;scoretemp[i];if(temp[i]2048)gameWintrue;// 移除被合并的数字for(intji1;j3;j){temp[j]temp[j1];}temp[3]0;}}// 阶段3: 回写——将结果写回原数组for(inti0;i4;i){arr[i]temp[i];}}算法思路采用压缩-合并-回写三阶段处理确保逻辑清晰。方向转换策略voidreverseRow(intarr[4]){// 反转数组用于右移操作inttemp[4];for(inti0;i4;i)temp[i]arr[3-i];for(inti0;i4;i)arr[i]temp[i];}voidtranspose(){// 矩阵转置用于上下移动inttemp[4][4];for(inti0;i4;i)for(intj0;j4;j)temp[i][j]board[j][i];// 回写}设计模式通过矩阵变换反转、转置将四个方向的移动统一为左移操作显著减少代码重复。游戏状态检测boolcheckGameOver(){// 检查是否有空格if(countEmpty()0)returnfalse;// 检查水平方向是否可合并for(inti0;i4;i){for(intj0;j3;j){if(board[i][j]board[i][j1])returnfalse;}}// 检查垂直方向是否可合并for(intj0;j4;j){for(inti0;i3;i){if(board[i][j]board[i1][j])returnfalse;}}returntrue;}4. 输入处理系统intmain(){initgraph(WIN_SIZE,WIN_SIZE60);// 初始化图形窗口while(is_run()){drawGame();// 键盘事件处理if(GetAsyncKeyState(VK_LEFT)0x8000){moveLeft();delay_ms(130);// 防抖处理}// ... 其他方向键处理// 状态更新if(movedboardChanged()){addRandomNumber();gameOvercheckGameOver();}}}技术要点使用GetAsyncKeyState()实现非阻塞键盘检测通过delay_ms()防止按键抖动导致的多次触发合并检测boardChanged()避免无效操作开发经验总结1. 代码组织策略将游戏逻辑分为三个层次数据层棋盘状态管理逻辑层移动、合并、判断算法表现层图形渲染、用户交互2. EGE 库使用技巧颜色系统使用EGERGB(r, g, b)宏定义颜色范围 0-255字体处理通过setfont()设置字体大小和样式文本居中利用textwidth()和textheight()计算居中偏移3. 性能优化考虑使用双缓冲机制EGE 自动处理避免不必要的重绘仅在状态改变时更新合理使用delay_fps()控制帧率编译部署依赖环境编译器MinGW-w64 (64位)图形库EGE 20.08系统Windows编译命令g2048.cpp-o2048.exe -ID:\mingw64\include -LD:\mingw64\lib-lgraphics-lgdi32-lgdiplus-limm32-lmsimg32-lole32-loleaut32-lwinmm-luuid运行方式直接执行生成的2048.exe文件即可启动游戏。扩展建议音效系统添加合并成功、游戏胜利等音效存档功能支持游戏进度保存和加载难度模式增加不同网格大小如 5x5、6x6AI 玩家实现自动游戏算法⚠️项目源码地址https://github.com/anjuxi/2048-C_programming_language