【《基于Visual C++的游戏设计实现研究》16000字(论文)】_第1页
【《基于Visual C++的游戏设计实现研究》16000字(论文)】_第2页
【《基于Visual C++的游戏设计实现研究》16000字(论文)】_第3页
【《基于Visual C++的游戏设计实现研究》16000字(论文)】_第4页
【《基于Visual C++的游戏设计实现研究》16000字(论文)】_第5页
已阅读5页,还剩28页未读, 继续免费阅读

下载本文档

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

文档简介

绪论1.1研究现状连连看这个小游戏,其来源于街机游戏《中国龙》和《麻将》,是给一些图案中的相同图案进行匹配并使之消除的休闲游戏,约在2003年,一个叫朱俊的网友将这种游戏形式搬到了PC上,立刻成为办公人员的新宠,并迅速传遍世界。自从流入大陆以来风靡一时,也吸引着众多的程序员开发出各种版本的“连连看”。这其中,顾方编写的“阿达连连看”以制作精良而广受好评,也成为了顾方“阿达系列软件”的核心产品。并在2004年,取得了国家版权局的计算机软件著作权登记证书[1]。饱受工作压力的人们并没有过多的时间进行复杂的游戏,于是对于这种点击鼠标就能过关的游戏情有独钟。之后村子的连连看风靡版,阿达的连连看奥运版,连连看反恐版,还有敏敏连连看,水晶连连看等遍地开花,造就了一个连连看的大家庭。随着Flash的流行,网上出现了多种Flash版的“连连看”。如“宝石连连看”、“水果连连看”等,流行的“宝石连连看”以及“开心消消乐”以华丽界面吸引了一大批忠实玩家。在世界范围内来看掌机和家用游戏机才是单机游戏的主阵地,如任天堂的3DS掌机,索尼的PlayStation4以及微软的Xboxone家用游戏机等。但单机游戏在中国的发展并不顺利。据报告,全球游戏玩家在2016年创造了996亿美元的收入,其中单机游戏收入占73%[2]。由此可见游戏产业尤其是单机游戏产业在全球范围内来看是一个具有强大旺盛生命力的产业。2016年中国游戏产业规模实现165.7亿元人民币,但其中单机游戏收入仅占0.4%。当前发展比较好的小游戏平台——狗仔游戏盒子,里面提供的单机小游戏都非常受欢迎,里面包括黄金矿工、金牌炮弹射手等等。但是大部分的单机小游戏质量参差不齐,都存在各自的缺点[3]。在国外,玩家玩游戏的首选是单机游戏,大型单机游戏的开发周期普遍较长,开发规摸巨大,但是中小型作品经常受到大众的喜爱,比如风靡全球的《植物大战僵尸》和《超级马里奥》,这两个单机游戏已经非常成熟,也火到了国内[4]。这些单机游戏不仅仅发行在常见的PC平台,也涵盖其他许多不同的平台[5]。如今,连连看已在各种平台占据了不小的地位。Windows系统下,Linux系统下,各种系统下都有连连看可玩。而且不管走到哪个页游网站,连连看总是排在受玩家欢迎游戏排名的前列,益智、趣味、休闲是连连看百玩不厌的精华,且不分男女老幼、工薪白领,是一款适合所有人的经典休闲小游戏[6][7]。1.2主要研究的目的及内容这个设计的主要目的是设计一款Windows平台下的简洁,富有娱乐性的连连看小游戏,让人们在工作学习之余得到休闲放松。这款小游戏是仅使用一台计算机就可以独立运行的电子游戏。区别于现在大型的单机或者网络游戏(以下简称为大型游戏),这款小游戏制作的目的是满足人们休闲的需要,在紧张工作之余让人们的精神得以休闲放松[8]。这款休闲类的小游戏玩法简单,不像网络游戏一样需要注册帐号,长时间的下载等繁琐,也不必保持实时在线,在没有网络的时候也可以使用。也不会像大型游戏费时费力,将人们的精力牢牢地套在里面,对于空闲时间越来越碎片化的我们,这款游戏不但能够给人带来最大程度的放松,还不会像大型游戏一样使我们越玩越疲劳,而且这款小游戏还不会占用计算机过多的资源。可谓工作娱乐两不误[9]。此外也想借由本次毕业设计,掌握如何制作一个游戏软件,以及制作游戏软件的简单流程,制作游戏软件的大体步骤,同时将大学几年所学的专业知识和其他知识融会贯通,学以致用,为以后的就业打基础。1.3设计思路连连看游戏的主要问题是鼠标两次点击的图片能否消去的问题。当然,前提是点击两张相同的图片,若选中的是同一个图片或者两张不同的图片,则不处理。如果在两张相同的图片所能连通的所有路径中能存在至少并可多于一条拐点不多于两个的路径,就可消去;如果没有,则不处理。此课题内容以及目标如下:(1)有难度选择,根据时间进度条的自减量以及消去成对块后时间进度条的回复量来设置难度。(2)点击重新开始后可随机生成游戏界面。(3)方块选中后图片要有明显标示。(4)选择两个图案相同的方块,如有不超过两个拐点的连线将它们连接起来,便可消除这对图块,每局内,玩家需在规定时间内消除所有成对图块,当全部成对图块都消除后,即判定通关。(5)当出现无解的局面时,可按下重新排列按钮。(6)游戏自动统计玩家获得的分数通过对以上功能的逐步实现,使游戏界面美观,操作简单,并尽力增加游戏的娱乐性,趣味性,以勾起玩家的兴趣。

