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

这篇具有很好参考价值的文章主要介绍了MFC学习之2048小游戏程序源码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

具体实现过程如下:

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

MFC学习之2048小游戏程序源码,C++,MFC记录,mfc,学习,c++

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

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

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

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

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

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

BOOL PreTranslateMessage(MSG* pMsg)

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

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

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

MFC学习之2048小游戏程序源码,C++,MFC记录,mfc,学习,c++

主函数源代码:

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小游戏文章来源地址https://www.toymoban.com/news/detail-595500.html

到了这里,关于MFC学习之2048小游戏程序源码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python 程序员过中秋Python+pygame 制作拼图小游戏(附源码:5源码)

    Python 程序员过中秋Python+pygame 制作拼图小游戏(附源码:5源码) 又是一年中秋至一花好月 圆夜,佳文当共鉴。Python+ pygame制作拼图小游戏; 制作一个自己的拼图小游戏,看看几步可以观赏到月亮。 官方活动入口 ​ 本文档是对Python语言制作拼图小游戏界面功能需求进行分析归

    2023年04月09日
    浏览(35)
  • python小游戏毕设 2048小游戏设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 2048小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取: https://

    2024年02月12日
    浏览(31)
  • Qt--2048小游戏

    2048 1.功能 上下左右控制数字格子的移动 WASD 4*4 格子移动操作,加操作 开始游戏的按钮,重新游戏按钮 得分计算 判断游戏是否结束 2.源程序 代码如下(示例): MainWindow.h Main.cpp MainWindow.cpp 5.结果 以上是今天要讲的内容,练习了2048小游戏。

    2024年01月25日
    浏览(33)
  • 2048小游戏成品源码

    2048小游戏,可以自选背景颜色,方框颜色,音乐播放。 还可以展示当前玩家的排名,动态排名,及历史玩家的排名。 前期需求: 使用pygame加载目录音乐。MP3文件: 看下运行后的效果图: =========参数设置: =========背景设置: =========方块设置: ==========源码分享:

    2024年02月16日
    浏览(34)
  • 基于Python开发的玛丽大冒险小游戏(源码+可执行程序exe文件+程序配置说明书+程序使用说明书)

    本项目是一套基于Python开发的玛丽冒险小游戏程序,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含:项目源码、项目文档等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,确保可以运行! 本系统的软件开发及运行环境

    2024年02月09日
    浏览(34)
  • c++制作小游戏2048

    完整代码来自于爱编程的柚子《【C语言/C++游戏项目】:2048小游戏,超详细教程教会你写这个小游戏。》 这个游戏用到了#include graphics.h,思路比较简单。 首先做出游戏页面,然后画出4*4的格子,利用map二维数组,依据数字{0,2,4,8,16,32,64,128,256,512,1024,2048}找到对应颜色在固定位

    2024年02月13日
    浏览(31)
  • python快速实现2048小游戏

    《2048》是一款比较流行的数字游戏,最早于2014年3月20日发行。原版2048首先在GitHub上发布,原作者是Gabriele Cirulli,后被移植到各个平台。这款游戏是基于《1024》和《小3传奇》的玩法开发而成的新型数字游戏。 操作指南: 每次可以选择上下左右其中一个方向去滑动,每滑动

    2024年02月11日
    浏览(29)
  • 基于C#的2048小游戏

    最近在玩过2048这个小游戏后感觉很有意思,想着正在学C#的winfrom的我能不能自己写一个2048游戏呢?于是就有了这个:   目录 1.实现思路; 2.代码实现; 1.初始化地图表示的数组; 2.绘制游戏的边框; 3.设置每个数值对应的颜色(可省略); 4.添加控件; 5.四个方向的移动;

    2024年02月08日
    浏览(31)
  • Android期末项目2048小游戏

    Android期末项目2048小游戏。 2048属于益智类小游戏,它做到了娱乐性、趣味性、教育性相统一。益智类的游戏即是需要去开动大脑去思考从而获得游戏的胜利。简单的益智类游戏可以使玩家在娱乐中不断的开发大脑。这样一来就实现了在娱乐中学习。每次可以选择上下左右其中

    2024年02月06日
    浏览(44)
  • Cocos Creator小游戏-文字斗争(H5、小程序)益智类 项目展示+完整项目源码

    文字斗争(H5、小程序)益智类 项目展示+完整项目源码 玩家有着自己的战场,可以作为进攻方去挑战其他战场,也可以作为防守方抵御其他玩家的进攻。 玩家可以挑战游戏里设置的各个关卡,提高自己的指挥能力和布局能力,最终可以战胜其他玩家的同时能够不被其他玩家

    2024年02月08日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包