拼图游戏制作文档_第1页
拼图游戏制作文档_第2页
拼图游戏制作文档_第3页
拼图游戏制作文档_第4页
拼图游戏制作文档_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、数据结构与算法分析基于MFC的拼图游戏设计宋富冉 操梦雅摘要:拼图游戏是一个广受欢迎的智力游戏,按人数参与个数可分为单人游戏和多人游戏,按拼图规则它可分为摆放式和挪动式两种类型。本设计是基于Visual C+ 6.0和MFC的拼图游戏设计,设计了一个操作简单的挪动式单人拼图游戏。本游戏主要包括游戏界面设计、难易度选择、游戏图片选择、游戏系统设计、判断拼图是否成功等几个模块,程序设计中应用了类、数组、鼠标响应、菜单消息响应等元素和语句。此游戏的设计主要以学习和熟悉Visual C+ 6.0和MFC软件开发为主要目的。关键词:拼图; Visual C+ 6.0; MFC1.任务描述1.1 拼图简单

2、介绍拼图游戏是广受欢迎的一种智力游戏,它的变化多端,难度不一,让人百玩不厌。个性化的拼图,拼凑的不仅仅是一张照片,而是一个故事,一段回忆,一段温情。每一片的单片都有属于它自己的位置,就像每段回忆都有属于它的故事,你要将它放在专属的地方。你可以把你记忆中最深刻的片段,你挚爱的照片,你最难忘的一瞬间,做成拼图,在你想起的时候一一拼起。拼图游戏不仅能增强思维能力,提高智力,而且富含哲理,有助于加强我们的动手能力和我们的洞察能力。 1.2 基本设计要求 我们设计的拼图游戏是一个具有简单的系统界面,操作简单易行,上手快,适用于广大用户的小游戏。此游戏分散的小图片的移动规则是小图片会朝着空位置方向移动,玩

3、家在界面上先通过鼠标点击“游戏图片选择”选择要拼的图片,然后通过鼠标左键点击要移动的小图片,小图片会自动移动到原来没有图片的位置,移动时,预备移动的图片旁边必须要有可供移动的位置,直到拼合出原来的图片,并且成功拼成图片后会出现“看来这对你来说太简单了,挑战更高难度吧!”一句话。具体设计要求如下:(1) 可以打开并显示.bmp任意大小的图片;(2) 游戏开始之后,可以自动随机打乱图片;(3) 用户可以点击方块进行上下左右的交换,直到拼出原图片;(4) 系统能够自动检测用户是否拼出原图,并提示用户拼图是否成功。2.系统需求分析2.1 功能需求分析(1) 用户能用鼠标控制系统界面上各个菜单选项的选择

4、。(2) 游戏难度选择功能:用户可以通过参数设置自定义选择游戏的难度,系统开始默认的是9块,如果用户想挑战更困难的,可以在设置参数设置中进行相应的参数修改,比如4*4=16块、5*5=25块、3*4=12块等。(3) 游戏音乐播放功能:用户可以根据自己的喜好进行选择是否播放音乐,所播放的音乐也是用户根据喜好自己来选择的。(4) 游戏原图显示功能:当玩家在玩游戏过程中忘记各个小图片的整体排列位置时能够进入原图显示功能查看完整图片,参考原图进行拼图游戏,以提高游戏的趣味性。(5) 游戏判断功能:用户通过移动每一小块图片,最终拼出和导入的图片一致时,系统则会判断你拼图成功,并提示“看来这对你来说太简

5、单了,挑战更高难度吧!”这句话。 图2-1 系统功能模块2.2 界面设计需求 该拼图游戏是以对话框的形式显示出来,顶部为标题栏,接着是菜单栏,菜单栏上是五个菜单选项:主菜单、游戏图像选择、参数设置、原图设置、帮助。然后接下来就是拼图游戏的拼图部分主界面。2.3 系统其他需求分析 (1)性能要求 可靠性强、实时性好 (2)设计约束 开发工具:VC+ 6.0、 运行环境:windows 2000以上 (3)软硬件要求 在windows平台上运行、应用程序用C+语言开发、客户端使用普通个人计算机。2.4系统流程图 图2-2系统流程图流程图说明:(1)启动程序,进入游戏界面。(2)用户根据自己的想法和