2相关技术简介2.1C++语言目前有些语言,以牺牲灵活性的代价来提高效率。可是这些灵活性正是C/C++程序员所需要的。这些解决方案对编程人员的限制过多(如屏蔽一些底层代码控制的机制),其所提供的功能难以令人满意。这些语言无法方便地同早先的系统交互,也无法很好地和当前的网络编程相结合。对于C/C++用户来说,最理想的解决方案无疑是在快速开发的同时又可以调用底层平台的所有功能。他们想要一种和最新的网络标准保持同步并且能和已有的应用程序良好整合的环境。另外,一些C/C++开发人员还需要在必要的时候进行一些底层的编程。效率与安全性:新兴的网络经济迫使商务企业必须更加迅速的应对竞争的威胁。开发者必须不断缩短开发周期,不断推出应用程序的新版本,而不仅仅是开发一个“标志性”的版本。C++在设计时就考虑了这些问题。它使开发者用更少的代码做更多的事,同时也不易出错。支持现有的网络编程新标准,新的应用程序开发模型意味着越来越多地解决方案依赖于新出现的网络标准,例如HTML,XML,SOAP等。现存的开发工具往往都是早于Internet出现的,或者是在我们所熟知的网络还处于孕育期时出现的。所以,它们一般无法很好地支持最新的网络技术。更新软件组件是一项很容易出错的工作,因为代码的修改可能无意间改变原有程序的语义。为协助开发者进行这项工作,C#为版本的更新提供内在的支持。例如,方法重载必须显式声明。这样可以防止编码错误,保证版本更新的灵活性。还有一个相关的特性就是对接口和接口继承的内在支持。这些特性使得C#可以开发复杂的框架并且随着时间不断发展更新它。总体来说,这些特性使得开发程序项目的后续版本的过程更加健壮,从而减少后续版本的开发成本[10]。扩展交互性:作为一种自动管理的,类型安全的环境,C++适合于大多数企业应用程序。但实际的经验表明有些应用程序仍然需要一些底层的代码,要么是因为基于性能的考虑,要么是因为要与现有的应用程序接口兼容。这些情况可能会迫使开发者使用C++,即使他们本身宁愿使用更高效的开发环境。C++采用以下对策来解决这一问题:(1)内置对组建对象模型(COM)和基于Windows?的API的支持;(2)允许有限制地使用纯指针(NativePointer)。在C++中,每个对象都自动生成为一个COM对象。开发者不再需要显式的实现IUnknown和其他COM接口.这些功能都是内置的.类似的,C#可以调用现有的COM对象,无论它是由什么语言编写的。无论是支持COM还是纯API的调用,都是为了使开发者在C#环境中直接拥有必要的强大功能。结论:C++是一种现代的面向对象语言。它使程序员快速便捷地创建基于Microsoft.NET平台的解决方案。这种框架使C#组件可以方便地转化为XML网络服务,从而使任何平台的应用程序都可以通过Internet调用它。C++增强了开发者的效率,同时也致力于消除编程中可能导致严重结果的错误。C#使C/C++程序员可以快速进行网络开发,同时也保持了开发者所需要的强大性和灵活性。2.2MicrosoftVisualVisualStudio是由微软公司发型的开发编程运行环境,是当前市面上最盛行的Windows平台应用程序开发的环境。VisualStudio2010版本在2010年4月12日上市,它重新设计和组织其集成以及开发环境(IDE)的界面,让他变得比以前更加简单明了。VisualStudio2010同时带来了MicrosoftVisualStudio2010CTP(CommunityTechnologyPreview--CTP)、NETFramework4.0,并支持开发面向Windows7的应用的程序。除了MicrosoftSQLServer,它还能够支持IBMDB2和Oracle数据库。而且,VisualStudio能够更深层次的支持SQLServer。SQLServerYukon也将数据库引擎整合了公共语言运行时(CLR)的功能,并且将数据库和工具的结合提高到新水平[11]。3需求分析连连看游戏所占内存比较小,对计算机存储容量没有过分特殊要求,可以在任意一款计算机上运行。此外,对其他软件几乎没有过分特殊要求,程序健壮性较好。连连看游戏的基本规则为,用户每消去一对棋子,游戏限制时间会自动增加。当时间全部消耗完时,游戏以失败结束。在有限时间内,消除全部游戏区域内的棋子,则可以进入下一关较大难度的游戏,重现开始新等级的游戏[12]。每升级一个等级,游戏的时间消耗就会变得更快。游戏当中还可以利用快捷键来进行变化棋盘(三次机会)和提示功能[13]。变化棋盘即对于未消除的棋子进行重新排列,提示即对可以消除的方块进行提示。此款连连看游戏要实现:(1)连连看的总体地图设计:即将整个游戏区域看成是一个由若干个空方块构成的地图,在每一个空方块内中都填充有不同的图案,可以将填充有不同的图案的空方块称之为小图块。这些不同的小图块按一定的规则分布在整个游戏区域内的不同位置,且每个小图块都必须有与其相对应的完全一样的另外一个小图块。(2)图案方块的连接判断:若选中的两个小图块图案相同,且在同一条直线上,它们之间也没有其他的障碍物,则可以用直线进行直接消除;若没在同一条直线上,但是中间没有其他障碍物,可以利用折线进行消除;如果不是以上两种情况,则返回开始,直到出现以上两种情况再进行连线消除。(3)鼠标交互功能的实现:用户在用鼠标选择了两次图案后,程序要自己判断是否是可以消除的情况,若果符合可以消除的情况,则进行图块的消除,反之则不进行消除,在重复上述的选择与操作。(4)游戏胜利的判断:对于整个游戏区域进行扫描判断,若发现游戏区域有两个及以上的图块没有消除,则游戏没有胜利,若检测到整个游戏区域的图块都被消除完毕,则游戏胜利。(5)英雄榜的显示及更新:当用户的当前等级超过记录文件中的等级时,就弹出英雄榜对话框。要求用户输入姓名,并记录在记录文件中。(6)游戏的帮助功能:在游戏界面中需要提供游戏使用说明等帮助提示,以方便对此连连看游戏不了解的用户对游戏进行操作和使用。而系统功能的主要实现为:游戏界面初始化及图块随机生成、判断鼠标前后点击的图块能否消除、难度及声音选择、计时与得分。(1)界面初始化及图块随机生成模块:按固定数目随机生成成对的图块等;(2)判断鼠标前后点击的图片能否消除模块:判断前后所选择的图片的连接方式,并依据在不同连接方式下对于路径间是否有障碍图片的判断来确定前后点击的两个图片能否消除;(3)难度及声音选择模块:依据选择的不同难度对游戏时间进行调整。以及依据选择的不同声音调用不同的音频文件;(4)计时与得分模块:依据所选难度对时间自减量进行调整,以及记录所消去图片后获得的分数。4系统设计连连看游戏不单单要功能完备,且要界面友好,因此,对于一个成功的连连看游戏设计项目,功能模块的设计是关键。4.1概要设计在系统需求分析阶段,分析清连连看游戏要“做什么”,大体形成了目标系统的逻辑模型。然后我们所要做的是把连连看游戏“做什么”的逻辑模型变换为“怎么做”的物理模型,即开始实现系统需求。而要开始实现系统需求,我们需要先描述系统的总的体系结构。在系统功能分析的基础上,做系统功能模块图如图4-1所示的系统体系结构图:图4-1系统体系结构图连连看游戏系统功能模块有以下几个:首先是界面初始化,再接着是随机生成图片,然后是判断图片是否消除,即图片消除判断,再是连线消除加分和胜利条件判断。对于用户玩家来说则有如下几个功能:开始游戏、暂停游戏、重新排列、游戏设置以及其他相关[14]。1)界面初始化:用户在开始游戏后,游戏的整个界面开始进行准备工作,即开始初始化,整个游戏的页面会出现游戏难度的选择、游戏背景音乐的选择、游戏关卡的选择、游戏帮助的选择。主要负责显示游戏界面、等级、时间显示以及游戏帮助等内容。其主要有如下几个处理模块:主菜单处理模块、连接提示处理模块、换盘处理模块、初始化棋盘数据处理模块、游戏信息处理模块。(1)主菜单处理模块:主菜单处理模块比较简单,只需要创建一个菜单对象。并在对话框初始化函数中进行加载相应资源并设置到对话框中即可。(2)连接提示处理模块:连接提示模块,主要调用棋子类中的查找有效连接接口函数,通过返回的两个图标相同的棋子位置来设置两个棋子的状态为按下。(3)换盘处理模块:换盘处理模块,主要是把棋盘数组中的数据重新进行随机排列。(4)初始化棋盘数据模块:初始化棋盘数据模块,利用随机数,随机地选择在棋盘数组中插入棋子数据。每一类棋子生成两组四个相同的数据。(5)游戏信息处理模块:游戏信息处理模块,主要利用设置定时器,每一秒进行更新显示区域。在这些区域中,以绘图方式进行输出。2)随机生成图片:在用户点击开始游戏按钮后,整个游戏地图会随机生成图案不同的小图片,也就是连连看的棋子,每一个棋子都有其相对应的一个,这两个棋子组成一对,只要用户两次点击相同图案的棋子,则可以将两个相同图块的棋子消除。3)图片消除判断:用户在用鼠标第一次点击棋子后,被点击的这个棋子的图案将被记录;然后用户第二次点击棋子,如果用户两次点击的棋子之间没有其他的(障碍物)棋子,即两个棋子之间是可以构成一条横着或者竖着的直线,又或者是两个棋子之间构成了一条折线,同样中间是没有障碍物的,那么,这就满足了棋子消除的条件,可以进行棋子的消除。4)连线消除加分:如果有两个棋子可以进行连线消除,那么就可以加一分,每连线消除一对棋子,就加一分,直到所有棋子消除完毕,则停止加分。5)胜利条件判断:如果整个游戏地图的棋子全部消除完毕,则游戏胜利。如果整个游戏地图的棋子大于等于一,则游戏失败。对于用户玩家来说:用户想玩游戏的时候可以点击开始游戏以进行一场新的游戏,如果中途不想继续游戏了,也可以点击暂停游戏,让游戏先暂停,休息过后可以点击继续游戏来开始游戏。用户如果对当前的棋子排列不满意,也可以点击重新排列一达到棋子换盘的目的,也可以进行游戏设置以及游戏帮助[15]。4.2系统结构设计系统概要设计里最重要的问题就是系统模块化。所谓模块化既是指:在解决复杂问题时自上向下逐层把软件系统划分成若干个模块的过程。每个模块完成一个特定功能,再将所有模块按某种方法组织起来,成为整体,完成整个系统所要求的全部功能。将系统划分为若干个模块的目的是降低软件系统的复杂程度,提高可读性、可维护性,然而模块划分不能是过于随意,需保模块独立性。既是说:每个模块只完成要求的独立功能,并与其他模块联系最少,且接口简单。即尽量做到低耦合高内聚,提高模块独立性,为设计好的软件结构奠定基础。系统在概要设计中一般采用结构化设计。其以需求分析阶段生成的数据流图为基础,按一定步骤进行映射,形成软件结构。首先将整个系统化分为数个子模块,在系统中,设计了游戏界面初始化及图片随机生成、判断鼠标前后点击的图片能否消除、难度及声音选择、计时与得分等模块。然后,进一步细分模块,添加细节功能与实现。本文所设计的连连看游戏主流程图如图4-2所示。图4-2主流程图首先,游戏开始时先是游戏界面初始化,页面初始化会显示主菜单、难度选择等。初始化完成之后,系统就开始进行随机地成对的分发棋子,让整个游戏区域布满棋子,这些棋子每个都可以找到与之匹配的一个,即都可以进行消除,不会落单。这一步就是游戏地图的完成。接着用户第一次用鼠标选择一个棋子,系统记录在案,用户在开始第二次棋子选择。如果连续两次所选择的棋子是一样的,而且两个棋子之间没有其他多余的障碍物,则可以进行两个相同棋子的消除。如果两次所选择的棋子图案不一样,就返回上一步,再次进行两次图片的选择。每次进行一次图片消除后就判断一次所有的棋子是否消除完毕,若所有的棋子都消除完毕了,则游戏结束,如果没有消除完毕,则继续进行棋子选择和棋子消除步骤。4.3详细设计4.3.1功能模块的算法设计在连连看游戏中,要实现游戏的各个功能,大致可以分为以下几个模块,其算法展示如下:时间限制模块如图4-3所示,消除提示模块如图4-4所示,鼠标交互功能如图4-5所示,游戏升级模块如图4-6所示:1)时间限制模块的算法设计图4-3时间限制模块(1)在游戏开始时,设置当前限制时间(nOverTime)为60秒;(2)设定一个时间定时器TIMER1,时间间隔为1000ms;(3)当每一次时间间隔到时,就把当前限制时间减少1s;(4)如果游戏中有一对棋子消除时,就把限制时间增加3;例如,当前限制时间为50秒,这时如果有棋子被消除,那么限制时间就变成53秒。(5)如果限制时间变成0s,说明游戏结束,弹出游戏结束对话框。如果当前游戏等级超过记录等级,还要弹出英雄榜对话框对话。2)消除提示模块的算法设计:图4-4消除提示模块(1)判断提示次数变量的值,如果提示次数等于0,则弹出游戏结束对话框,结束游戏并退出游戏;(2)如果提示次数的值不为0,则遍历查找当前棋盘中剩余的还没有消除的其他的相同的棋子;(3)在那些还没有消除的相同的棋子中,查找可以消除的棋子,即拥有相同图案的棋子;(4)找到图案相同的棋子后,在可以消除的棋子上给出提示连线,然后将提示次数变量减少1,直到提示次数变为0。3)消除相同棋子模块的算法设计(鼠标交互功能):图4-5鼠标交互功能(1)用户的鼠标第一次单击棋子时,保存第一次棋子的坐标及类型到“第一次选中变量”中;(2)用户的鼠标第二次单击棋子,得到鼠标第二次选中的棋子坐标及类型;(3)比较用户第一次棋子和第二次棋子的坐标及其类型,如果两次单击的棋子类型相同,则转步骤(4),如果不相同,转步骤(5);(4)在用户两次单击的棋子上画一条连接线,并消除这对棋子,退出等待下一次鼠标选择;(5)把用户鼠标第二次选中的棋子坐标及类型赋值给“第一次选中变量”。4)游戏升级模块的算法设计:图4-6游戏升级模块(1)在用户完成一局游戏后,保存当前游戏等级和限制时间初始值;(2)判断当前游戏中的棋子是否全部被消除完毕,如果当前游戏区域的棋子全部消除完毕,就把当前游戏等级增加一级,把限制时间的初始值减少“5s”;(3)如果当前游戏中的棋子没有消除完毕,则继续保存当前游戏等级和限制时间,继续当前游戏;(4)如果游戏等级增加了一级,就重新开始游戏。5)消除提示模块的算法设计:(1)判断提示次数变量的值,如果提示次数变量的值等于0,则游戏提示次数完毕,游戏结束;(2)如果提示次数变量的值大于0,则开始查找当前棋盘中图案相同的棋子;(3)找到图案相同的棋子后,在相同棋子中,查找两个棋子中间没有其他多余障碍物的,可以消除的棋子;(4)找到可以消除的棋子后,在可以消除的两个棋子上面给出提示连线,则提示次数变量减少1。6)棋子换盘模块的算法设计:(1)首先保存当前棋盘数组中的数据到临时数组中;(2)再循环地从临时数组中,随机取出数据保存到棋盘数组中。7)英雄榜模块的算法设计:(1)读取配置文件(setup.ini),得到并显示当前最高等级及姓名;(2)在用户结束游戏时,比较当前用户等级和最高等级。如果高于配置文件中的最高等级,就弹出“英雄榜”对话框,要求输入姓名,并连同用户的等级保存到配置文件中。8)音乐播放模块的算法设计:音乐播放模块比较简单,只需要在用户选择音乐播放时,把音乐资源载入程序并播放。游戏背景音乐播放,是通过调用Windows的API函数来实现的。当用户选择“游戏设置”|“播放音乐”命令时,就播放音乐。相反,如果取消,就停止播放音乐。要实现这个功能,需要如下几步:(1)在工程文件中,添加静态库文件及头文件;(2)实现CLlkDlg类中的PlayBackMusic()成员函数。9)帮助类模块的算法设计:帮助类模块的算法也比较简单,只需要把相应的对话框资源显示出来即可。连连看中的帮助是使用一个对话框来实现的,实现的步骤如下:(1)添加一个对话框资源到工程中,并填写说明文字;(2)编写一个CHelpDlg对话框类,主要是加载IDD_HELP对话框资源。通过资源中的文字说明对游戏操作方法进行描述。同时只包含单机“知道了”按钮的响应函数;(3)在CHelpDlg对话框类中,需要实现对话框类的构造函数、析构函数和“知道了”按钮响应函数。对于帮助类子模块和重列子模块,将这两种算法各封存在一个类当中,作为道具可以随时进行调用,并且有次数记录,当记录次数到达零以下,立即给出提示。对于提示模块,采用遍历的方法进行查找,首先遍历同一种图块中出现在不同坐标位置的图案小方块,以此模拟第一次点击,然后遍历同一种图块的剩余的不同坐标图案小方块的出现,以此模拟第二次点击,判断前后2次模拟点击选中的不同位置的同种图块能否连通,能连通则高亮显示这2个图块,提示完成;否则,继续检测连通情况直至找到为止。对于重列模块,首先通过遍历的方法,依次读取各个位置的图片,增加到临时的图片列表中,然后再随机的循环依次在原来有图片的地方添加图片,从图片列表中删除用过的图片,不删除就会有可能重复了,最后进行刷新即可。10)游戏道具算法设计在此游戏中的道具有重排和提示两种,在游戏进行的过程中,如果用户暂时找不到可以消除的棋子,就可以使用道具功能。重排功能是在原来棋子位置不变的情况下,重新排列棋子图案的顺序,以找到可以消除的棋子。提示功能用于提示用户一组可以消除的棋子,便于玩家可以继续进行游戏。对于重排功能的实现,首先将所有小方块的位置编号暂时保存到内存中,然后随机地分布在有小方块的位置上,通过随机函数实现此功能。对于提示功能,首先编写一个检查连接的类,判断选中的两个小方块是否可以进行消除操作,这个类可以被提示功能函数调用,也可以在检查是否有解时被调用。在提示功能中,首先调用检查连接的类查找到一个可以连接的小方块,并且标记,然后更改其为选中状态,即改变颜色以达到醒目,用来提示玩家。4.3.2游戏地图设计整个游戏地图分为信息显示区域和游戏区域。信息显示区域部分分布在整个地图的上方,右侧为关卡、重列剩余时间、分数和提示信息,通过使用标签和各种控件直接在图形界面中画出。对于游戏区域,被抽象成一个有坐标位置属性平面,平面上零散地分布着若干小方块,在绘制地图的类中添加地图数据成员变量,用于记录动态分配出来的一维数组地图空间的首地址,对于地图中的某个小方块的类型,可以用一个整型的ID来进行识别。地图的数据结构设计完毕。在游戏开始前,先要进行初始化,为了保证小方块能成对地出现,不应该仅仅对人物图案做简单地随机抽取,然后将随机选取出来的小方块放到地图中去就了事,而是需要成对的选取人物小方块,就是说地图中的小方块必须是偶数个才行。把地图设置成动态分配的方式,目的是让其空间可以根据行列数的需求动态地获取,而对于实际大小不同的地图空间即可。宏观观察整个游戏区域,可以将整个游戏区域看作一个是由若干个空方块构成的地图,然后在每个空方块内填充了不同的图案,可将其称之为小图块,也就是游戏的棋子。这些小图块按一定规则随机地分布在游戏区域内的不同位置,且每个小图块都必须有与其对应的完全一样的另外一个小图块,以保证所有的棋子都可以被消除,结束游戏。如图4-7所示。图4-7游戏地图设计图如图4-7所示,整个游戏区域抽象成一个有坐标属性的平面,平面上分布着若干小图块,且这些小图块的图片是成对出现的。经过之前的描述与分析后,可把整个游戏区域地图用一个数组表示。这个数组被设计成一个动态分配的int型二维数组,以对地图中的行列数进行表达。在成员变量中定义一个整形指针变量,用于记录动态分配出的一维数组地图空间的首地址。对于游戏区域中的某个小图块类型,可以用一个整形的ID来进行识别。这里为标识地图的行列位置分别添加行变量X和列变量Y。当地图数据结构设计完成后。就对游戏进行初始化。由于小图块需要成对出现,因此在地图初始化时,不单是对图片种类进行简单的随机取数,然后将该随机选取出来的填充图放到游戏区域中去就行,而是需要成对地对填充图进行选取,即是说地图中的小图块必须是偶数个。将地图数组设置为动态分配方式,目的是让数据空间可根据行列数需求来动态获取,若设计不同大小比例的地图则可预先定义几组关于行列数的宏来实现。在创建时,先根据宏的不同分配不同大小的地图空间,然后可以对地图数据进行相关初始化。在连连看类对象的实现中,定义了数个关于地图行列数的宏,且在连连看类对象的构造函数中,对行列进行了真实确认赋值,并根据当前行列数大小对地图数据空间进行动态开辟。由于地图数据是用new在堆栈区动态创建的,因此在销毁该对象时需将这些内存空间进行释放,在连连看类对象的析构函数中调用delete将new出的所有空间都释放掉。4.3.3棋子类的设计棋子类的设计,包含如下几个功能函数:1)游戏游戏胜负判断处理游戏胜负判断处理步骤如下:(1)等待用户的鼠标输入信息;(2)在定时器中,每次扣除游戏的限制时间一秒;(3)当游戏时间为零秒时,弹出游戏失败结束提示,并根据用户选择重新开始游戏或者结束游戏;(4)在用户消除一对棋子后,就对当前棋盘数组进行遍历。如果是空,如果是空,说明用户已经全部消除完毕。调用升级处理。如果不是空,则返回步骤(1)。2)戏升级处理游戏升级处理步骤如下:(1)当游戏中的棋子全部被消除完毕后,弹出升级提示对话框;(2)当用户选择继续游戏时,就调用主对话框类的重新开始游戏接口函数。但是要把当前游戏等级增加一级;(3)当用户选择不继续时,直接调用退出函数。3)查找处理查找处理实现步骤如下:(1)遍历整个棋盘数组;(2)查找一根直线可以连接的一对棋子,如果没有则转下一步;如果有则转步骤(6);(3)查找一个有拐角,即两根直线可以连接的一对棋子。如果没有则转下一步,如果有则转步骤(6);(4)查找有两个拐角的,即三根直线可以连接的一对棋子。如果没有则转下一步,如果有则转步骤(6);(5)如果返回假,表示查找失败;(6)如果返回真,表示查找成功,并把棋子的位置在输出参数中返回。4)提示处理提示处理是通过调用查找函数,把其中可以连接的一对棋子的位置通过输入参数返回给上层调用者。由调用者设置相关棋子为选中状态。棋子类的实现,分为以下几步1)首先声明棋子类CChessMan,其中包含两个构造函数、查找接口函数、判断棋子为空函数及鼠标左键响应函数。2)添加棋子类的实现,其中包含基本的构造函数、析构函数、鼠标左键响应函数等。3)实现棋子类的查找接口、棋盘判空功能函数。要注意,其中查找函数有两种:一种是输入两个棋子坐标查找有无连接线;另一种是在前一种基础上,如果棋子间有连接就要把棋子的拐角位置输出。4)实现棋子类的配对接口函数分为两种:一种是判断当前棋盘上有无配对棋子;另一种是在前一种的基础上添加输出配对棋子坐标的功能。5)实现各种不同的查找函数。包含查找一根直线连接函数、查找一个拐角连接函数和查找两个拐角连接函数。4.3.4棋子的连接判断对于选中的两个方块的处理,必须符合如下3个条件:1)选中的两个小图块的填充图案一致。2)选中的两个小图块之间在没有障碍物阻碍的情况下,可用若干个平行于x轴或y轴且相互垂直的直线线段连接起来。3)将它们连接起来的这些直线线段的拐点不超过两个(连接线由x轴和y轴的平行线组成)。现在针对条件2)和条件3)进行分析,如图4-8所示。依图4-8所示可知,同种图块的连接方式大致可以分成以下3种:1)直接方式。2)有一个折点的垂直线段连接。3)有两个折点的垂直线段连接.。(1)直接连接方式在直接连接方式中,必须要求所选定的两个方块在同一水平直线上(可以为x方向或y方向),并且两个方块之间没有任何其他图案方块。(2)单个拐点连接方式所选定的两个方块如果通过折点的方式连接,那么对于折点来说,每个折点必定有且至少有一个坐标(x或y)是和其中一个目标点相同的,即折点必定在两个目标点所在的x方向或y方向的直线上。此外,对于一个折点连接的情况,折点应该为第一个选中方块的横向线或纵向线与第二个选中方块的纵向线和横向线相交而得出。(3)两个折点的连接方式这种方式的两个折点所连成的直线与两物件的直接连线可以构成平行线,因此可以根据这个规律,将这条水平线在游戏区域允许的条件上下移动,然后通过判断整条带垂直折线点的曲线之间有无障碍物方式来确定是否可以连同。这种情况可以分为两种情况:首先,选中的两图案方块在同一直线,两折点间的直连线可在其这两个方块之间的空间位置作移动,其约束是不超过游戏边界区域。其次,选中的两图案方块不在同一直线,两折点间的直连线可在两个方块之间的空间位置作移动,其约束是两方块之间的区域。经过上面详细的分析后,可以对选定的两方块是否可以作抵消操作可以这样设计下去。首先,对简单的直接连情况进行判断,看其是否符合条件,假如不能,再加深一个级别的复杂度,对一个折点的情况进行判断,依次类推,如下图4-8所示。图4-8连线规则图连线流程图如图4-9所示。图4-9连线流程图(1)首先判断直连方式是否成功:在直接连接方式中,如果所选定的两个方块在同一水平直线上(可以为x方向或y方向),并且两个方块之间没有任何其他图案方块,则直连方式判断为成功。直连方式判断成功后就可以进行棋子的消除了。(2)如果直连方式判断为失败,则开始判断单个拐点方式是否成功:如果所选定的两个方块通过折点的方式连接,那么对于折点来说,如果每个折点有且至少有一个坐标(x或y)是和其中一个目标点相同的,即折点必定在两个目标点所在的x方向或y方向的直线上。此外,对于一个折点连接的情况,折点应该为第一个选中方块的横向线或纵向线与第二个选中方块的纵向线和横向线相交而得出。那么,单个拐点方式判断为成功。判断成功后,则进行棋子的消除。(3)如果单个拐点方式判断为失败,则开始判断两个拐点方式是否成功:如果选中的两图案方块在同一直线,两折点间的直连线可在其这两个棋子之间的空间位置作移动,也没有超过游戏边界区域。那么判断为成功;如果选中的两棋子不在同一直线,两折点间的直连线可在两个方块之间的空间位置作移动,且约束在两方块之间的区域,那么也判断为成功。判断两个拐点方式为成功后,则进行棋子的消除,如果判断为失败,则不进行消除。这里把直接连接方式分为直通,左通,右通3种情况,如4-10图所示。图4-10连接方式图下面简单介绍直通、左通和右通三种情况(右通与左通类似)(1)直通:直通就是在选定的两个图块连线中,没有任何其他图块进行阻碍。(2)左通:左通就是选定的两个图块的连线间有其他图块进行阻碍,但通过其左侧可以将它们无阻连通。直连中的此种情况跟之前分析的两个折点连接方式中的其中一点类似,如4-11图所示。图4-11两折通道图(3)右通:右通就是选定的两个图块的连线间有其他图块进行阻碍,但通过其右侧可以将它们无阻连通。直连中的此种情况跟之前分析的两个折点连接方式中的其中一点类似。以上两种左通之间的区别是,直连左通的连接线直接在其相邻位置连通,从而不构成垂直折点偏移的效果,而双个折点偏移方式中的其中一个类似的情况是,线的连通至少要偏移一个方块的距离来形成连通。同理,有上通和下通,其情况类似于左通和右通。通过行判断是否通(并返回能通过的行)(1)上通:上通就是选定的两个图块的连线间有其他图块进行阻碍,但通过其上面可以将它们无阻连通。(2)下通:下通就是选定的两个图块的连线间有其他图块进行阻碍,但通过其下面可以将它们无阻连通。4.3.5鼠标交互功能的实现(1)首先,利用鼠标的当前坐标位置point对每个小单元方块的宽度和高度分别取模,获取当前鼠标落点所在游戏区域的具体行列数;(2)判断出该行列数是否符合条件。保证运算出来的行数和列数在预定义区域最大行数和列数内,并且点击的区域状态不是空白方块区域。(3)对于判断此次鼠标事件的选取是否与第一个方块的选取-样,只需通过用于记录第一个被选中的方块的行列数的成员变量是否有效即可。(4)对于本次选中的方块为第一个选中的情况,先对选中的方块添加一个红色的矩形外边框,用以提示用户当前的第一个方块选中所在的位置。(5)对该选定方块作一些判断,以便更高效地处理。判断选中的方块与前一方块是否为同一个方块,并且不与上一次选定的方块为同一方块,然后才跳到下一步对两个选定的方块是否可以抵消的流程中去。(6)调用前面已经实现的大功能函数isLink来判断所选两个图案是否可以相互抵消。(7)如果可以抵消,对选中的两个方块在内部核心地图对应的数据状态作适当的修改,将它们的状态记作已经被销毁的空方块状态。(8)完成第二个图案的选取工作与相关的功能操作后,需要对前面已经选取的第一个方块位置的记录做清理_工作,以便下一个新方块组的选择。(9)最后,判断此次的鼠标操作是否已经胜利结束,如果是则给予用户提示,然后重新开始新的一关。对于游戏与用户交互的实现,选择了鼠标交互方式。下面简单描述鼠标交互方式的功能实现。鼠标选择两个图块后,程序将自动判断所选图块是否能进行消除操作,若能则进行消除,反之则不消除。在整个游戏过程中,不断重复上面描述的判定与操作,直到全部消去后游戏胜利结束或在规定时间前未消除完毕游戏失败结束。下面将鼠标事件处理工作归纳为如图4-12所示的流程。图4-12鼠标交互流程图依据预先设计的鼠标交互处理流程,上面已经将其转换成实现流程图。下面则按照流程的子功能模块分配方式,对整个功能模块的实现过程进行简单描述。(1)利用鼠标的当前位置坐标对每个小图块的宽度和高度取模,获取当前鼠标落点位于游戏区域的具体行列坐标(x,y)。(2)判断该行列数是否满足最大条件。保证通过计算得出的行列坐标(x,y)在预定区域的最大行列数内,且点击的区域状态不是已消除的空白图块。(3)对判断本次鼠标选取的是否与第一个图块的选取一样,只要判定记录第一个被选中的图块的行列数的成员变量是否为有效即可。(4)若本次选中的图块为第一选中的情况,先对当前选中的图块记录坐标,然后直接在屏幕的该坐标绘制线框,在该图块区域外一周添加一个红色的矩形外边框,以提示玩家当前选中的第1个图块所在的位置。(5)在这一处理中,对选定图块作一些判断,便以更高效地处理。判断选中的图块与前一图块是否为同一图块,并且只有在此次选择不与上次选定的图块为同一图块时,才跳到下一步对两个选定的图块是否可以消除的判定流程中去。(6)最后,判断此关所有鼠标操作是否已全部结束,如果是则给予用户顺利通关或不幸失败提示,然后等待玩家重新开始新一关的指令。对于鼠标交互功能的实现,可通过对鼠标左键被按下时触发的命令消息进行拦截,并对该消息的处理函数OnLButtonDown()进行重写。4.3.6游戏胜利的判断在游戏程序中,游戏结束的判断往往是非常重要的,它表示着进行一次游戏的最终结果。对于本连连看游戏程序对游戏结束的判断,自然是先检查游戏区域中的小方块是否都消除,由于某个位置是否由小方块采用不同的数值进行记录,所以只需判断各个小方块位置的状态就可以了。其次,由于本游戏程序的设计是按照连贯性进行设计的,倘若在游戏时当地图中的棋子都被消除时,应自动进行下一级,这里可以通过if和else进行判断,还有一种情况就是当游戏没有进行完的情况,当时间都消耗尽或者已无生命点数时出现死局时,即游戏地图中没有一组可以消除的棋子,则游戏依然结束弹出游戏结束对话框,而且都应给予提示游戏结束的原因,在计数器中添加相应的数值进行跟踪,当计数器的值为0时,在游戏结束函数中采用触发模式对游戏进行终止。图4-13判断游戏胜利如图4-13所示,要判断游戏的胜利,实现起来较为简单,只需对地图中的所有区域的状态进行检测即可判定。如果检测到地图中至少有两个棋子还没有被消除,则证明游戏没有胜利。继续检查所有游戏区域,知道检测出游戏区域内的所有棋子都被消除了,这才说明游戏胜利,即游戏结束。还有另一种情况,即整个游戏区域内的棋子还没有消除完毕,但是游戏时间到了,那么,也同样弹出游戏结束对话框。(1)等待用户的鼠标输入信息;(2)在定时器中,每次扣除游戏的限制时间一秒;(3)当游戏时间为零秒时,弹出游戏失败结束提示,并根据用户选择重新开始游戏或者结束游戏(4)在用户消除一对棋子后,就对当前棋盘数组进行遍历。如果是空,如果是空,说明用户已经全部消除完毕。调用升级处理。如果不是空,则返回步骤(1)。(5)当整个游戏区域内所有的棋子都被消除后,则游戏胜利。5系统调试与测试5.1程序调试在程序设计过程中,存在一些错误是必然的。对于程序语句的语法错误,在程序编译时编译器会自动提示,并请求立即更正,因此,这类错误很容易被发现和更正。但另一类错误是在程序运行时由于不正确的操作或逻辑错误导致的无法得到正常的结果。这类错误隐蔽性极强,有时会出现,有时又不出现,因此,对这此类动态错误的排查是非常耗时费力的。5.2程序的测试测试的主要内容(1)主菜单和界面显示功能的测试图5-1主菜单和界面显示功能测试这个测试用例主要是测试游戏的菜单和界面显示是否成功。其测试步骤如下:第一步,运行连连看程序,启动调试;第二步,程序启动后,其菜单即主界面显示如图5-1所示。判断结果:连连看游戏的菜单和界面显示成功。(2)游戏地图的测试:图5-2地图测试游戏地图的测试则是要在整个游戏区域内看到一个由若干个空方块构成的地图,如图5-1所示,而且每一个空方块内都含有不同图案的棋子,这些拥有不同图案的方块即棋子是按照一定的规则分布在整个游戏区域内的不同位置的,而且每一个小图块都有着与其相对应的完全一样的小图块。图案方块的连接测试:图5-3连接测试用鼠标选择两个小图块,若它们之间没有障碍物,且又在同一条直线上,那么就可以用一条直线消除;若是不在同一条直线上,但是中间也没

温馨提示

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

评论

0/150

提交评论