基于Visual C++的连连看游戏的设计与实现.docx
- 文档编号:14047120
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:22
- 大小:80.91KB
基于Visual C++的连连看游戏的设计与实现.docx
《基于Visual C++的连连看游戏的设计与实现.docx》由会员分享,可在线阅读,更多相关《基于Visual C++的连连看游戏的设计与实现.docx(22页珍藏版)》请在冰点文库上搜索。
基于VisualC++的连连看游戏的设计与实现
基于VisualC++的“连连看”游戏的设计与实现
1前言..................................................................12概要设计..............................................................22.1开发工具简介......................................................22.2总体设计思想......................................................22.3框架设计..........................................................23详细设计..............................................................33.1基本数据结构模块设计..............................................3
3.1.1设计思路.......................................................3
3.1.2代码设计......................................................4
3.2图案方块的连接判断模块设计........................................5
3.2.1设计思路.......................................................5
3.2.2流程设计.......................................................6
3.2.3代码设计.......................................................73.3鼠标事件处理功能模块的设计.......................................10
3.3.1设计思路.....................................................10
3.3.2流程设计......................................................10
3.3.4代码设计......................................................123.4绘图功能模块设计.................................................14
3.4.1设计思路......................................................14
3.4.2绘图资源的载入与初始化的代码设计..............................15
3.4.3绘制游戏区域的代码设计.......................................163.5游戏胜利的判断模块的设计.........................................18
3.5.1设计思路......................................................18
3.5.2代码设计......................................................184测试与运行...........................................................185结束语...............................................................19参考文献...............................................................19
基于VisualC++的“连连看”游戏的设计与实现
摘要:
随着游戏产业日益壮大,休闲类游戏以主题新奇、容易掌握而成为游戏的主流。
本文所介绍
的连连看游戏是采用VisualC++开发、使用MFC提供的对话框模式搭建框架的一款休闲类游戏,玩
家可以根据游戏规则成对地销毁方块来取得游戏的胜利。
本文在介绍游戏的总体设计思想和设计框
架的基础上,主要从基本数据结构、图案方块的连接判断、鼠标事件处理、绘图和游戏胜利判断模
块的设计与实现方面阐述了整个游戏的开发过程。
关键词:
游戏;VisualC++;图案
TheDesignofLianliankanGameBasedonVisualC++
Abstract:
Withthegrandnessofgameindustryincreasingly,thegamesforlyingfallow,
whichprovidingwithnoveltopicandfeatureofbeingeasygrasped,becomesthe
mainstreamofgame.TheLianliankangameintroducedinthispaperisakindofgameforlyingfallow,whichisdevelopedbasedontechnologyofVisualC++,anditsframeisbuilt
withthemodelofdialogboxprovidedinMFC.Thegameplayersareabletocometothevictorybydestroyingtheblocksincouplesaccordingtogameregulation.Onthebasisofintroducingthethoughtandframeofmacrodesign,theprocessofdevelopingthisgame
fromdesigningandimplementingthefunctionsrangingfromfundamentaldatastructure,
judgingthelinkofpatternblock,mouseeventhandling,drawingandjudgingthevictoryof
gameisdescribedinthispaper.
Keywords:
Game;VisualC++;Pattern
1前言
随着游戏产业日益壮大,现代青年日常生活中经常用游戏来休闲娱乐,游戏市场有很大的潜力,很多国家都对游戏市场十分重视。
在美国,游戏业的产业规模已连续4年超过了好莱坞电影业,成为美国最大的娱乐产业;在日本,游戏业的年市场效益超过两万亿日元;在韩国,游戏产业已跃居国家新经济领域中的支柱地位,超过30%的企业收益都来自该产业。
中国的游戏产业市场是一片亟待开发的大金矿,目前基本属于未被开发状态。
中国国内一年的游戏业总销售额也就是2—3亿元人民币,自主开发产品的销售额仅占2—3千万元人民币,市场主要份额仍被国外产品占据。
电视游戏在国内属被控范围,中国入世后,会有宽松,而网络游戏随网络的发展,会更快进入家庭。
来自《中国文化报》的报道称,著名的“联众”游戏网站目前注册用户达3000万;收费会员30多万,以每月10元的个人会费计算,“联众”的月会员费就可达300多万元人民币;同时在线用户数最高达20万;每天用户访问总时达350万小时;网络游戏前景灿烂。
另据中国互联网络信息中心2002年1月15日在京发布的第九次《中国互联网络发展状况统计报告》数据显示,至2001年12月31曰,本国上网计算机数达1254万台,比去年同期增长40.6%;网民达3370万人(截止2002年7月,中国网民已接近5000万),比去年同期增长49.8%;35岁以下的网民占79.9%,未婚用户占56.9%,以休闲娱乐为目的用户占31.1%,经常进行网上游戏娱乐的占17.1%,认为网上休闲娱乐信息还不能满足需要的用户占21%。
相比而言,在互联网的发展速度、规模以及用户数上,北京市在国内名列第一,CN下注册域名北京占33.8%,WWW站点北京占20.6%。
中国出版工业者协会游戏工委辛晓征秘书长发布的《2005年度中国游戏产业年报》披露了几项重要数据,包括:
“2005年底,中国网络游戏用户已达到2634万,其中付费用户达到1351万,比2004年同期增长百分之三十以上”;“2005年网络游戏的销售收入达到37.7亿人民币,比2004年增长了52.6%,增长率远远超过原有的预计”;“2005年,与网络游戏相关的电信业务收入为173.4亿元人民币,相关的IT业收入为71.6亿人民币,相关的出版业收入为37.1亿人民币,游戏产业对相关行业的总体贡献已远超过300亿人民币”。
由于本人对游戏的兴趣,所以在本次设计中选择连连看游戏作为设计对象,以此
1
来提高游戏开发方面的经验。
2概要设计
2.1开发工具简介
本次毕业设计使用VisualC++6.0作为开发工具。
VC6采用标准的多窗口用户界面,提供了大量使用工具以及支持可视化编程的特性。
通过VC6,开发人员可以完成项目工程的创建,程序的编辑、修改、运行和调试等各种操作。
VisualC++主要包含2种开发环境,一种是使用原始的Win32API,另一种是使用MFC(MicrosoftFoundation
Class)。
MFC是微软为开发人员提供的类库,在某种意义上是对Win32API的封装。
本设计使用MFC开发环境,MFC可分文单文档模式,多文档模式以及对话框模式,
[1][10]本设计采用对话框模式搭建游戏的整个框架。
2.2总体设计思想
完美的游戏应该能很好的表现出游戏的内容,并能够很好的与玩家进行交互。
这两方面是游戏设计首先要解决的,如何很好的解决这两方面是判断游戏成功与否的重要标志。
本次设计采用面向对象的思想,拟用VisualC++实现一个简单的连连看游戏。
该游戏的设计思想:
要求开始运行游戏时能自动进行初始化工作,将整个游戏区域分成纵向和横向扩展的若干个小方块,并且这些小方块是由多种动物图案成对分布于游戏区域的不同位置,玩家可以通过选取相同的两个物件来对方块进行消除的操作,直到将游戏区域中的所有方块对都消除后为胜利。
2.3框架设计
该游戏程序框架设计主要包括基本数据结构设计,图案方块的连接判断,鼠标事件处理功能,绘图功能,游戏胜利的判断等模块的设计。
(1)基本的数据结构模块:
该模块主要负责整个游戏区域地图数据的实现,包括游戏地图数据的设计和数据的初始化工作。
(2)图案方块的连接判断模块:
该模块负责游戏规则的实现即两个方块销毁条
2
件的实现,对游戏中方块连接的各种方式做了详细的分析,是本游戏的主要设计部分。
(3)鼠标事件处理功能的设计模块:
该模块负责用户交互的实现,本游戏选择鼠标事件处理方式。
(4)绘图功能的设计模块:
该模块包括位图图像的准备、绘图方案的设计、绘图资源的载入与初始化、游戏区域的绘制四个部分。
(5)游戏胜利的判断:
该模块负责游戏胜利的判断。
3详细设计
3.1基本数据结构模块设计
3.1.1设计思路
对于整个游戏区域,可以把它看作一个是由若干个小方块构成的地图,而且每一个小方块放置着不同的动物图案,可将其称之为图案小方块。
这些图案小方块零散地分布在地图的不同位置区域,并且每一个图案小方块都有与其对应的完全一样的另外一个小方块,如图3-1所示。
1412
2
3
43
图3-1地图布局
整个游戏区域被抽象成一个有坐标位置的属性的平面,平面上零散地分布着若干个小方块,并且这些小方块的物种起码是成对出现的,可以把游戏区域地图用一个数组m_map来表示,每一个小方块代表数组里面的成员变量。
在已分配好的空间中放上适当的图案方块物件,对数据进行初始化。
即需要对地
3
图空间内的数据进行成对性随机布局,因此可以将该功能的实现封装在StarNewGame()函数里面[4][5][6]。
3.1.2代码设计
数据结构模块主要代码如下所示:
voidC_LLK_Dlg:
:
StartNewGame()
{
//初始化地图,将地图中所有方块区域位置置为空方块状态
for(intiNum=0;iNum<(m_nCol*m_nRow);iNum++)
{
m_map[iNum]=BLANK_STATE;
}
//布下随机种子
srand(time(NULL));
//生成随机地图
//将所有匹配成对的动物物种放进一个临时的地图中
CDWordArraytmpMap;
for(inti=0;i<(m_nCol*m_nRow)/4;i++)
for(intj=0;j<4;j++)
tmpMap.Add(i);
//每次从上面的临时地图中取走(获取后并在临时地图删除)
//一个动物放到地图的空方块上
for(inti=0;i { //随机挑选一个位置 intnIndex=(int(rand()*0.1+rand()*0.01+rand()))%tmpMap.GetSize(); //获取该选定物件放到地图的空方块 m_map[i]=tmpMap.GetAt(nIndex); 4 //在临时地图除去该动物 tmpMap.RemoveAt(nIndex); } //更新显示 Invalidate(TRUE); } 3.2图案方块的连接判断模块设计 3.2.1设计思路 对于选中的两个方块的销毁,必须符合以下三个条件。 (1)选中的两个方块图案相同。 (2)选中的两个方块之间在没有障碍的情况下,可以用若干垂直的直线线段连接起来。 (3)这些将两个相同方块连接起来的直线线段的折点不超过两个。 [7]同种物件的连接方式大致可以分成以下三种: (1)直连方式 该方式要求所选定的两个方块在同一水平直线上,并且两个方块之间没有任何其他图案方块。 直连方式如图3-2所示: 图3-2直连方式 (2)有一个折点的垂直线段连接方式 有一个折点的垂直线段连接方式如图3-3所示。 所选定的两个方块如果通过折点的方式连接,那么对于折点来说,每个折点必定有且只有一个坐标是和其中一个目标 5 的点是相同的,即折点必定在两个目标点所在的x方向或y方向的直线上。 对于一个折点连接的情况,折点应该为第一个选中方块的横向线或纵向线与第二个选中方块的纵向线或横向线相交而得。 在这些所有可能连接的交线经过的每一个图案方块区域,都不允许被障碍物所阻挡。 折点 图3-3一个折点的连接方式 (3)有两个折点的垂直线段连接方式 有两个折点的垂直线段连接方式如图3-4所示。 这种方式的两个折点所连成的直线与两物件的直接连接可以构成平行线,因此可以根据这个规律,将这条水平线在游戏区域允许的条件上下移动,然后通过判断整条带垂直折点的曲线之间有无的障碍物方式来确定是否可以连通。 图3-4两个折点的连接方式 3.2.2流程设计 根据上面分析,针对选定方块是否可以作抵消操作,设计出连接判断流程图如图3-5所示。 6 开始 直连方式成功判断 是 成功 否 一个折点连接方式成功判断 是 成功 否 两个折点连接方式成功判断 结束 图3-5连接判断流程图 3.2.3代码设计 (1)判断选中的两个方块是否可以消除的代码设计根据上面的流程设计,判断两个方块消除的代码如下所示: BOOLC_LLK_Dlg: : IsLink(intx1,inty1,intx2,inty2) { //X直连方式 if(x1==x2){ if(X1_Link_X2(x1,y1,y2)) returnTRUE; } 7 //Y直连方式 elseif(y1==y2){ if(Y1_Link_Y2(x1,x2,y1)) returnTRUE; } //一个转弯直角的联通方式 if(OneCornerLink(x1,y1,x2,y2)){ returnTRUE; } //两个转弯直角的联通方式 elseif(TwoCornerLink(x1,y1,x2,y2)){ returnTRUE; } returnFALSE; } 上面的实现中,先是对直连方式中的X方向直连Y1_Link_Y2()以及Y方向直连X1_Link_X2()这两种情况作判断,如果尚未取得结果,再通过调用OneCornerLink() 函数对一个折点的情况进行判断,如果还是没取得结果的时候,调用TwoConerLink()函数对两个折点的情况进行判断,然后得出结果。 (2)直连方式的代码设计 下面主要介绍其中一个子功能模块直连X1_Link_X2()的实现。 直连方式可分成直通、左通和右通三种情况: a)直通: 在选定的两个方块的直连线中没有被任何方块所阻碍。 如图3-6所示。 图3-6直通 8 b)左通(右通): 选定的两个方块的直连线之间有其他地方阻碍,但是通过其左(右)侧可以无障碍的连通,如果两侧都无障碍,便将其默认为左通。 如图3-7所示。 左通右通 左通 图3-7左通(右通) 直连X1_Link_X2()函数具体实现,代码如下: //X直接连通 BOOLC_LLK_Dlg: : X1_Link_X2(intx,inty1,inty2) { //保证y1的值小于y2 if(y1>y2) {//数据交换 intn=y1; y1=y2;y2=n; } 9 //直通 for(inti=y1+1;i<=y2;i++) { if(i==y2) returnTRUE; if(m_map[i*m_nCol+x]! =BLANK_STATE)break; } //左通 if(XThrough(x-1,y1,FALSE)&&XThrough(x-1,y2,FALSE)) returnTRUE; //右通 if(XThrough(x+1,y1,TRUE)&&XThrough(x+1,y2,TRUE)) returnTRUE; returnFALSE; } 3.3鼠标事件处理功能模块的设计 3.3.1设计思路 该游戏选择鼠标事件处理方式实现用户交互功能。 鼠标选取两个图案方块后,程序将自动判断所选定的两个方块是否能进行抵消操作,能则进行抵消操作。 3.3.2流程设计 鼠标事件的处理工作归纳为如图3-8所示的流程。 10 开始 鼠标点击位置的确定 否 是否点击在图案上 是否已选定一个方块否 选定第一个方块是 选定第二个方块 否 是否可以抵消方块 是 抵消方块 清除选定方块的记录 结束 图3-8鼠标事件处理功能流程图 根据图3-8所示流程,整个功能模块的具体协调与实现过程可简单描述如下: (1)鼠标点击位置的确定: 利用鼠标的当前坐标位置point对每个小单元方块的宽度FRONTWIDTH和高度FRONTHEIGHT分别取模,获取当前鼠标落点所在的游戏区域的具体行列数(x,y)。 (2)是否点击再图案上: 即判断出该行列数(x,y)是否符合条件。 保证运算出来的行数x和列数y在预定义区域最大的行数和列数内,并且点击的区域状态不是空白方块区域的具体行列数。 (3)是否已选定一个方块: 对于判断此次鼠标事件的选取是否与第一个方块选取一样,只需通过用于记录第一个被选中的方块的行列数成员变量是否为有效即可。 (4)选定第一个方块: 对于本次选中的方块为第一个选中的情况,先用m_nX1 11 和m_nY1对当前的选中方块位置作记录,然后直接在屏幕的该区域绘制图像,为该方块区域添加一个红色的矩形外边框,用于提示用户当前的第一个图案方块选中的位置。 (5)选定第二个方块: 在这一处理中,对该选定方块作一些判断,以便更高效地处理。 判断选中的方块与前一个方块是否为同一图案方块,并且此次选择不与上一次选定的方块为同一方块,然后才跳到下一步对两个选定的方块是否可以抵消的流程中去。 (6)是否可以抵消方块: 调用前面已经实现的大功能函数IsLink()来判断当前所选定的两个图案方块是否可以抵消。 (7)抵消方块: 如果可以抵消,对选中的两个方块在内部核心地图对应的数据状态做适当的修改,将他们的状态记作已经被销毁的空方块状态BLANK_STATE。 (8)清除方块记录: 完成第2个图案的选取与相关的功能操作后,需要对前面已经选取第1个方块位置的记录作清理工作,以便下一个新方块组的选择。 (9)结束: 判断此次的鼠标操作是否已经胜利结束,如果是则给予用户提示,然后重新开始新的一关。 3.3.4代码设计 实现这一流程的主要代码部分如下: //鼠标左键消息处理 // voidC_LLK_Dlg: : OnLButtonDown(UINTnFlags,CPointpoint){ //.计算鼠标点击方块的的位置 intx=point.x/FRONTWIDTH+(point.x%FRONTWIDTH? 1: 0)-1; inty=point.y/FRONTHEIGHT+(point.y%FRONTHEIGHT? 1: 0)-1; //在游戏区域内并且该区域还有该区域不是空的区域 if(x =BLANK_STATE) { 12 //假设尚未记录第一个方块 if(m_nX1==BLANK_STATE) { //记录第一个方块的位置 m_nX1=x; m_nY1=y; //获取程序框架的设备环境 CDC*pWinDC=GetDC(); //临时绘制点中的方块外框 //只绘屏幕不载入内存位图 CPenmyPen; CPen*pOldPen; myPen.CreatePen(PS_SOLID,4,RGB(255,0,0)); pOldPen=pWinDC->SelectObject(&myPen); //方块外框绘制,线条环绕绘制框架 pWinDC->MoveTo(x*FRONTWIDTH,y*FRONTHEIGHT); pWinDC->LineTo(x*FRONTW
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于Visual C+的连连看游戏的设计与实现 基于 Visual C+ 连连 游戏 设计 实现