MFC学习之2048小游戏程序源码

2048游戏的开发原理相对简单,它基于一个4x4的方格,通过控制数字方块的移动来合成相同的数字方块,并生成新的数字方块。

具体实现过程如下:

确定需求:首先需要明确游戏的功能需求,如产生随机数字方块、控制数字方块的移动、检测碰撞等。
界面设计:设计游戏的界面,包括数字方块、移动方向、分数等元素。
逻辑实现:实现游戏的逻辑部分,包括数字方块的生成、移动和碰撞检测,以及分数的记录和更新等。

在这里插入图片描述

这里说下需要手动添加一个“PreTranslateMessage”消息处理函数,用于识别键盘按键动作。

在Windows编程中,消息处理函数(Message Handling Function)是用于处理Windows操作系统发送给应用程序的消息的函数。其中,"PreTranslateMessage"是一种消息处理函数,它用于在将消息传递给窗口过程之前,对消息进行预处理。

要添加一个"PreTranslateMessage"消息处理函数,需要进行以下步骤:

打开你的窗口类的定义文件(通常是一个名为"窗口类名.rc"的文件),在资源编辑器中打开。

在资源编辑器中,找到窗口,右键选择“类向导”,然后从虚函数中找到“PreTranslateMessage”。

在新的消息处理函数中,编写你的代码以处理消息。这个函数的原型如下:

BOOL PreTranslateMessage(MSG* pMsg)

其中,pMsg是一个指向MSG结构的指针,该结构包含了消息的相关信息,如消息的类型、参数等。

在"PreTranslateMessage"函数中,你可以根据需要编写代码来处理消息。例如,你可以通过检查消息的类型,拦截或修改特定的消息。
保存并关闭窗口类的定义文件。

"PreTranslateMessage"消息处理函数的主要作用是允许你在窗口过程(Window Procedure)之前对消息进行修改或拦截。通过这个函数,你可以对消息进行一些预处理操作,例如修改消息的参数,或者根据需要将消息传递给其他函数进行处理。

在这里插入图片描述

主函数源代码:

void CMy2048MFCDlg::Show()
{//所有方块的种类,封装到一个Node数组中const static Node color[]={0,		RGB(204,192,179),	RGB(204,192,179),2,		RGB(238,230,210),	RGB(119,110,100),4,		RGB(237,224,200),	RGB(119,110,100),8,		RGB(242,177,121),	RGB(249,242,242),16,		RGB(245,148,100),	RGB(249,242,242),32,		RGB(246,124,95),	RGB(249,242,242),64,		RGB(246,94,59),		RGB(249,242,242),128,	RGB(237,207,114),	RGB(249,242,242),256,	RGB(237,204,97),	RGB(249,242,242),512,	RGB(237,200,80),	RGB(249,242,242),1024,	RGB(237,197,63),	RGB(249,242,242),2048,	RGB(43,132,98),		RGB(249,242,242),4096,	RGB(250,56,108),	RGB(249,242,242),8192,	RGB(129,148,200),	RGB(249,242,242),16384,	RGB(255,0,0),		RGB(249,242,242),32768,	RGB(0,255,0),		RGB(249,242,242),65536,	RGB(128,128,0),		RGB(249,242,242),};static const int n_block_size = 120;			//方块大小static const int n_pos_x = 14;		            //显示位置static const int n_pos_y = 14;static const int n_gap_size = 10;		     	//间隙大小RECT rect;GetClientRect(&rect);m_dc.FillSolidRect(&rect,RGB(255,255,255));    //把整个客户区填充为白色背景m_dc.SelectObject(&m_font);CBrush bkBrush(RGB(187,173,160));m_dc.SelectObject(&bkBrush);//qrt:4*4的棋盘背景矩形大小RECT back_square;back_square.top = n_pos_x-n_gap_size;back_square.left = n_pos_y-n_gap_size;back_square.bottom = n_pos_x+4*n_gap_size+4*n_block_size;back_square.right = n_pos_y+4*n_gap_size+4*n_block_size;//使用当前笔绘制圆角矩形,用当前画刷填充 ,8*8的point是圆角的宽度m_dc.RoundRect(&back_square,CPoint(8,8));//重绘整个棋盘中16个块的矩形for(int i=0;i<4;i++){for(int k=0;k<4;k++){//取出棋盘中的数int num = m_nChessBoard[i][k];//得到棋盘数字对应的Node位置int n = GetNodePos(num);//定义数字所对应的画刷的颜色CBrush brush(color[n].m_BackColor);m_dc.SelectObject(&brush);//显示字体m_dc.SetTextColor(color[n].m_FontColor);//每个方块rt的矩形大小RECT rt;rt.left = n_pos_x+i*(n_block_size+n_gap_size);rt.top = n_pos_y+k*(n_block_size+n_gap_size);rt.right = rt.left+n_block_size;rt.bottom = rt.top+n_block_size;//放大步骤if(i*4+k == m_nNewPos){const static int b[]={-24,-20,-16,-12,-8,-4,0,};rt.left  -= b[m_nCount];rt.right += b[m_nCount];rt.top   -= b[m_nCount];rt.bottom+= b[m_nCount];m_nCount++;if(m_nCount > sizeof(b)/sizeof(int)){m_nNewPos=-1;}}m_dc.RoundRect(&rt,CPoint(16,16));if(num>0){//1.将棋盘中的数字转换为字符串//2.存入到str中,并画在矩形框rt中CString str;char  temp[10] = {0};_itoa_s(num,temp,10);str = temp;//单行 - 居中显示 - 垂直居中显示m_dc.DrawText(str,&rt,DT_SINGLELINE|DT_CENTER|DT_VCENTER);}}}//分数CBrush brush(RGB(187,173,160));m_dc.SelectObject(&brush);m_dc.SetTextColor(RGB(238,235,232));RECT rt={580,170,760,300};m_dc.RoundRect(rt.left,rt.top,rt.right,rt.bottom,8,8);CString str;str="score";rt.bottom = (rt.bottom - rt.top)/2 + rt.top;rt.top += 10;rt.bottom += 10;//显示“score”m_dc.DrawText(str,&rt,DT_SINGLELINE|DT_CENTER|DT_VCENTER);char  tempScore[10] = {0};_itoa_s(m_nScore,tempScore,10);str = tempScore;rt.top += 50;rt.bottom += 50;//显示分数m_dc.DrawText(str,&rt,DT_SINGLELINE|DT_CENTER|DT_VCENTER);//判断游戏是否结束if(m_nOver){CFont Over;//初始化字体:字体高度,字体宽度,夹角,夹角,字体磅数200,斜体,下划线,突出,字体的字符集//输出精度,剪贴精度,输出质量,字体的间距,字体类型Over.CreateFont(80,32,0,0,FW_EXTRABOLD,false,false,false,ANSI_CHARSET,OUT_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,FF_MODERN,L"Arial");m_dc.SelectObject(&Over);m_dc.SetTextColor(RGB(250,0,0));str="游戏结束";m_dc.DrawText(str,&back_square,DT_SINGLELINE|DT_CENTER|DT_VCENTER);}CDC *dc=GetDC();dc->BitBlt(0,0,rect.right,rect.bottom,&m_dc,0,0,SRCCOPY);ReleaseDC(dc);
}

