VC++拼图游戏设计.doc

上传人:精*** 文档编号:834141 上传时间:2023-09-07 格式:DOC 页数:27 大小:1.31MB
下载 相关 举报
VC++拼图游戏设计.doc_第1页
第1页 / 共27页
VC++拼图游戏设计.doc_第2页
第2页 / 共27页
VC++拼图游戏设计.doc_第3页
第3页 / 共27页
VC++拼图游戏设计.doc_第4页
第4页 / 共27页
VC++拼图游戏设计.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

1、 摘 要本文介绍了一个基于VC的趣味拼图游戏开发的全过程,MFC规范的出现使得我们开发VC游戏成为可能,今天我们要实现的是一个简单的拼图游戏。这个拼图游戏是一个3*3的拼图,由9个随机分割打乱的小图片构成,其中置一格为空。通过消息映射控制移动空框边的小图片来实现拼图,从游戏前得准备到主要类和设备接口的实现,最后运行、调试和打包。关键词:VC,拼图,MFC,游戏,随机分割打乱。AbstractIntroduces a jigsaw puzzle based on VC interest development entire process, the emergence of ordinary M

2、FC standard allows us to develop VC games become possible, today we are going to realize is that a simple puzzle. This puzzle is a 3 * 3 of the jigsaw puzzle, disrupted by nine random division of the small picture composition, buy a case is empty. By moving the empty box edge little pictures from ga

3、me to achieve puzzles, before the main class and to the realization of the device interface, finally running, debugging and packaged. Key words: Visual c + +, Puzzle, Mfc, Game, Sorting frame.目 录摘 要IAbstractII1 引言11.1 拼图游戏介绍11.2 开发背景11.3 开发环境及运行环境11.3.1 开发环境11.3.2 运行环境12 设计要求22.1 基本要求22.2 创新要求23 方案设

4、计23.1 设计原理23.2 设计流程图44 系统开发工具和技术44.1 Visual C+的工作环境44.2 位图显示54.3 消息映射过程65 九宫格拼图游戏设计75.1 九宫格界面设计75.2 MFC中图像的显示95.3 图片处理与游戏规则125.4 对话框菜单编辑175.4.1 菜单编辑175.4.2菜单命令的消息映射175.5 游戏结束标志196 编译运行并测试217总结22参考文献23致谢24241 引言1.1 拼图游戏介绍拼图游戏是广受欢迎的一种智力游戏,它的变化多端,难度不一,让人百玩不厌。个性化的拼图,拼凑的不仅仅是一张照片,而是一个故事,一段回忆,一段温情。每一片的单片都有

5、它自己的位置,就像每段回忆都有它的故事,你要将它放在专属的地方,放对了就慢慢丰富起来,放错了就无法完整。你可以把你记忆中最深的片段,可以是你挚爱的照片,可以是你最难忘的一瞬留念,做成拼图,在思念的季节里一一拼起,把片片散落的记忆重新组合,用指尖温习甜蜜,把心湖里最美丽的涟漪荡漾开来。拼图游戏不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。它既有简单易学的特性,为人民群众所喜闻乐见。1.2 开发背景当前网络上流传的拼图游戏功能并不尽善尽美,其中最主要的问题就是很多软件在图片打乱上面处理的比较模糊,也有采用固定的打乱方法;而且有时出现有一对板块是对调的无法完成游戏,所以我决定开发一个随

6、机打乱图片可以完成的拼图游戏系统。1.3 开发环境及运行环境1.3.1 开发环境开发这款拼图游戏需要的电脑配置如下:1Intel Pentium 4 2.0GHz,512M内存,80G硬盘2Microsoft Windows 2000 Professional3Microsoft Visual C+ 6.04Microsoft Developer Network for Visual Studio.NET 20035Visual Assist X 10.1.1301.01.3.2 运行环境运行这款拼图游戏所需要的电脑配置如下:1Intel Pentium 2及以上处理器,32M以上内存,4G以

7、上硬盘2Microsoft Windows 9X/NT操作系统3. 800*600或以上的屏幕分辨率2 设计要求2.1 基本要求打开任意一个图片,随机打乱图片,然后可以利用鼠标拖动空缺模块附近的模块与空缺模块进行交换,直到拼合出原来图像,具体要求如下:1. 可以打开并显示Jpg,bmp,gif等任意格式图片2. 游戏开始之后,可以随机打乱图片3 用户可以拖动模块进行交换,直到拼合出原图像4 系统能够自动检查到用户拼合出原图像并提示用户2.2 创新要求在基本要求达到后,进行创新设计,创新方向提示如下:1实现每次打乱图片都可以完成2可以提供原图像以供参考,并且加入边框3添加用户拼合出原图像的步数3

