VC++拼图游戏设计 精品.doc_第1页
VC++拼图游戏设计 精品.doc_第2页
VC++拼图游戏设计 精品.doc_第3页
VC++拼图游戏设计 精品.doc_第4页
VC++拼图游戏设计 精品.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

题目: VC+拼图游戏设计 Title: Design of Vc+ Puzzle Game 1 引言1.1 拼图游戏介绍拼图游戏是广受欢迎的一种智力游戏,它的变化多端,难度不一,让人百玩不厌。个性化的拼图,拼凑的不仅仅是一张照片,而是一个故事,一段回忆,一段温情。每一片的单片都有它自己的位置,就像每段回忆都有它的故事,你要将它放在专属的地方,放对了就慢慢丰富起来,放错了就无法完整。你可以把你记忆中最深的片段,可以是你挚爱的照片,可以是你最难忘的一瞬留念,做成拼图,在思念的季节里一一拼起,把片片散落的记忆重新组合,用指尖温习甜蜜,把心湖里最美丽的涟漪荡漾开来。拼图游戏不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。它既有简单易学的特性,为人民群众所喜闻乐见。1.2 开发背景当前网络上流传的拼图游戏功能并不尽善尽美,其中最主要的问题就是很多软件在图片打乱上面处理的比较模糊,也有采用固定的打乱方法;而且有时出现有一对板块是对调的无法完成游戏,所以我决定开发一个随机打乱图片可以完成的拼图游戏系统。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 20XX5Visual Assist X 10.1.1301.01.3.2 运行环境运行这款拼图游戏所需要的电脑配置如下:1Intel Pentium 2及以上处理器,32M以上内存,4G以上硬盘2Microsoft Windows 9X/NT操作系统3. 800*600或以上的屏幕分辨率2 设计要求2.1 基本要求打开任意一个图片,随机打乱图片,然后可以利用鼠标拖动空缺模块附近的模块与空缺模块进行交换,直到拼合出原来图像,具体要求如下:1. 可以打开并显示Jpg,bmp,gif等任意格式图片2. 游戏开始之后,可以随机打乱图片3 用户可以拖动模块进行交换,直到拼合出原图像4 系统能够自动检查到用户拼合出原图像并提示用户2.2 创新要求在基本要求达到后,进行创新设计,创新方向提示如下:1实现每次打乱图片都可以完成2可以提供原图像以供参考,并且加入边框3添加用户拼合出原图像的步数3 方案设计3.1 设计原理这款拼图游戏是以对话框的形式显现出来,详细设计步骤如下:1. 通过拼图边框的绘制及控件的添加来实现对话框的布局设置2. 将拼图边框划分成九个小格,每个小格分别用08来标识,通过转换设备环境内存的图片数据划分成9份分别显示到这九个小格子里,其中标识为8的小格不显示图片3. 构建函数实现小图片间的随机打乱,打乱过程确保可以完成拼图4. 通过消息映射来实现鼠标左键来控制格子的移动5. 通过图片的标识数字与08比较,如果都一样则完成拼图,否则继续拼图设计效果如图所示:756283410 图a 开始随机打乱标示数 图b开始界面123456780 图c 完成标示数 图d完成界面3.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平台是自动化很高的编译系统,它能自动处理源文件间的关系,利用其内在推理规则来激活编译器、连接器和资源编译器,最后生成可执行文件。【1】图2 Visual C+集成环境界面4.2 位图显示CBitmap类封装了Windows的GDI位图操作所需的大部分函数。其中,LoadBitmap是位图的初始化函数,其函数原型如下:BOOL LoadBitmap(LPCTSTR lpszResourceName);BOOL LoadBitmap(UINT nIDResource);由于位图不能直接显示在实际设备中,因此对于GDI位图的显示则必须遵循下列步骤:【2】 1. 调用CBitmap类的CreateBitmap、CreatepatibleBitmap以及CreateBitmapIndirect函数创建一个适当的位图对象。2. 调用CDC:CreatepatibleDC函数创建一个内存设备环境,以便位图在内存中保存下来,并与指定设备(窗口设备)环境相兼容。3. 调用CDC:SelectObject函数将位图对象选入内存设备环境中。4. 调用CDC:BitBlt或CDC:StretchBlt函数将位图复制到实际设备环境中。4.3 消息映射过程例如,若向CSCPortTestView中添加OnInitalUpdate的消息映射,则可按下列步骤进行:【3】1. 按Ctrl+W快捷键打开“MFC ClassWizard”对话框。2. 在Class name 组合框中,将类名选定为CSCPortTestView。此时,Object IDs和Messages列表内容会相应地改变。3. 在Object IDs列表框中选定CSCPortTestView,而在Messages列表中选定OnInitalUpdate消息。4. 双击Messages列表中的OnInitalUpdate消息或单击“Add Function”按钮,都会在CSCPortTestView类中添加该消息的映射函数OnInitalUpdate,同时在Member functions列表中显示这一消息映射函数和被映射的消息,如图所示:图3消息映射添加5.单击“Edit Code”按钮后,“ClassWizard”对话框退出,并转向文档窗口,定位到OnInitalUpdate函数源代码处。6.添加代码。7.这样就完成了一个消息映射过程。5 九宫格拼图游戏设计5.1 九宫格界面设计1. 对话框的创建对话框编辑器最初打开时,控件工具栏是随之出现的,利用此工具栏中的各个按钮可以顺利完成控件的添加。在对话框中添加一个控件的方法有下列几种:【2】1.1 在控件工具栏中单击某控件,此时的鼠标箭头在对话框内变成“十”字形状;在对话框指定位置单击鼠标左键,则此控件被添加到对话框的相应位置,再拖动刚添加控件的选择框可改变其大小和位置。1.2 在控件工具栏中单击某按钮,此时的鼠标箭头对话框内变成“十”字形状;在指定位置处单击鼠标左键不放,拖动鼠标至相应位置,释放鼠标键。1.3 用鼠标左键单击控件工具栏中的某个控件,并按住鼠标左键不放;在拖动鼠标到对话框的指定位置的过程中,用户会看到一个虚线框,下面带有改控件的标记;释放鼠标左键,新添加的控件立即出现在对话框中。2. 拼图边框的创建对话框创建之后,设计划分为九个小格的边框,代码如下:【5】 Void CMyDlg:Show(CDC * dc)CDC tdc;CBitmap bmp, *obmp; 图e 控件bmp.LoadBitmap(IDB_BG);/调入位图资源tdc.CreatepatibleDC(dc);/定义并创建一个内存设备环境obmp = tdc.SelectObject(&bmp);/将位图调入内存设备环境中CDC bmpdc, picdc; bmpdc.CreatepatibleDC(dc);picdc.CreatepatibleDC(dc);CBitmap bbmp, * obbmp;CBitmap pbmp, * opbmp;bbmp.CreatepatibleBitmap(dc, 360, 360);pbmp.CreatepatibleBitmap(dc, (360/size), (360/size);obbmp = bmpdc.SelectObject(&bbmp);opbmp = 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);bmpdc.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, 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份分别复制到实际的设备环境中,最后一格为空格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 = TRUE;编辑运行此段代码,主要实现以下功能:构建函数实现九宫格对话框的初始显示,包含了对话框的图标、3*3默认模式、图片的加载、step置0等。 5.2 MFC中图像的显示MFC中实现图片的显示需要先加载图片资源,然后通过设备环境的转换来实现。编程步骤如下:1. 启动Visual C+6.0,生成一个基于对话框结构的应用程序,对话框的基类为CMyDlg,同时将该程序命名为九宫格拼图;2 在应用程序的项目代码中添加CPicture类;3 使用资源编辑器向程序中添加Jepg等格式的图像资源;4 添加代码,编译运行程序。程序代码class CPicture public:CPicture(); /构造函数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; /转换设备环境,为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”的资源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中正常显示,所以要通过转换设备环境才可以显示。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 = GetImageSize(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_spIPicture)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 图片处理与游戏规则设计一些成员函数来实现图片的操作处理,例如图片的获取,打乱与移动等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 : 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;编辑运行此段代码,主要实现以下功能:当用户点击获取到某个位置的图片时,返回标记模板的数字,否则返回-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;maph*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 != 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 = mapb;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的话则有解,否则无解,无法拼合出原图。随机打乱流程图:构建随机因子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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论