ImageVerifierCode 换一换
格式:DOCX , 页数:66 ,大小:1.16MB ,
资源ID:8517632      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8517632.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C++做拼图游戏.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C++做拼图游戏.docx

1、C+做拼图游戏一步一步做拼图游戏,C+版首先,我们就要抛弃控制台的黑洞洞的窗口了,我们必须要先创建一个Windows的窗口。创建的方法有很多,不过呢,要先确定你将要使用的编译器,VC6.0,VS2005,VS2008,VS2010,DEV-C+,Code:Block等等,还有一个C+ Builder和其他的不太一样。我用的是VS2010 Team版,Win7系统。所以我就以VS2010为例子了。其他的也差不多。一、创建窗口:1.文件-新建-项目-Win32项目,写上名字,点确定。如图2.在新窗口中点下一步,直接点完成也可以,直接点完成的就可以跳过第3步。3.在这个窗口中要选择windows应用

2、程序,不要选空项目,再点确定,如图:这些完了之后,就会出现Puzzle.cpp文件,里面就是代码。解决方案管理器里会有其他的东西,如图所示:可以看到有很多文件,双击打开后都有注释写着每个文件的用处,我们目前只用到Puzzle.cpp,当然,如果你起的是别的名字,就和我的不同了。现在编译,运行就可以看到一个白色的窗口,里面什么都没有。然后,我们还要进行一点其他的修改工作:找到下面的一段代码Code:1. BOOLInitInstance(HINSTANCEhInstance,intnCmdShow) 2. 3. HWNDhWnd; 4. 5. hInst=hInstance;/6. 7. hWn

3、d=CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW&WS_SIZEBOX&WS_MAXIMIZEBOX,/这里修改了,让WS_OVERLAPPEDWINDOW&WS_SIZEBOX&WS_MAXIMIZEBOX的目的是去掉最大化的按钮,同时禁止修改窗口大小8. CW_USEDEFAULT,0,/*CW_USEDEFAULT,0*/800,600,/*这里的800和600就是窗口的大小,我采用的是800*600的,大家自己根据实际情况改*/NULL,NULL,hInstance,NULL); 9. 10. 二、制作一些其他需要的资源现

4、在有窗口了,那么,我们要有其他的资源,比如各种图片,声音,还可以有鼠标指针。我们先制作图片就行了,声音,鼠标指针以后再说。因为图片资源是必须的,其他的是可选的。我们需要一张背景图片。随便找张图片,选个大小,我当然选的是800*600的。然后打开PS去修改吧,我不教PS了,我改的结果是这样的,里面还有一些坐标要记下来的。如图:再来一张没坐标的,可以直接下载用。不过因为CSDN的相册空间太小,所以给个地址吧,链接到XX相册,大家见谅。记住,保存成BMP格式的,因为BMP的读取起来很容易,如果是JPG的,还要自己去写相应的读取函数。转换的方法就是用画图打开图片,然后选择 “文件-另存为-BMP(24

5、位)”然后,还要一张用来进行游戏的图,也就是要拼的图,这个更简单了,弄张400*400的就行了(因为我的游戏区大小是400*400)。到现在为止,我们的准备工作已经完成了。下面,就是编写代码的过程了。三、设计功能1.定义类CPuzzleLogic, 用来实现内部逻辑的行为CPuzzleView,用来实现视图显示方面的CPuzzleMain用来实现主程序,主要是把各部分的联系起来如果还有其他需要的,以后再定义别的创建类的时候可以用类向导,不过,VS2008和VS2005里没有,所以用以下方法:先把解决方案管理器调到类视图里,在项目名称上单击鼠标右键,添加,类选“C+类”,单击“添加”,在新窗口中

6、写上类名,单击“确定”如上图,再重复添加其他两个类。在CPuzzleMain类的头文件上面的#pragma once后面加上#include PuzzleLogic.h#include PuzzleView.h2.给类相应的功能先在CPuzzleMain类里添加两个成员变量,分别是其他两个类的类型,用来以后引用里面的功能。添加方法如下图:在类视图里右键单击类名称,添加,添加变量选成private可以防止类外访问到它,写上变量类型和变量名称,然后可以写几句注释以同样的方法再添加另一个变量,当然,你也可以直接在头文件里写上,效果是一样的,只是这样的做法可以自动初始化系统有的类型,否则有时候会出错。

7、3.添加画图功能我们设计一个画图的函数,这样的话,以后就不必每次都去写画图函数了添加函数的方法:在类视图里右键单击类名称,添加,添加函数,参考添加变量的图在新窗口中输入返回类型,函数名,函数的参数,以及注释等等信息。这样的好处是点击完成的时候,系统会自动添加到头文件中声明,和.cpp文件中的定义部分。然后写代码吧。(1)要先在CPuzzleView里加上两个成员变量private: HWND m_hWnd; /保存窗口句柄 HBITMAP m_hBmpBack;/保存背景图片(2)把前面做好的图片复制到源代码文件夹的res文件夹里,如果没有的话,就自己新建一个,当然你也可以写别的名字,不过要自