8、 方案设计3.1 设计原理这款拼图游戏是以对话框的形式显现出来,详细设计步骤如下:1. 通过拼图边框的绘制及控件的添加来实现对话框的布局设置2. 将拼图边框划分成九个小格,每个小格分别用08来标识,通过转换设备环境内存的图片数据划分成9份分别显示到这九个小格子里,其中标识为8的小格不显示图片3. 构建函数实现小图片间的随机打乱,打乱过程确保可以完成拼图4. 通过消息映射来实现鼠标左键来控制格子的移动5. 通过图片的标识数字与08比较,如果都一样则完成拼图,否则继续拼图设计效果如图所示:756283410 图a 开始随机打乱标示数 图b开始界面123456780 图c 完成标示数 图d完成界面3

9、.2 设计流程图绘制边框加载图片随机打乱图片拼图移动步数加一判断是否与原图一样完成拼图结束开始YN图1设计流程图4 系统开发工具和技术4.1 Visual C+的工作环境如果安装了Visual C+ 6.0,用鼠标单击“开始”,在“程序”组中选择“Microsoft Visual C+ 6.0”工作组,在“Microsoft Visual 6.0”项上双击,即进入Visual C+6.0的集成环境。在这一集成环境中,最重要的是工程(Project)的概念。“工程”是相关源文件的集合。包括源文件、头文件及资源定义文件。Visual平台是自动化很高的编译系统,它能自动处理源文件间的关系,利用其内在

10、推理规则来激活编译器、连接器和资源编译器,最后生成可执行文件。【1】图2 Visual C+集成环境界面4.2 位图显示CBitmap类封装了Windows的GDI位图操作所需的大部分函数。其中,LoadBitmap是位图的初始化函数,其函数原型如下:BOOL LoadBitmap(LPCTSTR lpszResourceName);BOOL LoadBitmap(UINT nIDResource);由于位图不能直接显示在实际设备中,因此对于GDI位图的显示则必须遵循下列步骤:【2】 1. 调用CBitmap类的CreateBitmap、CreateCompatibleBitmap以及Crea

11、teBitmapIndirect函数创建一个适当的位图对象。2. 调用CDC:CreateCompatibleDC函数创建一个内存设备环境,以便位图在内存中保存下来,并与指定设备(窗口设备)环境相兼容。3. 调用CDC:SelectObject函数将位图对象选入内存设备环境中。4. 调用CDC:BitBlt或CDC:StretchBlt函数将位图复制到实际设备环境中。4.3 消息映射过程例如,若向CSCPortTestView中添加OnInitalUpdate的消息映射,则可按下列步骤进行:【3】1. 按Ctrl+W快捷键打开“MFC ClassWizard”对话框。2. 在Class nam

12、e 组合框中,将类名选定为CSCPortTestView。此时,Object IDs和Messages列表内容会相应地改变。3. 在Object IDs列表框中选定CSCPortTestView,而在Messages列表中选定OnInitalUpdate消息。4. 双击Messages列表中的OnInitalUpdate消息或单击“Add Function”按钮,都会在CSCPortTestView类中添加该消息的映射函数OnInitalUpdate,同时在Member functions列表中显示这一消息映射函数和被映射的消息,如图所示:图3消息映射添加5.单击“Edit Code”按钮后,

13、“ClassWizard”对话框退出,并转向文档窗口,定位到OnInitalUpdate函数源代码处。6.添加代码。7.这样就完成了一个消息映射过程。5 九宫格拼图游戏设计5.1 九宫格界面设计1. 对话框的创建对话框编辑器最初打开时,控件工具栏是随之出现的,利用此工具栏中的各个按钮可以顺利完成控件的添加。在对话框中添加一个控件的方法有下列几种:【2】1.1 在控件工具栏中单击某控件,此时的鼠标箭头在对话框内变成“十”字形状;在对话框指定位置单击鼠标左键,则此控件被添加到对话框的相应位置,再拖动刚添加控件的选择框可改变其大小和位置。1.2 在控件工具栏中单击某按钮,此时的鼠标箭头对话框内变成“

14、十”字形状;在指定位置处单击鼠标左键不放,拖动鼠标至相应位置,释放鼠标键。1.3 用鼠标左键单击控件工具栏中的某个控件,并按住鼠标左键不放;在拖动鼠标到对话框的指定位置的过程中,用户会看到一个虚线框,下面带有改控件的标记;释放鼠标左键,新添加的控件立即出现在对话框中。2. 拼图边框的创建对话框创建之后,设计划分为九个小格的边框,代码如下:【5】 Void CMyDlg:Show(CDC * dc)CDC tdc;CBitmap bmp, *obmp; 图e 控件bmp.LoadBitmap(IDB_BG);/调入位图资源tdc.CreateCompatibleDC(dc);/定义并创建一个内存