6、意愿选择游戏图片,并进行游戏参数设置后,程序有相应的操作,对应程序根据参数设置进行图片的分割,游戏区域均分,将分割后的子图片填充到游戏区域相等面积的方格内,并记录初始各个子图片的原始坐标,然后随机走动200步。(这个过程执行只在一瞬间即可完成)显示出游戏界面。(3)用户开始游戏,使用鼠标或者键盘上下左右键来进行拼图,在此过程中,程序会实时刷新画面,并全盘对比各个子图片的坐标和原始坐标是否相同,若相同则游戏结束,系统提示拼图成功,若不同,则用户继续游戏,继续移动子图片,判断程序循环执行,直到拼图成功。(4)若在游戏过程当中,想要参照原图,则点击原图显示菜单选项,原图像显示子程序被调用,并将原图像

7、显示在游戏区域一侧,供游戏者参考,不想参考可再次点击原图显示不显示原图像。(5)参数设置选项,可以进行拼图的难度设置,即图块的行列数设置,以及游戏背景音乐的设置,在此过程中程序将执行相应的子函数进行响应用户操作。(6)中途可以随时重新开始新游戏,退出游戏,参数设置,原图显示与否,调换游戏图片等,不必关闭程序重新打开。并且确保每次拼图必定会成功,不会出现拼图不成功的情况。3.函数功能设置(1)int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) /切换"文本提示形式"菜单选项为"图像提示形式"HMEN

8、U hmenu;hmenu=:GetMenu(m_hWnd); /获取主菜单控制权/获取图片选取菜单选项所在的子菜单栏目的控制权hmenu=:GetSubMenu(hmenu,1);char * hbmp;UINT ITEM_ID;HINSTANCE hinst = AfxGetInstanceHandle();/获取实例的句柄/载入相关的缩小预览型的位图图片,并进行相关选项的属性修改hbmp=(char *)LoadBitmap(hinst,MAKEINTRESOURCE(IDB_PIC1); /图片的载入ITEM_ID = :GetMenuItemID(hmenu,1); /相应菜单选项的

9、ID获取/属性修改-切换成图像显示方式:ModifyMenu(hmenu,1,MF_BYPOSITION|MF_BITMAP,ITEM_ID,hbmp);(2)BOOL CMainFrame:OnCreateClient(LPCREATESTRUCT,CCreateContext* pContext) /创建1行2列的分裂视图,设定出游戏界面(参见图3-1)m_wndSplitter.CreateStatic(this,1, 2); m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CSFRCMYPINTUView), CSize(300,0), pCont

10、ext);m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(COrgView), CSize(0,0), pContext);m_wndSplitter.SetActivePane(0,0); /将第一个作为当前激活状态的视图图3-1 游戏初始界面(3)BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs) /设置对应图3-1的初始界面窗口显示的大小 cs.cx = 600;cs.cy = 400;cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE|

11、 WS_THICKFRAME | WS_SYSMENU;cs.dwExStyle = WS_EX_ACCEPTFILES; (4)void COrgView:OnDraw(CDC* pDC)/ 源图像绘制函数CSFRCMYPINTUDoc* pDoc = (CSFRCMYPINTUDoc*)GetDocument() CDC memdc; /使用内存DCmemdc.CreateCompatibleDC(pDC);memdc.SelectObject(pDoc->m_bitmap);pDC->BitBlt(0,0,pDoc->m_bmpWidth,pDoc->m_bmpH

12、eight,&memdc,0,0,SRCCOPY); / /整幅图拷贝void COrgView:DrawAll(CDC *pDC)/是否显示原图像的响应函数(5) void COrgView:OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)/更新界面函数(6)void CSetitingDlg:OK()/确定并保存参设设置的所有更改(参见图3-2)(7)BOOL CSetitingDlg:OnInitDialog()CDialog:OnInitDialog();/初始化各个游戏参数(部分可参见图3-2)m_iCols=Afx

13、GetApp()->GetProfileInt(_T("游戏参数"),_T("hnums"),3);m_iRows=AfxGetApp()->GetProfileInt(_T("游戏参数"),_T("vnums"),3);(8)void CSetitingDlg:OnOpen()/选取播放背景音乐时,打开相关文件函数(参见图3-2)CString strFilter="MP3文件(*.mp3)|*.mp3"CFileDialog fileopen(TRUE,NULL,NULL,OFN

14、_HIDEREADONLY|OFNOVERWRITEPROMPT,strFilter);if(fileopen.DoModal()=IDOK)m_strMusicFileName=fileopen.GetPathName();UpdateData(FALSE);(9)void CSFRCMYPINTUDoc:GameMixMove()/ 游戏初始化,随机打乱图像,随机走300步(10)void CSFRCMYPINTUDoc:GameMove(UINT nChar)/根据按键输入指示命令作移动操作函数,与(9)协作(11)BOOL CSFRCMYPINTUDoc:IsWin(void)/检测是