8、己记住,我这里就以res为例子。(3)添加以下几个函数Code:1. /画图,hBitmap表示指向图片的指针,x,y表示位图显示的横纵坐标,nWidth,nHeight位图的宽度和高度,srcX,srcY从位图的的哪个位置开始显示2. voidCPuzzleView:DrawPic(HBITMAPhBitmap,intx,inty,intnWidth,intnHeight,constintsrcX=0,constintsrcY=0) 3. 4. HDChdcMem;/内存DC5. HDChdcScr=GetDC(m_hWnd);/获取屏幕的DC6. hdcMem=CreateCompatib

9、leDC(hdcScr);/创建兼容屏幕的内存DC7. SelectObject(hdcMem,hBitmap);/将图片绑定内存DC上8. BitBlt(hdcScr,x,y,nWidth,nHeight,hdcMem,srcX,srcY,SRCCOPY);/将内存DC里的东西画到屏幕上9. DeleteDC(hdcMem);/清除两个DC10. DeleteDC(hdcScr); 11. 12. 13. /初始化图像显示的对象14. boolCPuzzleView:InitView(HWNDhWnd) 15. 16. m_hWnd=hWnd;/将窗口句柄传进来17. m_hBmpBack=

10、(HBITMAP)LoadImage(NULL,_T(resbackground.bmp),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);/读取图片文件18. if(m_hBmpBack=NULL) 19. 20. MessageBox(NULL,_T(读取背景文件失败),_T(Error),MB_OK); 21. returnfalse; 22. 23. DrawPic(m_hBmpBack,0,0,800,600);/画背景24. returntrue; 25. 26. 27. /用于重绘28. voidCPuzzleView:OnPai

11、nt(void) 29. 30. DrawPic(m_hBmpBack,0,0,800,600);/重绘背景31. 在CPuzzleMain类里添加函数Code:1. /执行初始化工作2. boolCPuzzleMain:InitMain(HWNDhWnd) 3. 4. m_View.InitView(hWnd); 5. returnfalse; 6. 7. /用来重绘8. voidCPuzzleMain:OnPaint(void) 9. 10. m_View.OnPaint(); 11. 12. 然后,在Puzzle.cpp中,也就是系统自动生成的文件里添加全局变量及头文件引用#includ

12、e PuzzleMain.hCPuzzleMain g_PuzzleMain;/保存游戏实例在下面的BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)函数中,return前加上游戏的初始化代码g_PuzzleMain.InitMain(hWnd);在消息循环的函数中,找到Code:1. LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam) 2. 3. 4. caseWM_PAINT: 5. hdc=BeginPaint(hWnd,&ps); 6. /TO

13、DO:在此添加任意绘图代码.7. g_PuzzleMain.OnPaint();/添加绘图代码8. EndPaint(hWnd,&ps); 9. break; 10. 11. 好了,现在编译并运行程序,就可以显示出来背景了。简单介绍一下,在OnPaint()里会看到HDC类型的变量,比如HDC hMem;这是声明了一个内存DC,所谓DC,网上说的是设备描述表(Device Context,DC),设备描述表(Device Context,DC)是一个信息结构体,包含物理输出设备及其驱动程序。在Windows平台下,所有的图形操作都是通过它完成。不用管他是什么结构体,只要知道用它可以操作图形图像

14、,想显示在显示器里就要创建一个兼容显示设备的DC,然后就可以显示了,比如Code:1. HDChdcMem;m;/内存DC2. HDChdcScr=GetDC(m_hWnd);/获取屏幕的DC3. hdcMem=CreateCompatibleDC(hdcScr);/创建兼容屏幕的内存DC4. SelectObject(hdcMem,hBitmap);/将图片绑定内存DC上5. BitBlt(hdcScr,x,y,nWidth,nHeight,hdcMem,srcX,srcY,SRCCOPY);/将内存DC里的东西画到屏幕上这个过程是先创建内存DC,然后获取了屏幕DC,再设置内存DC兼容屏幕D

15、C,其实就是这两个的信息是一致的了,然后把图片绑定到内存DC里,这样,内存DC里就有了图片,但是,这时还看不到图片,我们最后用BitBlt函数把内存DC里的东西复制到屏幕DC上,这样就能显示出来,我们就看到了。如果还是不明白的话,请上网XX,Google一下,有很多解释的。Code:1. caseWM_PAINT: 2. hdc=BeginPaint(hWnd,&ps); 3. /TODO:在此添加任意绘图代码.4. g_PuzzleMain.OnPaint();/添加绘图代码5. EndPaint(hWnd,&ps); 6. break;WM_PAINT是windows应用程序的重绘消息,当