完整程序代码:MFC/C++小游戏源代码2048小游戏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MYSQL执行一条SELECT语句的具体流程

昨天CSDN突然抽风 我一个ctrlz把整篇文章给撤掉了还不能复原 直接心态崩了不想写了 不过这部分果然还是很重要,还是写出来吧 流程图 这里面总共有两层结构Server层 储存引擎 Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现&#xff0c;主要包…

WebSocket理解

WebSocket理解 WebSocket定义与HTTP关系相同点:不同点&#xff1a;联系总体过程 HTTP问题长轮询Ajax轮询 WebSocket特点 WebSocket 定义 本质上是TCP的协议 持久化的协议 实现了浏览器和服务器的全双工通信&#xff0c;能更好的节省服务器资源和带宽 与HTTP关系 相同点: 基于…

接口测试 react+unittest+flask 接口自动化测试平台

目录 1 前言 2 框架 2-1 框架简介 2-2 框架介绍 2-3 框架结构 3 平台 3-1 平台组件图 1 新建用例 2 生成测试任务 3 执行并查看测试报告 3-2 用例管理 3-2-1 用例设计 3-3 任务管理 3-3-1 创建任务 3-3-2 执行任务 3-3-3 测试报告 3-3-4 邮件通知 1 前言 构建…

【力扣算法12】之 11. 盛最多水的容器 python

文章目录 问题描述示例1示例2提示 思路分析代码分析完整代码详细分析运行效果截图调用示例运行结果完结 问题描述 给定一个长度为 n 的整数数组 height 。有n条垂线&#xff0c;第i条线的两个端点是(i, 0)和(i, height[i])。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构…

解决IDEA项目external libraries依赖包消失的问题

有时候电脑重启后&#xff0c;再打开IDEA上的项目时会出现external libraries目录下的依赖包都消失了的情况&#xff0c;只剩下了一个JDK的包 网上说可以通过刷新IDEA的缓存解决&#xff0c;但我试了没有效果&#xff0c;最后使用如下办法解决&#xff1a; 1.删除项目目录下的…

图论算法笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 第12章 最短路径算法12-1 有权图的最短路径问题最短路径问题-路径规划单源最短路径带权图的最短路径和无权图的最短路径带权图的最短路径算法-Dijkstra算法 12-2 Di…

搭载率突破40%!智能数字座舱比拼,车企还有降本空间吗?

进入2023年&#xff0c;汽车行业的「降本」风潮&#xff0c;驱动产业链上下游开始思考智能化、电动化的投入产出。除了显性的硬件成本&#xff08;继续堆料&#xff0c;强调性价比&#xff0c;还是减配&#xff09;&#xff0c;软件及背后的开发成本&#xff0c;对于车企来说&a…