15、否拼图成功函数/胜利的检测方法是判断地图的所有方块的内部数据是否全为其行列数,是则表示排列好,胜利(12)void CSFRCMYPINTUDoc:MapInitial()/图片数据的初始化函数int i,j;/将原来各个位置的数据填好其所在的行ID,列IDfor(i=1;i<=hnums;i+)for(j=1;j<=vnums;j+)m_mapij.row =i; m_mapij.col =j;(13)void CSFRCMYPINTUDoc:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) / 处理键盘事件函数(14)void C

16、SFRCMYPINTUDoc:OnMenuOrgPicShow() / 修改窗口是否显示源图的菜单消息处理函数m_bShowOrgPic = !m_bShowOrgPic; /修改原来的显示SetWindow_N_ViewSize();/重设窗口大小与视图分布(15)void CSFRCMYPINTUDoc:OnNewGame()/开始新游戏函数(参见图3-1)SetWindow_N_ViewSize();MapInitial();/地图的初始化m_blankPos.row =hnums; /打乱前将空白块起点放在右下角m_blankPos.col =vnums;GameMixMove();/

17、打乱地图(随机移动200步)UpdateAllViews(NULL); /更新视图(16)void CSFRCMYPINTUDoc:OnPic1() /游戏图片选取函数(参见图3-1)PicSelect(IDB_BITMAP1);(17)void CSFRCMYPINTUDoc:OnSet() /游戏参数设置响应函数(参见图3-2)图3-2 参数设置对话框界面(18)void CSFRCMYPINTUDoc:OnUserpic() / 用户选择路径自定义图片函数(19)void CSFRCMYPINTUDoc:SetWindow_N_ViewSize()/设置开始游戏后游戏窗口界面大小函数(2

18、0)void CSFRCMYPINTUView:OnLButtonDown(UINT nFlags, CPoint point) / 处理鼠标左键消息函数CSFRCMYPINTUDoc* pDoc = (CSFRCMYPINTUDoc*)GetDocument();pos DownPos; /计算出鼠标点击所在的cell方块位置DownPos.row =point.x/pDoc->m_cellWidth+1;DownPos.col =point.y/pDoc->m_cellHeight+1;/根据当前空白方块位置将鼠标点击其相邻方块的情况if(abs(DownPos.row-pDo

19、c->m_blankPos.row)+abs(DownPos.col-pDoc->m_blankPos.col)=1)if(DownPos.row - pDoc->m_blankPos.row = 1)pDoc->OnKeyDown(VK_RIGHT,0,0); (中间略去). CView:OnLButtonDown(nFlags, point);(21)void CSFRCMYPINTUView:DrawGameBlocks(CDC *pDC)/ 绘制游戏所有当前散乱的方块(22)void CSFRCMYPINTUView:DrawCellBlock(CDC *pDC

20、, pos destPos, pos srcPos) /根据源方块的位置和目标放开位置(当前方块实际位置)(23)void CSFRCMYPINTUDoc:PlayMusic() / 播放背景音乐函数/说明: 利用MCI机制控制媒体设备放音4.数据结构的设计在函数功能的设计中我们提到了相关的结构体的定义,在这里给出重要的结构框架定义:(1 ) struct pos /方块位置结构 int row; /图像所在的行坐标 int col; /图像所在的列坐标;(2) class OrgView:public CView /原图像显示类 void COrgView:DrawAll(CDC *pDC)

21、void COrgView:OnDraw(CDC* pDC). ;(3) class CSetitingDlg : public CDialog /参数和音乐播放等对话框对应设置处理类void CSetitingDlg:OK()void CSetitingDlg:OnOpen()BOOL CSetitingDlg:OnInitDialog().;(4) class CSFRCMYPINTUApp : public CWinApp /程序基础类; (5) class CSFRCMYPINTUDoc : public CDocument /程序基础文档类BOOL CSFRCMYPINTUDoc:I

22、sWin(void)void CSFRCMYPINTUDoc:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)void CSFRCMYPINTUDoc:OnNewGame() void CSFRCMYPINTUDoc:OnPic1() void CSFRCMYPINTUDoc:OnSet()void CSFRCMYPINTUDoc:OnUserpic() void CSFRCMYPINTUDoc:PlayMusic().;(6) class CSFRCMYPINTUView : public CView/程序基础视图类 void CSFRCMYP

