一、项目介绍这是一个可以单人进行的2048小游戏。游戏的目的是逐渐增大界面上的数字,获取更高的分数,直至有数字达到2048.游戏用方向键控制(或者是wasd),每当你按下方向键,所有的数字都会向那个方向运动到头,如果有两个相同的数字碰撞在一起,则会产生一个2倍的数字。 编译环境:visual c++ 6.0第三方库:Easyx2022 二、运行截图




三、源码解析我们先来思考一下游戏的逻辑。在经过了初始化以及界面生成之后,玩家其实只需要做出很简单的输入,就可以推进游戏的进程,无非就按下方向键,界面做出反应,然后接收下一次指令……这样,整体逻辑就已经很清晰了。初始化;绘制界面;玩家操作,界面及数据变化,检测是否胜利,若非胜利,循环操作步骤。下面是主函数:int main(){ bool ctn = true; // 该值代表是否重开新局 SetWindowText(initgraph(350, 440), "2048-dotcpp.com"); // 初始化图形界面 srand((unsigned)time(NULL)); while (ctn) { init(); // 新的一局,程序初始化 drawmap(); // 绘制界面 int endmode = 0; // 结束方式,1 代表胜利,2 代表失败 while (1) { move(); // 玩家操作 drawmap(); // 绘制界面 if (win()) // 胜利 { endmode = 1; break; } if (gameover()) // 失败 { endmode = 2; break; } } int t; // 获取用户选择的按钮 if (endmode == 1) // 胜利 t = MessageBox(0, _T("You win!\n再来一局?"), _T("继续"), MB_OKCANCEL); if (endmode == 2) // 失败 t = MessageBox(0, _T("Game over!\n再来一局?"), _T("继续"), MB_OKCANCEL); if (t == IDCANCEL)ctn = false; // 若用户选择 取消,则不重新开局 } closegraph(); // 关闭图形界面 return 0;}Initgraph用于初始化图形窗口,参数为窗口大小。在头文件easyx中引入。接着构建循环,在需要时重复一局游戏。初始化,然后不断接收用户的输入。最后用MessageBox输出文字。MessageBox是Windows.h当中的内容,用于弹出对话框。还要说明的一点是_T()这个函数。_T()是一个宏,他的作用是让程序支持Unicode编码,用来保证兼容性。VC支持ascii和unicode两种字符类型,用_T可以保证从ascii编码类型转换到unicode编码类型的时候,程序不需要修改。 接下来看需要定义的函数。viod init()//初始化函数void drawmap()// 定义绘制界面void move()// 定义玩家操作bool gameover()// 判断游戏结束bool win()// 判断胜利还有变量:const COLORREF BGC = RGB(250, 248, 239);// 定义背景色常量int score, best, a[5][5], b[5][5];// score 为本局分数,best为当前最佳纪录,a数组为棋盘,b数组为a的备份bool mov[5][5];// 棋盘上的点是否已被移动过(避免重复移动)可以用二维数组来存储游戏的数据。 然后是每个函数的实现过程。初始化:void init(){ setbkcolor(BGC); setbkmode(TRANSPARENT); score = 0; memset(a, 0, sizeof(a)); int x1 = rand() % 4 + 1, y1 = rand() % 4 + 1, x2 = rand() % 4 + 1, y2 = rand() % 4 + 1; // 随机生成两个初始点 a[x1][y1] = a[x2][y2] = 2; // 初始点初始化为 2}setbkcolor用于设置当前设备绘图背景色。setbkmode用于设置当前设备图案填充和文字输出时的背景模式,TRANSPARENT意味着背景色是透明的。在游戏开始时,要将两个点的值设为2。 绘制界面:void drawmap(){ // 开始批量绘图 BeginBatchDraw(); // 绘制界面主体 cleardevice(); settextcolor(RGB(119, 110, 101)); settextstyle(50, 0, _T("微软雅黑")); outtextxy(10, 10, "2048"); settextstyle(20, 0, _T("微软雅黑"), 0, 0, 550, false, false, false); outtextxy(10, 65, "Join the numbers and get to the 2048 tile!"); setfillcolor(RGB(187, 173, 160)); // 绘制当前分数 solidroundrect(200, 15, 290, 60, 5, 5); settextcolor(RGB(230, 220, 210)); settextstyle(15, 0, _T("微软雅黑"), 0, 0, 600, false, false, false); outtextxy(230, 20, "SCORE"); char sc[10]; sprintf(sc, "%d", score); settextcolor(WHITE); settextstyle(25, 0, _T("微软雅黑"), 0, 0, 600, false, false, false); RECT r = { 200, 30, 290, 60 }; drawtext(sc, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE); // 绘制最佳纪录 solidroundrect(295, 15, 385, 60, 5, 5); settextcolor(RGB(230, 220, 210)); settextstyle(15, 0, _T("微软雅黑"), 0, 0, 600, false, false, false); outtextxy(330, 20, "BEST"); char bs[10]; sprintf(bs, "%d", best); settextcolor(WHITE); settextstyle(25, 0, _T("微软雅黑"), 0, 0, 600, false, false, false); RECT s = { 295, 30, 385, 60 }; drawtext(bs, &s, DT_CENTER | DT_VCENTER | DT_SINGLELINE); // 绘制数字棋盘 solidroundrect(10, 90, 390, 470, 5, 5); settextstyle(23, 0, _T("微软雅黑")); settextcolor(WHITE); for (int i = 1; i
请登录后发表评论
注册
停留在世界边缘,与之惜别