GitLab 入选 Forrester Wave™️ 集成软件交付平台,并获评唯一「领导者」!

越来越多企业意识到多工具链集成带来的低效和高成本问题&#xff0c;同时承受着可见性低、反馈不畅通、网络风险大等痛点&#xff0c;应用平台方法来交付软件的呼声越来越大。 极狐(GitLab) 很早就意识到了平台方法的价值&#xff0c;也坚信极狐GitLab 这种单一应用程序的 DevS…

学习vue2笔记

学习vue2笔记 文章目录 学习vue2笔记脚手架文件结构关于不同版本的Vuevue.config.js配置文件ref属性props配置项mixin(混入)插件scoped样式总结TodoList案例webStorage组件的自定义事件全局事件总线&#xff08;GlobalEventBus&#xff09;消息订阅与发布&#xff08;pubsub&am…

el-date-picker 日期时间进行限制,精确到时分秒

需求&#xff1a;用户只能选择当时时间或当前时间之前的时间&#xff0c;且精确到时分秒 实现效果&#xff1a;用户只能选择当前时间的时间&#xff0c;如果选择是当天之前的时间&#xff0c;时分秒不做限制&#xff0c;如果选择的是当天时间&#xff0c;就要判断时分秒&#…

【数据挖掘】时间序列教程【十】

5.4 通用卡尔曼滤波 上一节中描述的状态空间模型作为观测方程的更一般的公式 和状态方程 这里是一个p1 向量是一个k1 向量, 是一个pk 矩阵, 是kk 矩阵。我们可以想到的和 给定初始状态 和 &#xff0c;预测方程为&#xff08;类似于上面&#xff09; 并且更新方程是&#x…

华为Harmony应用开发初探

HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。在传统的单设备系统能力基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备,提供全场景(移动办公、运动健康、社交通信、媒体…

外包干了2个月,技术退步明显...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

Linux进程(二)---进程的优先级和环境变量

我想在这先完成上一章的一个未说完的话题.最后一个我们讲到了僵尸进程&#xff0c;是指子进程已经结束&#xff0c;但是父进程还在运行没有来得及回收.此时这个子进程便是僵尸进程. 但是如果父进程运行完了&#xff0c;也没有回收就直接结束了&#xff0c;那这个子进程改由谁维…

用html+javascript打造公文一键排版系统3:获取参数设置、公文标题排版

我们用自定义函数setDocFmt()来实现对公文的排版。 一、获取公文参数值 要对公文进行排版&#xff0c;首先要读取公文“参数设置”区中的参数值。比如公文要求对公文标题的一般规定是&#xff1a;一般用2号小标宋体字&#xff0c;居中显示。标题与正文中间空一行。 这些是“参…

Python控制流程盘点及高级用法、神秘技巧大揭秘!

目录 一、条件语句&#xff08;If-Elif-Else&#xff09; 二、循环结构&#xff08;For和While&#xff09; 三、异常处理&#xff08;Try-Except&#xff09; 四、控制流程的高级用法&#xff01; 1. 列表解析 2. 生成器表达式 3. 装饰器 One More Thing&#xff01;&…

Microsoft 宣布今年底关闭开源软件托管平台 CodePlex

Microsoft 宣布&#xff0c;将关闭开源软件托管平台 CodePlex。Microsoft 2006 年推出这项服务&#xff0c;并决定在今年 12 月 15 日将其关闭。 Microsoft 公司副总裁 Brian Harry 在网上博客中写道&#xff0c;人们将可以下载他们的数据档案&#xff0c;Microsoft 正与面向开…

配电柜实时监测?这也太会省力了吧!

现代企业厂房的安全和效率对于业务的成功至关重要。在这个背景下&#xff0c;配电柜监控成为了一项关键的技术。通过实时监测和管理厂房内的配电柜&#xff0c;企业可以确保电力供应的稳定性&#xff0c;提高能源利用效率&#xff0c;并及时发现和解决潜在的故障和安全风险。 配…

matlab学习指南(2):安装工具箱Toolbox的方法(详细图解)

&#x1f305;*&#x1f539;** φ(゜▽゜*)♪ **&#x1f539;*&#x1f305; 欢迎来到馒头侠的博客&#xff0c;该类目主要讲数学建模的知识&#xff0c;大家一起学习&#xff0c;联系最后的横幅&#xff01; 喜欢的朋友可以关注下&#xff0c;私信下次更新不迷路&#xff0…

Uniapp 版本更新

文章目录 前言Uniapp更新确定接口是否能够使用基本代码封装更新软件区别 前言 软件发布之后更新是经常出现的需求。我们希望软件能够自动连网更新软件&#xff0c;而不是重新去手动安装一个apk安装包。不需要更新的软件只有两个&#xff0c;一个是微信小程序&#xff0c;另一个…