23、INTUView:DrawLines(CDC *pDC)void CSFRCMYPINTUView:DrawBlankBlock(CDC *pDC)void CSFRCMYPINTUView:DrawCellBlock(CDC *pDC, pos destPos, pos srcPos)void CSFRCMYPINTUView:OnLButtonDown(UINT nFlags, CPoint point)void CSFRCMYPINTUView:OnDraw(CDC* pDC) ;(7) class CAboutDlg : public CDialog/程序基础对话框类 .;(8) cl

24、ass CMainFrame : public CFrameWnd/程序主函数类 int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs);5.详细设计 5.1 初始窗体设计利用MFC AppWinzard生成五子棋游戏应用程序框架具体步骤如下:1.执行VC程序,选择File|New命令,弹出New对话框.单击Projects标签,转到Projects选项卡,选择MFC AppWizard(exe)选项,然后在Project name文本

25、框中输入SFRCMYPINTU。Lacation文本框是指项目的本地路径。图5-1 新建MFC AppWinzard工程文件2.单击按钮,弹出MFC AppWinzard_Step1对话框。如图所示。图5-2 选择单文档模式3.单击完成按钮,则建立一个单文档应用框架。5.2 菜单设计1添加菜单项 图5-3 添加menu菜单2.给对应的菜单项添加响应函数(1)单击菜单右键,选择ClassWizard,在Class name:中选择在哪个类中添加响应函数,在Messages:中选择COMMAND,选中完成后,点击 Add Function,然后可以点击Edit Code编辑响应函数,比如

26、游戏图片选择菜单下的自定义图片和系统图片菜单添加响应函数如下图所示:图5-4 添加菜单响应函数其响应函数代码如下:1)系统图片void CSFRCMYPINTUDoc:OnPic1() / TODO: Add your command handler code herePicSelect(IDB_BITMAP1);2)自定义图片void CSFRCMYPINTUDoc:OnUserpic() /用文件对话框的方式选择播放的音乐CString filter="BMP文件(*.bmp)|*.bmp"CFileDialog picfile(TRUE,NULL,NULL,OFN_H

27、IDEREADONLY|OFN_OVERWRITEPROMPT,filter);if(picfile.DoModal()=IDOK)/确定后读入位图并开始游戏HBITMAP hbitmap; /按照尺寸m_BMP_WIDTH,m_BMP_HEIGHT读/入位图文件(根据源图比例放大与缩小)hbitmap=(HBITMAP):LoadImage(NULL,picfile.GetPathName(),IMAGE_BITMAP,m_BMP_WIDTH,m_BMP_HEIGHT+180,LR_LOADFROMFILE);m_bitmap.Detach();/弃旧选新m_bitmap.Attach(hb

28、itmap);CSFRCMYPINTUDoc:OnNewGame();/开始游戏(2)操作菜单分为:原图显示、参数设置、开始新游戏和退出四个子菜单(3)帮助菜单:一个关于拼图游戏的菜单,其响应函数如下:void CSFRCMYPINTUApp:OnAppAbout()CAboutDlg aboutDlg;aboutDlg.DoModal();以上添加函数等功能,同类功能添加,操作步骤完全一样,不再重复。5.3 游戏设计 5.3.1 参数设置设计 首先SFRCMYPINTU resources在引用一个对话框资源Dialog,并添加一个对话框类,将所需要设置的参数等对话命令符等添加完毕,并设置好

29、相应的名称及ID号。也为此参数设置添加了一个类,其功能是对对话框所列参数更改等设置相应函数命令的处理。添加设置结果如下图所示:图5-6游戏参数设置画面然后,为这个对话框的弹出指令添加相应的响应函数如下:void CSFRCMYPINTUDoc:OnSet() CSetitingDlg set;if(set.DoModal()=IDOK) hnums=set.m_iCols;vnums=set.m_iRows;m_bMusic=set.m_bMusic;m_szMusicFileName=set.m_strMusicFileName;OnNewGame(); 5.3.2 原图显示设计 在这一部分

30、设计中,首先为其独自添加一个类,来进行相应的函数处理,其功能设置只包含一个,原图像的显示与否:子函数包含两个void COrgView:OnDraw(CDC* pDC)与void COrgView:OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint),其显示结果效果图如下图所示:图5-7游戏原图显示与否效果图 5.3.3 游戏图片绘制设计在此部分,初始状态是将整幅图片绘制显示在游戏区域,并将其根据参数设置等大小划分游戏图片块,并将其初始坐标利用二维数组m_mapij.保存下来。然后才去绘制空白块,覆盖初始右下角的原始游戏图块,即用空白块代