16、收到这个消息的时候,就意味着屏幕要发生变化了,需要重绘,一般的,当你把窗口移到屏幕外,再移回来,就要发生重绘等等,我们在这加上重绘代码,使我们的程序在移动或者被覆盖的时候还能显示回来。虽然上面我们已经写了很多代码了,也能显示背景了,但是有时候会经常改以前的东西,甚至推翻重做。下面是读取游戏的要拼的图片了。首先,我们要确定逻辑保存方式,我采用的是一个一维数组表示。而且为了可以切割成任意块数,所以定义成了一个指针类型。这是在CPuzzleLogic里定义的Code:1. int*m_Block;/用来保存当前局面的2. intm_BlockNum;/保存此局横向要分成多少块因为拼图是一个正方形的,

17、所以只用了一个表示横向的有多少块的变量还要进行初始化,在CPuzzleLogic里添加了一个初始化函数,当然现在的函数还做不到真正初始化,只是提供了一种测试方法。Code:1. /BlockNum为要切割的方块数,只在横向或纵向的2. boolCPuzzleLogic:InitLogic(intBlockNum) 3. 4. m_BlockNum=BlockNum; 5. m_Block=newintBlockNum*BlockNum; 6. for(inti=0;iBlockNum;+i) 7. 8. for(intj=0;jBlockNum;+j) 9. 10. intnum=BlockN

18、um-i-1; 11. m_Blocki*BlockNum+j=num*10+j; 12. 13. 14. returntrue; 15. 16. 而且,修改了一个初始化的函数,增加了读取其他图片的功能。不仅仅是读取背景图片了然后就是CPuzzleView类里的内容了。改动较大。请仔细看。下面还定义了很多必要的变量,主要是表示坐标等等。Code:1. /初始化图像显示的对象2. boolInitView(HWNDhWnd,intBlockNum=3); 3. private: 4. /保存图案5. HBITMAPm_hBmpGame; 6. /保存小图案7. HBITMAPm_hBmpGame

19、Small; 8. /右上角的坐标及大小9. staticconstintm_Small_x=560; 10. staticconstintm_Small_y=70; 11. staticconstintm_Small_width=200; 12. staticconstintm_Small_height=200; 13. /图片游戏区的大小及坐标14. staticconstintm_Game_x=70; 15. staticconstintm_Game_y=100; 16. staticconstintm_Game_width=400; 17. staticconstintm_Game_h

20、eight=400; 18. intm_FrameNum;/表示要分隔的块数(一排的)19. int*m_Block;/表示当前状态20. boolm_IsGameStarted;/游戏是否已经开始21. public: 22. /读取图像列表(就是拆开图像)23. boolLoadBMPList(int*Block); 24. /设置游戏是否已经开始25. voidSetGameStarted(boolbStarted); 然后初始化的函数有所改动,增加了一个参数,里面又读取了其他的几个图片。这里面也没什么要特别说明的。Code:1. #defineGETX(x)(x+70)2. #defi

21、neGETY(y)(y+100)3. /初始化图像显示的对象4. boolCPuzzleView:InitView(HWNDhWnd,intBlockNum) 5. 6. 7. /读取图案8. m_hBmpGame=(HBITMAP)LoadImage(NULL,_T(resgame.bmp),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); 9. if(m_hBmpBack=NULL)/判断是否读取图片成功10. 11. MessageBox(NULL,_T(读取图案文件失败),_T(Error),MB_OK); 12. returnfals

22、e; 13. 14. m_hBmpGameSmall=(HBITMAP)LoadImage(NULL,_T(resgamesmall.bmp),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); 15. if(m_hBmpGameSmall=NULL)/判断是否读取图片成功16. 17. MessageBox(NULL,_T(读取小图案文件失败),_T(Error),MB_OK); 18. returnfalse; 19. 20. m_FrameNum=BlockNum; 21. m_Block=newintm_FrameNum*m_FrameN

23、um;/这个就是申请内存空间22. OnPaint(); 23. returntrue; 24. 25. 26. 下一个是以下两个函数,也没什么特别说明的。 27. 28. /读取图像列表(就是拆开图像)29. boolCPuzzleView:LoadBMPList(int*Block) 30. 31. memcpy(m_Block,Block,sizeof(int)*m_FrameNum*m_FrameNum); 32. /m_Block=Block;33. /OnPaint();34. returntrue; 35. 36. 37. 38. /设置游戏是否已经开始39. voidCPuzz

24、leView:SetGameStarted(boolbStarted) 40. 41. m_IsGameStarted=bStarted; 42. OnPaint(); 43. 最关键的是重绘函数,彻底的更改了,上次的教程里只是为了显示一下背景,而现在要显示的东西多了,就不能再用原来的那个了。先看代码:Code:1. /用于重绘2. voidCPuzzleView:OnPaint(void) 3. 4. HDChdcMem;/内存DC5. HDChdcScr=GetDC(m_hWnd);/获取屏幕的DC6. hdcMem=CreateCompatibleDC(hdcScr);/创建兼容屏幕的内存DC7.

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1