资源描述:
《Android手机下的斗地主游戏的设计与实现本科毕业设计论文》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
毕业设计本科毕业设计论文Android手机下的斗地主游戏的设计与实现40 毕业设计毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。作者签名: 日 期: 指导教师签名: 日 期: 使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。作者签名: 日 期: 40 毕业设计学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权 大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。涉密论文按学校规定处理。作者签名:日期:年月日导师签名:日期:年月日40 毕业设计注意事项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。3.附件包括:任务书、开题报告、外文译文、译文原文(复印件)。4.文字、图表要求:1)文字通顺,语言流畅,书写字迹工整,打印字体及大小符合要求,无错别字,不准请他人代写2)工程设计类题目的图纸,要求部分用尺规绘制,部分用计算机绘制,所有图纸应符合国家技术标准规范。图表整洁,布局合理,文字注释必须使用工程字书写,不准用徒手画3)毕业论文须用A4单面打印,论文50页以上的双面打印4)图表应绘制于无格子的页面上5)软件工程类课题应有程序清单,并提供电子文档5.装订顺序1)设计(论文)2)附件:按照任务书、开题报告、外文译文、译文原文(复印件)次序装订3)其它40 毕业设计目录摘要4第3章需求分析133.1需求分析133.1.1需求分析过程143.1.2需求分析的方法143.2可行性分析153.2.1可行性分析的意义153.2.2可行性分析报告153.3系统定义163.4系统的组成和功能构想:163.5研究方法163.5.1软件工程的定义163.5.2软件工程的模型173.5.3本系统的研究方法18第4章概要设计194.1系统总体设计方案194.1.1C/S模式194.1.2设计原则194.2基于C/S的模块设计204.2.1服务器端模块设计204.2.2客户端模块设计214.3相关技术的处理应用234.3.1面向连接的套接字编程234.3.2数据格式转换的问题24第5章详细设计与系统实现265.1服务器端各功能模块的实现265.1.1服务器的启动功能265.1.2接收连接请求功能275.1.3数据捕获功能285.2客户端各功能模块的实现295.2.1登录功能功能295.2.2数据接收功能305.2.3显示信息功能305.2.4游戏退出功能33第6章系统测试与维护346.1系统测试的原则3440 毕业设计6.2测试过程及方法356.3本系统测试环境366.4测试中的BUG及问题总结366.5软件的维护37结束语38致谢39主要参考文献40附录A部分源程序清单41附录B网络斗地主的规则简介5540 毕业设计第3章需求分析3.1需求分析3.1.1需求分析过程需求分析阶段的工作,可以分为四个方面:问题识别,分析与综合,制订规格说明,评审。l问题识别:就是从系统角度来理解软件,确定对所开发系统的综合要求,并提出这些需求的实现条件,以及需求应该达到的标准.这些需求包括:功能需求(做什么),性能需求(要达到什么指标),环境需求(如机型,操作系统等),可靠性需求(不发生故障的概率),安全保密需求,用户界面需求,资源使用需求(软件运行是所需的内存,CPU等),软件成本消耗与开发进度需求,预先估计以后系统可能达到的目标。l分析与综合:逐步细化所有的软件功能,找出系统各元素间的联系,接口特性和设计上的限制,分析他们是否满足需求,剔除不合理部分,增加需要部分。最后,综合成系统的解决方案,给出要开发的系统的详细逻辑模型(做什么的模型)。l制订规格说明书:即编制文档,描述需求的文档称为软件需求规格说明书。注意需求分析阶段的成果是需求规格说明书,向下一阶段提交。l评审:对功能的正确性,完整性和清晰性,以及其它需求给予评价。评审通过才可进行下一阶段的工作,否则重新进行需求分析。3.1.2需求分析的方法需求分析的方法有很多。这里只强调原型化方法,其它的方法如:结构化方法,动态分析法等(个人认为,对初学者不必深究这些方法,实际上我也从来没用过这些方法)在此不讨论。原型化方法是十分重要的(是软考等常考的知识点)。原型就是软件的一个早期可运行的版本,它实现了目标系统的某些或全部功能。原型化方法就是尽可能快地建造一个粗糙的系统,这系统实现了目标系统的某些或全部功能,但是这个系统可能在可靠性,界面的友好性或其他方面上存在缺陷。建造这样一个系统的目的是为了考察某一方面的可行性,如算法的可行性,技术的可行性,或考察是否满足用户的需求等。40 毕业设计如,为了考察是否满足用户的要求,可以用某些软件工具快速的建造一个原型系统,这个系统只是一个界面,然后听取用户的意见,改进这个原型.以后的目标系统就在原型系统的基础上开发。原型主要有三种类型(软考考过):探索型,实验型,进化型.探索型:目的是要弄清楚对目标系统的要求,确定所希望的特性,并探讨多种方案的可行性。实验型:用于大规模开发和实现前,考核方案是否合适,规格说明是否可靠。进化型:目的不在于改进规格说明,而是将系统建造得易于变化,在改进原型的过程中,逐步将原型进化成最终系统。使用原型化方法有两种不同的策略:废弃策略,追加策略。废弃策略:先建造一个功能简单而且质量要求不高的模型系统,针对这个系统反复进行修改,形成比较好的思想,据此设计出较完整,准确,一致,可靠的最终系统。系统构造完成后,原来的模型系统就被废弃不用.探索型和实验型属于这种策略。追加策略:先构造一个功能简单而且质量要求不高的模型系统,作为最终系统的核心,然后通过不断地扩充修改,逐步追加新要求,发展成为最终系统。进化型属于这种策略。3.2可行性分析3.2.1可行性分析的意义可行性研究能使新系统达到以最小的开发成本取得最佳的经济效益。可行性研究的目的,是根据所开发系统的请求,通过初步调查和系统目标分析,对要开发的民航票务管理系统从技术上、经济上、资源上和管理上进行是否可行的研究。这是一项保证资源合理使用、避免失误和浪费的重要工作。经济上的可行性:主要分析成本与收益、投资效果等。技术上的可行性:要分析技术力量、计算机性能、通讯网络和系统条件等。资源上的可行性:主要指管理、经费能否得到保证。管理上的可行性:如帐户管理水平、数据收集可能性、规章制度健全程度和领导对发展系统的态度。3.2.2可行性分析报告以下为将可行性分析转化为的可行性报告:l经济上的可行性:l40 毕业设计技术上的可行性:本系统技术实现简单可靠,通讯组网简单,因为不需要大规模的计算和读取数据,所以对计算机的性能要求并不高,对环境的搭建没有特殊的要求。l资源上的可行性:开发本系统无需很特殊设备与环境,所以资源上具有可行性。l管理上的可行性:对于每个用户都对应一个帐号和密码,安全性相当的高,且便于管理。以上可行性分析就各个方面进行了分析,接下来需遵照相关标准和规定进行审议,通过后进入了以下需求分析阶段。3.3系统定义本游戏是斗地主游戏(Android版),是根据湖北地区民间的盛行的扑克牌游戏斗地主,融合最新的移动平台Android的特点和管理需要,推出的体现当前行业最具有代表意义的解决方案。作为面向广大用户网络游戏,主要用于提供斗地主的游戏平台,提供发牌、叫牌、出牌、胜负判定等主要功能。3.4系统的组成和功能构想:l用户动作信息录入功能--输入l系统信息显示功能--输出3.5研究方法3.5.1软件工程的定义软件工程是一类求解软件的工程,它应用计算机科学、数学及管理科学等原理,借鉴传统工程的原则、方法,创建软件以达到提高质量、降低成本的目的。其中,计算机科学、数学用于构造模型与算法,工程科学用于制定规范、设计范型、评估成本及确定权衡,管理科学用于计划、资源、质量、成本等管理。软件工程是一门指导计算机软件开发和维护的工程学科。3.5.2软件工程的模型 软件工程的模型是软件开发全部过程、活动和任务的结构框架。瀑布模型内容及特点:40 毕业设计 瀑布模型将软件生存周期的各项活动规定为依固定顺序连接的软干阶段工作,是一种线性模型。各阶段活动为,提出系统需求、提出软件需求、需求分析、设计、编码、测试和运行。每个开发阶段具有以下特征,从上一阶段接受本阶段工作的对象作为输入,对上述输入实施本阶段的活动,给出本阶段的工作成果作为输出传入下一阶段,对本阶段工作进行评审,若本阶段工作得到确认,则继续下阶段工作,否则返回前一阶段甚至更前阶段。瀑布模型最为突出的缺点是该模型缺乏灵活性。演化模型内容及特点: 演化模型主要针对事先不能完整定义需求的软件开发,其开发过程一般是首先开发核心系统,当核心系统投入运行后,软件开发人员根据用户的反馈,实施开发的迭代过程,每一迭代过程均由需求、设计、编码、测试、集成等阶段组成,直到软件开发结束。演化模型在一定程度上减少了软件开发活动的盲目性。螺旋模型内容及特点: 它是在瀑布模型和演化模型的基础上,加入两者所忽略的风险分析所建立的一种软件开发模型。沿螺旋模型顺时针方向,依次表达了四个方面的活动,制定计划、风险分析、实施工程、客户评估。喷泉模型内容及特点: 它体现了软件创建所固有的迭代和无间隙特征,喷泉模型主要用于支持面向对象开发过程。增量模型内容: 在设计了软件系统整体体系结构之后,首先完整的开发系统的一个初始子集,继之,根据这一子集,建造一个更加精细的版本,如此不断的进行系统的增量开发。瀑布模型、演化模型、螺旋模型之间的联系:相同点是这三个模型都分为多个阶段,而瀑布模型一次完成软件,演化模型分为多次完成,每次迭代完成软件的一个部分,螺旋模型也分为多次完成,每次完成软件的一个新原型,并考虑风险分析。3.5.3本系统的研究方法本系统的开发严格遵守软件工程开发的标准流程。实地考察,进行需求分析,书写需求分析表和初步的软件说明书。在模块设计的同时进行单元测试,系统设计完成进行系统调试和系统集成测试。设计完成后,编写完整的软件说明书和用户手册,最后还需写对自己所作设计的评价和总结。40 毕业设计经过对各个软件工程的模型的分析,我决定使用瀑布模型进行开发。因为本系统的开发人员仅为我一人,非小组合作,在对各个阶段的交接上,只能按顺序进行,完成上一阶段后才能进行下一阶段的工作。我的整个软件开发流程如图:图3.1Androida斗地主游戏开发流程第4章概要设计4.1系统总体设计方案4.1.1设计原则(1)戏被运行时,首先生成两个电脑玩家,然后游戏开始发牌,并规定该局首先叫牌者,使之进入叫牌状态。最终叫到地主的客户端必须首先出牌。(2)玩家的任何动作必须调用规则控制接口。当接口返回动作合法的结果时,玩家才能做出所请示的动作(实际上只是显示动作的结果,因为接口已经处理了该动作,在发送许可的同时发送了处理结果)。否则,接口返回拒绝消息,玩家则显示有关错误信息。(3)电脑玩家根据牌局生成出牌方案,然后返回数据,并执行相应的显示与相关的游戏设置。40 毕业设计4.2基于Android的模块设计4.2.1模块设计(1)游戏规则的实现通过封装相应的类来实现规则。类card:卡片类(牌),数据成员为花色(color),牌面(value),数目(num),存在标志(exist)。枚举colors:包括方块,梅花,红心,黑桃,小鬼,大鬼总共六种花色。结构体comb:内含头头是单,双,三顺,炸弹,火箭等所有牌型的标记位。类player:玩家类,数据成员:玩家靓号(m_strplayerID),个性签名(m_strName),登陆密码(m_strPassword)等。类playingCards:游戏规则类,数据成员:玩家数目(numPlayers),有牌数目(numCards),每个玩家有牌数目(cardsEach)等。成员函数:游戏初始化initgame(),洗牌suffle(),发牌sendCards()叫地主candlander(intseat,intpoint),出牌outcards(player&ThisPlayer)等等。Card是游戏的对象,一般而言,特定的游戏都有特定的游戏对象。Colors,comb都是根据需要,对card的补充。Colors是各个牌的花色共有6种,后两种是小鬼(Bjoke)大鬼(Rjoke),不用于其他牌。Comb是combo的意思,指牌的类型。在斗地主中,牌型有单牌,顺子,对子,3带**,4带**,炸弹,火箭等,详细请看附录2网络斗地主的规则简介。Player是玩家在服务器中的一个映射,玩家的任何动作都由它代为完成,然后将结果返回给服务器的相关内存。playingCards充分利用以上几个类的对象,对附录2中“一副牌的规则”进行了模拟实现,做到了一模一样。并且加上了方法。封装起来,外界通过类的对象,只要调用它的方法,就可以实施对玩家出牌的合法性判断,并做相关结果的存储工作。至于判断结果如何处置,请参看(3)游戏平台的实现(2)游戏平台的实现:对话框CdisplayflashDlg:客户端游戏界面,内含与flash40 毕业设计UI通信的接口。数据成员:积分m_nintegral,剩牌数目m_nsparecards座位号m_norder_seats,放弃动作m_nPass,手上的牌m_strpcards选择的牌m_strselectcards,合法牌m_stroutcards等等。成员函数:接收数据OnReceive(),关闭OnClose()等。顾名思义,display就是显示的意思,flash就是用动画显示。在客户端,只通过接收机制判断命令是否针对自己,若是,则执行之,显示服务器处理结果。否则,不执行,只获取当前玩家状态。该接收机制就是OnReceive方法。它通过switch()-case机制区分不同的消息;通过msg.InfoAbout和m_norder_seats来判断消息中的指令是否针对自己发出的。4.3相关技术的处理应用4.3.1数据实体定义当玩家接收派牌时,类Card的定义是这样的:publicclassColors{staticfinalintdiamond=1;//方块staticfinalintclub=2;//梅花staticfinalintheart=3;//红心staticfinalintspade=4;//黑桃staticfinalintbjoke=5;//小鬼staticfinalintrjoke=6;//大鬼}publicclassCard{intvalue;Colorscolors;intexist;intnum;publicColorsgetColors(){returncolors;}publicvoidsetColors(Colorscolors){this.colors=colors;}publicintgetExist(){returnexist;}publicvoidsetExist(intexist){40 毕业设计this.exist=exist;}publicintgetNum(){returnnum;}publicvoidsetNum(intnum){this.num=num;}publicintgetValue(){returnvalue;}publicvoidsetValue(intvalue){this.value=value;}}详细代码请看附录或磁盘;第5章详细设计与系统实现详细设计是整个设计过程中,最重要的步骤之一。本系统的功能主要分成两大模块:服务器端和客户端。每个模块有可以分成几个子模块。下面分几个部分对各个模块进行详细设计:功能模块l数据接收功能l显示信息功能l数据捕获功能40 毕业设计l合法性判断功能l游戏退出功能5.1功能模块的实现5.1.1启动游戏点击“启动游戏”就可以调用成员函数OnSet(),启动游戏。这个很简单,就不多讲啦。5.1.2开始游戏功能启动游戏后,自动生成两个电脑玩家,开始进入游戏状态。5.1.3数据捕获功能OnReceive()捕获数据5.1.4合法性判断功能playingcards1来调用类playingCards中的封装的规则实现方法,最终完成合法性判断。首先,在OnRecieve()方法中,实现对用户出牌的m_strpos(里面包含的是客户端点击的牌的position)的剥离,使之转换成整型数组pos[lenpc],lenpc是客户端实际出牌的长度。然后,调用出牌方法playingcards1.outcards(&当前发出动作的玩家),进行出牌动作;再就是,经过选牌selectcards(PlayerthisPlayer),返回Cardpc;以及牌型处理方法:CardplayingCards.dealcards(Cardpc)返回Cardcard1和CombplayingCards.dealcaa(Cardcard1),返回comb1;最后,牌型合法性判断booleanplayingCards.legalcomb(Combcomb1,Cardcard1),如果牌型合法,则继续下面的牌面大小合法性的判断booleanplayingCards.biggerthanfront(Cardcard2),否则,提示出牌不合法。如果牌面大小合法,则出牌最终是合法的,将出牌处理结果,存入Listfront=newArrayList(20),并发送给各个玩家。值得一提的是,地主开局第一次出牌或者后继两家玩家都pass掉时,Listfront中的value值全为-1,其他诸如:exist,color,num分别40 毕业设计为1,(colors)1,1;所以此时,当前出牌玩家出的牌,只要是合法的牌型,就可打合法地打出去。5.2.2玩家操作功能操作判断机制switch(msg.message)-case中,case共分0:登录1:退出2:开牌3:叫牌4:出牌5:pass6:计分六种情况。在此以最重要使用、最频繁的“case4:出牌”来讲述这个功能。首先,判断处理结果是否表明前面出牌是否非法,如果是,将给机会客户端重新出牌。否则,判断,信息是否是发给发出前面动作的本人。是,则将合法牌显示在UI上,并更新手上的牌。否则,只显示别人打出来的牌,及其所剩牌数目。然后,当前面动作者是接收方的直接上家(或逻辑上家)时,接收方获得出牌权。否则,没有出牌权。详细规则请参看附录1客店端对出牌的显示控制。5.2.3显示信息功能CdisplayDlg.m_strpcards存储玩家手上的牌。然后实现排序的问题和合法牌打出以及非法牌回收的问题。排序效果如图:图5.5玩家收到的牌及其三种排序(按花色,大小,牌型)排序算法如下:先将用户手上的牌card20copy到cardHit中去.然后,按其数据成员color(桃>心>梅>方),value(大>小),num(多>少)设置为不同级别的关键字.40 毕业设计(1)按花色排序:主关键字color,次关键字value(2)按大小排序:主关键字value,次关键字color(3)按牌型排序:主关键字num,次关键字value,color前两种排序只是处理调用sortOnValue()与sortOnColor()的先后关系.而按comb排序稍复杂一点,先按大小排序,再从右边开始查找.先找只有2个牌相同的,找到就往最左边放.然后依同理查找只有3个牌相同的和只有4个牌相同的,再就是查找火箭.最后剩下单牌就留在最后边.CdisplayDlg.m_strpos玩家通过点击flashUI上面的牌,flashUI把各个被选中的牌的position传递至这个参数,并被存储起来。当玩家用鼠标点击某个牌时,该牌会弹出来,高出其他兄弟牌半截,此时,它在牌组cardHit中的位置position已经被取出并存入msg.m_strpos中,等待发送至服务器端.当用户选完想出的牌,点击手形图标后,就同时触发方法voidCdisplayflashDlg.OnButtonOutcards(),msg.m_strpos就随之被发送到服务器端了。服务器的处理方式请参看5.1.4合法性判断功能CdisplaySocketDlg.m_stroutcards玩家出如果经服务器判断合法,将被接受并存储在这个参数里。客户端将合法的牌全部显示在界面中央,并在动作者的手上将相应的牌清除掉(使相应牌的exist=-1)。如下图:我们可以看到,动作者手上的梅花3补打出去了,由于这是地主的第一次出牌,服务器判定其合法,客户端收到判断结果后,将牌打出去在界面的中央位置显示,而在自己手上,清除掉该“梅花3”。40 毕业设计图5.6选中一张牌并正常打出去如果不合法,系统将不打出去,并给出错误提示.并且,将不合法的牌还原到动作者手中,让动作者重新选择:出牌ORPASS。原理其实与上面的大同小异,就不必赘述了。如图:5.7非法出牌报错40 毕业设计5.2.4游戏退出功能CdisplayDlg::OnExit()退出游戏调用系统方法关闭窗口、关闭对话框。40 毕业设计第6章系统测试与维护在软件程序编码完成之后,在软件投入使用之前要进行软件测试。何谓软件测试,简言之:软件测试是为了发现错误而执行程序的过程。也就是根据软件开发各阶段的规格说明何程序的内部结构而精心设计测试用例,用这些用例去运行程序以发现程序错误的过程。系统测试在一个系统的周期中占有越来越重要的位置了。在系统正式投入运行的转换工作之前,还需对系统进行一系列的调试即测试。系统调试的任务是根据系统说明书和系统实施方案,对程序设计的结果进行全面的检查,找出并纠正其中的错误,使可能发生的问题和错误,尽量消灭在系统正式运行之前。6.1系统测试的原则l应当尽早和不断的进行软件测试.l测试用例应由测试输入数据和预期输出结果两部分组成.(注意:测试用例包含输入和输出两部分).l测试用例应包括合理的输入条件和不合理的输入条件.前者即使程序正常运行的条件,后者即可能引起程序非法操作的条件.l程序员应避免检查自己的程序.因为父母总是疼爱自己的孩子.程序员总是在潜意识不愿意否定自己的劳动成果.l注意测试中的群集现象.测试后程序中残存的错误数目与该程序中已发现的错误数目成正比.所以,不要在某个程序段中找到几个错误就误认为该程序段就没有错误而不再测试,相反该程序段更要集中精力测试。l测试应该制订计划,严格按计划进行测试,避免测试的随意性.l应对每一个测试结果做全面检查.有时出错的征兆已经在测试结果中出现了,但由于没有对测试结果进行仔细检查,而使这个错误成了漏网之鱼.l应妥善保存测试计划,用例,错误记录和分析报告.6.2测试过程及方法软件的测试过程有四个步骤:单元测试,集成测试,确认测试和系统测试.40 毕业设计单元测试即对每一个单元模块进行测试.然后把测试过的模块组装起来进行集成测试,主要是对软件体系结构的构造进行测试.接着进行确认测试,检查软件是否满足了各种需求,以及配置是否合理安全.最后是系统测试,即把经确认测试后的软件放到实际运行环境中,与系统的其他构件一起进行测试.单元测试时,有时需要为测试的模块编写辅助模块:驱动模块和桩模块.前者是用来调用被测模块;后者用来代替被测模块调用的子模块。集成测试,又叫组装测试,分为两种:一次性组装和增殖式组装.一次性组装方式即把经单元测试后的模块一次性的组装成系统进行测试.增殖式组装方式即在模块组装的过程中,边组装边测试,每增加一个或几个模块就测试一次,最后组装成最后的系统,它又分为:自顶向下的增殖,自底向上的增殖,混合增殖等几种方式.确认测试过程要做的工作包括:有效性测试,软件配置复审,验收测试和安装测试.在验收测试中常用的有α测试和β测试.α测试时,开发者坐在用户旁边,随时记录用户发现的问题.β测试则开发者不在测试现场,故是在开发者无法控制的环境下进行的测试,通常是由软件开发者向用户散发β版软件,然后收集用户的意见.测试的方法大体可以分为两种:黑盒测试和白盒测试.黑盒测试即把测试的对象看成一个黑盒子,不考虑程序内部的逻辑结构和内部特性,主要在软件的接口处进行测试,主要测试软件的功能.黑盒测试的方法包括:等价类划分法,边界值分析,错误推测法,因果图,功能图等.白盒测试把测试对象看成是一个打开的盒子,程序内部的逻辑结构和其他信息对测试人员都是公开的.白盒测试的方法有:逻辑覆盖(语句覆盖,判定覆盖,判定-条件覆盖,条件组合覆盖,路径覆盖),基本路径测试等.6.3测试环境测试的硬件环境为:主机为英特尔赛扬M处理器3601.4GHZ,硬盘为40G,内存容量256M。测试的软件环境是:用户界面用Android模拟器进行测试,逻辑控制用单元测试工具JUnit进行测试。最后,在Android模拟器上进行集成测试。40 毕业设计6.4测试中的BUG及问题总结测试的过程中,我首先进行了代码走查。对自己编写过的代码进行了全面的检查,发现不仅有很多设计不合理的地方,还有很多潜在的错误。比如,在定义类的对象的类型时,为了方便,都定义为Public,这对这些都对系统以后的运行造成错误和危险。对于及时发现的问题,我都进行了改正。接着是白盒测试,我对各个模块又小到大,有单个到集成进行了测试,发现在模块间的衔接上总会出现些小问题。但经耐心检查定位,一个个找到了错误的原因,排除了错误。最后进行的是黑盒测试,由于之前的调试修改为这次测试做了铺垫,在黑盒测试中,并没有发现很大的问题。最后,对照需求规格说明书,对软件的功能实现是否符合要求进行了检查,均已达到要求。在进行了修改与整理后,最后的验收测试进行的很顺利,程序验收合格。6.5软件的维护软件维护的原因可分为4类:改正性维护,适应性维护,完善性维护和预防性维护.l改正性维护:在软件投入运行后,可能会暴露一部分在测试阶段没有发现的错误,为改正这些错误而对软件进行的修改就是改正性维护。l适应性维护:由于软件运行的外部环境(软件,硬件)和数据环境等的变化而修改软件使之适应这些变化,就是适应性维护.例如:原先在DOS下开发的软件,现在要使之适用于windows而进行的修改。l完善性维护:用户的需求是经常变化的,在软件使用过程中,用户会对软件提出新的功能和性能要求,为了满足这些新的要求而对软件进行修改,使之功能和性能得到完善.l预防性维护:就是采用先进的软件工程方法对需要维护的软件或某部分软件重新进行设计,编码和测试,以提高软件的可维护性和可靠性等,为以后进一步改进软件打下基础.例如:有个软件原先是用结构化的思想编写的,现在为了提高软件的质量而用面向对象的方法重新设计和编写软件。40 毕业设计软件的可维护性就是指软件维护的难易程度.要做到软件的可维护性要注意以下几点:建立明确的软件质量目标和优先级;使用提高软件质量的技术和工具,如:面向对象技术,软件体系结构思想等;进行明确的质量保证审查;选择可维护的程序设计语言;做好程序的文档等等.40 毕业设计附录A部分源程序清单1客户端程序清单图A-1客户端程序清单部分代码://CsserializationvoidCs::Serialize(CArchive&ar){ncolor=cards.color;if(ar.IsStoring())40 毕业设计{ar<>message>>ncolor>>m_nBroadcastArrived>>beginfirst>>InfoAbout>>m_strplayerID>>m_strName>>m_strPassword>>m_strSucess>>m_norder_seats>>m_nintegral>>m_nsparecards>>m_nescape>>m_nIsReady>>m_ncandpoint>>m_nPoint>>m_nPass>>m_strpcards>>m_strpos>>m_strselectcards>>m_stroutcards>>m_nclose_lipped>>m_nfirstcand>>m_nmytime>>m_nvictory>>m_nlandowner>>pass_times>>m_nlegalInfo>>m_strfront>>mul_point;//TODO:addloadingcodehere}}图A-2displayflashDlg成员40 毕业设计voidCdisplayflashDlg::Connect(){//TODO:Addyourcontrolnotificationhandlercodeherem_pSocket2=newCClientUseSocket2(this);if(!ConnectServer(m_pSocket2)){m_pSocket2=NULL;deletem_pSocket2;}Sleep(1000);SendGetCardMessage();}voidCdisplayflashDlg::OnReceive(CClientUseSocket2*pClientSocket){staticCsmsg;pClientSocket->ReceiveMassage(&msg);if(m_norder_seats==msg.m_norder_seats)//如果消息是发给‘我’的{switch(msg.message)//0:登录1:退出2:开牌3:叫牌4:出牌5:pass6:计分{//不同的case做不同的动作,详细请看磁盘}}//if40 毕业设计}//OnReceive2服务器端程序清单图A-3服务器程序清单Cs是与客户端完全一致的.这里就不再赘述.//playingCards.cpp:implementationoftheplayingCardsclass.//这是个大模块,只出示部分代码//////////////////////////////////////////////////////////////////////40 毕业设计图A-4playingcards成员清单#include"resource.h"#include"stdafx.h"#include"ServerSocket.h"#include"playingCards.h"//*-*-*-*-*洗牌voidplayingCards::suffle(){cardtmp;for(inti=0;i<54;i++){//交换两张牌intx=rand()%54;tmp.value=card54[x].value;tmp.color=card54[x].color;card54[x].value=card54[i].value;card54[x].color=card54[i].color;card54[i].value=tmp.value;card54[i].color=tmp.color;40 毕业设计}}//*-*-*-*发牌voidplayingCards::sendCards(){////cout<<"发牌:"<beginfirst;POSITIONpos;pos=UseSocketList.GetHeadPosition();pSocket=(CClientSocket*)UseSocketList.GetHead();do{pSocket=(CClientSocket*)UseSocketList.GetNext(pos);msg.m_norder_seats=++next;pSocket->SendMess(&msg);}while(pos!=NULL);msg.m_nBroadcastArrived=1;msg.m_norder_seats=current_seats;}40 毕业设计voidCServerSocketDlg::OnReceive(CClientSocket*pSocket){CStringtemp=_T("");CStringInfoLog;CStringp_strName;CStringp_strPassword;staticintAllIsReady=0;staticintHighester=0;staticintHighestPoint=0;staticintPRECEDENT=0;//前面最近那个没有pass的人staticintpass_times=0;//连续pass的次数intnext=0;Csmsg;pSocket->ReceiveMessage(&msg);if(pass_times!=1)PRECEDENT=msg.InfoAbout;//msg.InfoAbout=msg.m_norder_seats;next=(msg.m_norder_seats)%3+1;switch(msg.message)//0:登录1:退出2:准备3:叫牌4:出牌5:pass6:计分{//不同的case对应不同的操作,然后将结果通过广播到每个客户端.40 毕业设计//详细请参看磁盘}}//OnReceive()客店端对出牌的显示控制//出牌if(msg.m_nlegalInfo==0)//如果出牌不合法,可以有机会再出{//flashAction:提示某个玩家出牌有错,可以再重新出牌if(msg.InfoAbout==msg.m_norder_seats){AfxMessageBox("出牌不合法");if(m_bFirstOut==true||msg.pass_times==2){m_FlashPlayer.SetVariable("actionObject.actionmsg","DoAgain_Da");}else{m_FlashPlayer.SetVariable("actionObject.actionmsg","DoAgainDOP");}}break;}//if(msg.m_nlegalInfo==0)//如果出牌不合法,可以有机会再出if(msg.m_nlegalInfo!=-1)m_bFirstOut=false;if(msg.InfoAbout==msg.m_norder_seats)//发给作出行为的本人{//牌面更新m_strpcards=InputString(msg.m_strpcards);m_str2Card(m_strpcards,card20);40 毕业设计if(m_bFirstOut==true){//处理地主问题waitCleanBuffer();strcat(flashBuffer,"INITDIZHU");CardValues2Buffer(card20,20);m_FlashPlayer.SetVariable("p123Object.p123msg",flashBuffer);cleanBuffer();}else{//玩家收到回音m_FlashPlayer.SetVariable("actionObject.actionmsg","ClearButtons");}m_stroutcards=InputString(msg.m_stroutcards);m_strselectcards=InputString(msg.m_strselectcards);}elseif(next==msg.m_norder_seats)//下家是我{if(m_bFirstOut==true){m_FlashPlayer.SetVariable("actionObject.actionmsg","ClearButtons");}else{m_FlashPlayer.SetVariable("actionObject.actionmsg","DaOrPass");}if(msg.pass_times==2){m_FlashPlayer.SetVariable("actionObject.actionmsg","DaOnly");}}if(msg.InfoAbout!=msg.m_norder_seats){testingVar2=msg.InfoAbout;//1clientnum40 毕业设计testingVar3=msg.m_norder_seats;//myselfis2testingVar4=m_bFirstOut;//1firsttimem_stroutcards=InputString(msg.m_stroutcards);m_str2Card(m_stroutcards,cardHit);waitCleanBuffer();if(m_bFirstOut==1)strcat(flashBuffer,"zhuFirstDa");elsestrcat(flashBuffer,"updateDa");strcat(flashBuffer,getViewNumStr(msg.m_norder_seats,msg.InfoAbout));//doseatnumberandplayerviewcalculationsherenumCardsToFBuffer=NumOfCardsInCARDS(cardHit);itoa(numCardsToFBuffer,NumbCardsToHit,10);strcat(flashBuffer,NumbCardsToHit);strcat(flashBuffer,"");CardValues2Buffer(cardHit,20);m_FlashPlayer.SetVariable("UpdateObjectF.updatemsg",flashBuffer);cleanBuffer();for(inthitCount=0;hitCount<20;hitCount++)cardHit[hitCount].value=-1;Broadcast.Format("%d出牌:%s",msg.InfoAbout,msg.m_stroutcards);m_stroutcards="广播:"+Broadcast;}。40 毕业设计附录B网络斗地主的规则简介一幅牌常规知识:游戏人数:3人。游戏用牌:一副牌。一局:从开牌到打完所有的牌,称为一局。一轮:从一个玩家“发牌”后,经过若干玩家上牌,直到所有玩家都不再上牌,称为一轮牌。牌套:可出的牌套包括:◆火箭:即双王(双花牌),什么牌型都可打,是最大的牌。◆炸弹:四张牌点相同的牌(如四个8)。除火箭和比自己大的炸弹外,什么牌型都可打。◆单牌:单张牌。◆对牌:两个牌点相同的牌。◆三张牌:三张牌点相同的牌。◆三带一手:三张牌+一张单牌或一对牌。例如:888+9或888+99◆单顺:五张或更多连续的单牌。例如:3+4+5+6+7+8。不包括2和大、小王。◆双顺:三个或更多连续的对牌。例如:33+44+55。不包括2和大、小王。◆三顺:二个或更多连续的三张牌。例如:333444、444555666777。不包括2和大、小王。◆飞机带翅膀:三顺+同数量的一套牌。例如:333444+69或333444555+66779940 毕业设计◆四带二:四张牌+任意两套张数相同的牌。例如:5555+3+8或4444+55+77牌点大小:大王>小王>2>A>K>Q>J>10>9>8>7>6>5>4>3牌套的大小:◆火箭什么牌型都可打,是最大的牌。◆炸弹,除火箭和比自己大的炸弹外,比其它牌型都大。◆对其他牌套而言,只有当牌套和总张数相同的牌,才可比较大小。◆像三带一、四带二等组合牌型,只要比较其牌数最多牌的牌点就行。有效炸弹或火箭:如果发牌时直接发出炸弹或火箭,计分时不翻番。即不是直接发牌出的炸弹,而是用来灭其他牌时使用的炸弹才有效,计分时才翻番。一幅牌游戏过程:开牌:游戏开始时,由打牌服务器将一副牌随机留三张底牌,其他牌随机发给三家。开牌过程是自动完成的。叫牌:第一局首个叫牌人由系统随机指定,以后每局按逆时针顺序轮流开始叫牌。每一局每人只能叫一次,叫牌可叫“1分”、“2分”、“3分”或不叫,叫最大分的玩家为地主,如果都选择不叫牌,则重新开始一局。如果有人“叫牌”直接叫“3分”,后面的玩家就没有“叫牌”机会了。“叫牌”分最高的玩家就是本局的“地主”,其他两位玩家是一伙联合起来和地主斗。地主确定后,将三张底牌亮明,所有玩家都能看到,并且将三张底牌交给地主。这样地主手中有20张牌,另两位玩家手中只有17张牌。基础分:地主所叫的分值。40 毕业设计发牌:每局牌都由地主先发牌。以后每轮都由上一轮的最后出牌人发牌。上牌:有人出牌后,其他玩家按逆时针顺序依次跟牌。轮到玩家跟牌时,可选择不跟,或者用比所出的牌大的牌套管住,称为上牌。过牌:对前面人出的牌不跟,称为过牌。一轮结束:一轮牌中当某玩家出牌后,其余两位玩家不再跟牌时,此轮结束。下一轮牌由该玩家先发牌。一局结束:当一玩家手中的牌全部打光时,一局牌结束,开始定胜负。定胜负:如果地主第一个出完牌,地主赢;否则,地主输。一幅牌计分:基础分:叫牌的底分,有“1分”“2分”“3分”;地主胜:地主得2×叫牌的底分,其余两家各得:—叫牌的底分;地主败:地主得—2×叫牌的底分,其余两家各得:叫牌的底分;每出一个有效炸弹(或火箭),分数×2;地主把牌出完,其余两家一张牌都没出,分数×2;两家中有一家出完牌,而地主仅仅出过一手牌,分数×2。40