15、设备环境obmp = tdc.SelectObject(&bmp);/将位图调入内存设备环境中CDC bmpdc, picdc; bmpdc.CreateCompatibleDC(dc);picdc.CreateCompatibleDC(dc);CBitmap bbmp, * obbmp;CBitmap pbmp, * opbmp;bbmp.CreateCompatibleBitmap(dc, 360, 360);pbmp.CreateCompatibleBitmap(dc, (360/size), (360/size);obbmp = bmpdc.SelectObject(&bbmp);op

16、bmp = picdc.SelectObject(&pbmp);pic.Render(&bmpdc, CRect(0, 0, 360, 360);/读取IDB_BG图像文件分为九格int i;if(border)/画边框CPen pen, * open;pen.CreatePen(PS_SOLID, 1, RGB(96, 96, 96);open = bmpdc.SelectObject(&pen);for(i = 0; i size; i+)bmpdc.MoveTo(0, (360/size)*(i+1)-1);bmpdc.LineTo(359, (360/size)*(i+1)-1);bm

17、pdc.MoveTo(360/size)*(i+1)-1, 0);bmpdc.LineTo(360/size)*(i+1)-1, 359);bmpdc.SelectObject(open);pen.DeleteObject();pen.CreatePen(PS_SOLID, 1, RGB(240, 240, 240);open = bmpdc.SelectObject(&pen);for(i = 0; i size; i+)bmpdc.MoveTo(0, (360/size)*i);bmpdc.LineTo(359, (360/size)*i);bmpdc.MoveTo(360/size)*i

18、, 0);bmpdc.LineTo(360/size)*i, 359);bmpdc.SelectObject(open);obmp = tdc.SelectObject(&bmp); for(i = 0; i size; i+)for(int j = 0; j BitBlt(10, 10, 364, 364, &tdc, 0, 0, SRCCOPY); /将位图复制到设备环境中编辑运行此段代码,主要实现以下功能:1、 加载IDB_BG位图选入内存设备环境中2、 将位图IDB_BG复制到实际的设备环境中3、 选中Board,规划出九宫格边框4、 将位图划分成9份分别复制到实际的设备环境中,最后一

19、格为空格3. 对话框初始显示CMyDlg:CMyDlg(CWnd* pParent /*=NULL*/): CDialog(CMyDlg:IDD, pParent)/AFX_DATA_INIT(CMyDlg)/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);begin = TRUE;step = 0;pic.Load(IDR_PIC_VIEW);size = 3;border = TR

20、UE;编辑运行此段代码,主要实现以下功能:构建函数实现九宫格对话框的初始显示,包含了对话框的图标、3*3默认模式、图片的加载、step置0等。 5.2 MFC中图像的显示MFC中实现图片的显示需要先加载图片资源,然后通过设备环境的转换来实现。编程步骤如下:1. 启动Visual C+6.0,生成一个基于对话框结构的应用程序,对话框的基类为CMyDlg,同时将该程序命名为九宫格拼图;2 在应用程序的项目代码中添加CPicture类;3 使用资源编辑器向程序中添加Jepg等格式的图像资源;4 添加代码,编译运行程序。程序代码class CPicture public:CPicture(); /构造

21、函数CPicture(); /虚构函数BOOL Load(UINT nIDRes); /从资源中加载,寻找“IMAGE”类型BOOL Load(LPCTSTR pszPathName); /从路径名中加载BOOL Load(CFile& file); /从File文件中加载BOOL Load(CArchive& ar); /从创建文档的流中加载BOOL Load(IStream* pstm); /从流中加载(IStream)BOOL Render(CDC* pDC, CRect rc=CRect(0,0,0,0),LPCRECT prcMFBounds=NULL) const; /转换设备环境

22、,为IPicture而将其转换为HIMETRICCSize GetImageSize(CDC* pDC=NULL) const; /获得像素形式的图像尺寸将图片放在资源管理器中的“IMAGE”类型中,然后在成员函数BOOL Load(UINT nIDRes)添加代码使得存储器可以加载资源。BOOL CPicture:Load(UINT nIDRes)HINSTANCE hInst = AfxGetResourceHandle();HRSRC hRsrc = :FindResource(hInst,MAKEINTRESOURCE(nIDRes),IMAGE); /从资源文件中加载名为“IMAGE