31、替最右下角图片块,然后随机移动空白块与游戏图片块的交换,也就是初始化游戏,实现打乱的功能。另外,本人采用的是缓存绘制,只进行初始化图片坐标的保存,在游戏过程中利用缓存存储各个子游戏块的坐标。最后判断拼图是否成功时,再将其缓存坐标与原始坐标相比较,判断是否拼图成功。其绘制代码如下:void CSFRCMYPINTUView:OnDraw(CDC* pDC)/a.获取文档数据控制权CSFRCMYPINTUDoc* pDoc = (CSFRCMYPINTUDoc*)GetDocument();/b.使用内存设备环境memDCCDC memDC; / 与内存环境关联的内存位图memBmpmemDC.C

32、reateCompatibleDC(pDC);CBitmap memBmp;memBmp.CreateCompatibleBitmap(pDC,pDoc->m_bmpWidth,pDoc->m_bmpHeight);memDC.SelectObject(&memBmp);/c. 将图像绘制到内存位图memBmp中/1.绘制游戏所有当前散乱的方块DrawGameBlocks(&memDC); /2.绘制空白方块DrawBlankBlock(&memDC); /3.绘制边界间隔线条DrawLines(&memDC); /d.整幅图从内存memBmp拷贝到

33、屏幕pDC->BitBlt(0,0,pDoc->m_bmpWidth,pDoc->m_bmpHeight,&memDC,0,0,SRCCOPY); 5.4判断胜负设计胜负判断实际上是根据当前空白快的情况来判断胜负的,这也是为什么添加void CSFRCMYPINTUDoc:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)的原因。实际上判断只需要空白块的位置是否与原始位置相同,若相同则全局判断其他图片块是否与初始位置坐标相符合,若相符合则判断拼图成功,否则拼图不成功,游戏继续。其判断胜负代码如下:BOOL CSFRCMYP

34、INTUDoc:IsWin(void) int i,j; /胜利的检测方法是判断地图的所有方块的内部 /数据是否全为其行列数,是则表示排列好,胜利if(i !=m_blankPos.row | j != m_blankPos.col)for(i = 1;i<=hnums;i+) for(j = 1;j<=vnums;j+)if(m_mapij.row !=i | m_mapij.col !=j)return FALSE;return TRUE;拼图成功后的结果截图如下所示:图5-8 3*3的拼图成功画面5.5 移动图片的鼠标键盘响应设计按照预先设定的方案,采用鼠标和键盘方向键来移动

35、图块,进行拼图游戏操作,点击鼠标左键选择相应的图块与相邻的图块进行交换,完成游戏(按压键盘方向键也是一样的作用)。因此,必须为鼠标添加鼠标左键单击的鼠标和键盘方向键的消息处理函数,步骤如下:(1)右击CLM_FiveChessView类,调用添加消息处理函数的对话框,选择Add windows MessageHandler (2)添加消息处理函数WM_LBUTTONDOWN和WM_KEYDOWN这两个消息处理函数。然后点击Edit Exisiting退出对话框。并添加消息处理函数代码。如下图所示:图5-9 添加Windows消息/事件5.6调试与运行编译

36、程序:鼠标点击 build>Rebuild all。编译若出现错误提示,则根据提示修改程序,直至编译无误。然后运行。得到的结果如下:(1)初始化界面图5-10 初始化界面(2)游戏界面图5-11 游戏界面6.界面设计初步设想界面采用两个界面形式,可考虑添加背景,一边显示拼图游戏区,另外一边显示原图像。(参见图3-1)有关于窗口的大小与界面的分布情况,经过调节实践,最终确定初始窗口的尺寸定为长600个单位,宽则为400个单位为比较合适的尺寸,看上去相对视觉效果还是比较舒服的。此外,在界面上只包含三个菜单选项,分别为:文件、游戏图片选择、帮助。在文件下面还有相应的子菜单,而游戏图片下则为图形提示形式的供游戏选择的图片选项,在此共设置五幅图片,最后一个为作者本人图像,其他的则是网络图片。而且第一个选项为自定义图片菜单选项。原图像的显示菜单选项功能描述:点击“原图显示”菜单选项,显示则前面会出现一个“”,再点击则不显示原图则前面没有“”,而此时原图显示区域也将隐藏,只显示游戏区域,而且保证无论游戏难度如何变化,即行列数划分多少,游戏区域总的面积大小将一直保持不变。效果图如下图3-3所示:图3-3 原图显示效果图在

温馨提示

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

最新文档

评论

0/150

提交评论