23、”的资源if (!hRsrc)return FALSE;DWORD len = SizeofResource(hInst, hRsrc); BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc); /将资源加载进存储器 if (!lpRsrc)return FALSE;CMemFile file(lpRsrc, len); /创建储存文件并加载它BOOL bRet = Load(file);FreeResource(hRsrc);GlobalFree(lpRsrc);return bRet;由于加载的图片无法在MFC中正常显示,所以要通过转换设备环境才

24、可以显示。MFC将设备描述表(DC)和图形设备接口封装在一起,建立了设备描述类CDC类,CDC类是直接从CObject派生处理,CDC类主要功能是定义设备描述表对象,提供在显示器上绘图和打印机上图形输出的方法。CDC类提供的方法可以实现GDI的所有图形输出:包括控制着色和调色板、处理坐标映射和装换、绘制多边形和区域、使用不同字体绘制正文、处理元文件等等。BOOL CPicture:Render(CDC* pDC, CRect rc, LPCRECT prcMFBounds) const /转换设备环境ASSERT(pDC); if (rc.IsRectNull() CSize sz = Get

25、ImageSize(pDC);rc.right = sz.cx;rc.bottom = sz.cy;long hmWidth,hmHeight; GetHIMETRICSize(hmWidth, hmHeight);m_spIPicture-Render(*pDC, rc.left, rc.top, rc.Width(), rc.Height(),0, hmHeight, hmWidth, -hmHeight, prcMFBounds); return TRUE;CSize CPicture:GetImageSize(CDC* pDC) const /获得像素形式的图像尺寸if (!m_spI

26、Picture)return CSize(0,0);LONG hmWidth, hmHeight; m_spIPicture-get_Width(&hmWidth);m_spIPicture-get_Height(&hmHeight);CSize sz(hmWidth,hmHeight);if (pDC=NULL) CWindowDC dc(NULL);dc.HIMETRICtoDP(&sz); else pDC-HIMETRICtoDP(&sz);return sz;通过这样的设备环境转换,就可以实现在MFC应用程序中显示JPG/GIF图像文件。5.3 图片处理与游戏规则设计一些成员函数来实

27、现图片的操作处理,例如图片的获取,打乱与移动等Cspell成员函数CSpellCSpellReCreateGetPicMoveInit图4 CSpell类成员函数关系其中成员函数CSpell负责构造N*N的框架,包含了一个空缺模块blank;CSpell负责删除该框架;ReCreate负责重新构造框架;GetPic负责划分图片到该框架中;Move负责拼图相关操作;Init负责随机打乱框架。 CSpell:CSpell(int w, int h, int bx, int by)width = w;height = h;bx = (bx=w)?(w-1):(bx=h)?(h-1):(by0 ? 0

28、 : by);blank = by * w + bx;map = new intw*h;for(int i = 0; i w*h; i+)mapi = i;Init(); 编辑运行此段代码,主要实现以下功能:构造函数负责创建W*H的内存数据并显示初始九宫图(其中带有一个空模板),并用08标记各模板。CSpell:CSpell()delete map;编辑运行此段代码,主要实现以下功能:虚构函数负责删除申请的内存数据。int CSpell:GetPic(int w, int h)if(w = width | h = height)return -1;return maph*width + w;编

29、辑运行此段代码,主要实现以下功能:当用户点击获取到某个位置的图片时,返回标记模板的数字,否则返回-1。int CSpell:Move(int w, int h)if(w = width | h = height)return -10;if(blank = maph*width+w)return -1;if(blank = GetPic(w-1, h)int t = maph*width+w;maph*width+w = maph*width+w-1;maph*width+w-1 = t;else if(blank = GetPic(w+1, h)int t = maph*width+w;map

30、h*width+w = maph*width+w+1;maph*width+w+1 = t;else if(blank = GetPic(w, h-1)int t = maph*width+w;maph*width+w = map(h-1)*width+w;map(h-1)*width+w = t;else if(blank = GetPic(w, h+1)int t = maph*width+w;maph*width+w = map(h+1)*width+w;map(h+1)*width+w = t;elsereturn -1;for(int i = 0; i LENGTH; i+)if(i

31、 != mapi)return 0;return 1;编辑运行此段代码,主要实现以下功能:1. 没有选中的模板无法移动2. 空模板无法移动3. 模板旁(上下左右)有空模板可以进行移动4. 标记模板的数字如果和08一一对应时无法继续移动,否则可以继续移动。void CSpell:Init()srand(time(NULL);int a, b, t;int i = 0, d = 1;while(i+ LENGTH | d = 0)/ 交换至少单位数量次doa = rand()%(LENGTH);b = rand()%(LENGTH);while(a = b);t = mapa;mapa = map

32、b;mapb = t;/ 计算距离,必须要模为1有解if(blank = mapa | blank = mapb)int w = a%width - b%width + 1;int h = a/width - b/width;w = w0?-w:w;h = h0?-h:h;d = (d+w+h)%2;elsed = !d;编辑运行此段代码,主要实现以下功能:Init()函数负责图片的打乱,9个模板其中选中2个进行交换,如果选中的2个模板其中有一个是空模板的话,则计算空模板与它交换的模板之间的距离(x上的差值dx与y上的差值dy)如果(dx+dy+1)%2=0的话则有解,否则无解,无法拼合出原图

33、。随机打乱流程图:构建随机因子time初始化i和dIGetMenu();pMenu-CheckMenuItem(ID_MENU_3, MF_CHECKED);pMenu-CheckMenuItem(ID_MENU_4, MF_UNCHECKED);spell.ReCreate(3, 3, 2, 2);size = 3;OnMenuBegin();编辑运行此段代码,主要实现以下功能:当用户选择菜单3*3时,确保3*3被选中,4*4不被选中,创建3*3的九宫图。之后调用OnMenuBegin()函数,实行打乱等操作。void CMyDlg:OnMenuOpen() / 打开文件CFileDialo

34、g file(true, NULL, NULL, OFN_OVERWRITEPROMPT, 图片文件|*.bmp;*.jpg;*.gif|*.jpg|*.jpg|*.bmp|*.bmp|*.gif|*.gif|, NULL);if(file.DoModal()=IDOK)pic.Load(file.GetPathName();Invalidate(FALSE);编辑运行此段代码,主要实现以下功能:实行资源管理器外的图片调用,完成了用户随意选择图片玩的功能。5.5 游戏结束标志void CMyDlg:OnLButtonDown(UINT nFlags, CPoint point) / TODO:

35、 Add your message handler code here and/or call defaultif(begin)if(point.x 12 & point.x 12 & point.y 372)int w = (point.x - 12) / (360/size);int h = (point.y - 12) / (360/size);int r = spell.Move(w, h);Invalidate(FALSE);if(0 = r)step +;CString str;str.Format(%d, step);SetDlgItemText(IDC_STEP, str);i

36、f(1 = r)MessageBox(完成!);begin = FALSE;CDialog:OnLButtonDown(nFlags, point);游戏结束标志流程图:判断鼠标是否点在分割模块内移动鼠标左键点到的那个模块判断标志r是否大于等于0步数加一文本显示Step判断R是否等于1提示完成N开始结束NYYYN图6结束标志流程图编辑运行此段代码,主要实现以下功能:这里定义了一个循环,游戏开始后,可以移动模板,如果判断游戏结束的标志r不等于1的话则可以继续玩,同时标志用户移动次数的step逐次增加1;如果r=1的话则弹出一个对话框显示用户完成拼图游戏。6 编译运行并测试编译并运行后,出现“九宫

37、格拼图”。如图7所示:图7开始界面完成拼图后,弹出”完成”对话框。 如图8所示:图8完成界面7总结经过这几个月的开发研究,虽然曾经出现了很多的编辑错误,但是最终还是完成了此次的论文,从中学到了许多的知识。例如VC的MFC窗口编程设计、图片的显示等方面,基本上满足了设计所提出的要求,能够编辑出九宫格拼图游戏,解决了图片固定打乱的缺点,但在一些方面上还存在着不足之处,例如,拼完的图片总是缺一块,给人的感觉就不是很完整。可能是自己的能力不足吧,自此我还应该加强自己的窗口编程设计能力,使其变得完善。致谢在这次毕业论文中同学之间互相帮助,对于即将面临毕业的我们来说是一次很有意义的经历,大学四年都一起走过了,在最后我们可以聚在一起讨论学习,研究专业问题,进而更好的了解我们每个人的兴趣之所在,明确我们的人生理想,进而在今后的生活和工作中更好的发挥自己的优势,学好自己的专业,成为一个对于社会有用的人,感谢我的同学们,在我绝望的时候给了我希望,没有他们,论文就不会有这么好,甚至无法完成。在此更要感谢我的老师xxx,是你的细心指导和关怀,使我能够顺利的完成毕业论文。老师对于学生总是默默的付出,尽管很多时候我们自己并没有特别重视论文的写作,没有按

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 学术论文 > 毕业设计

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922