福建农林大学计算机与信息学院计算机类课程设计报告课程名称:面向对象程序设计(课程设计)课题名称:猜数字游戏姓名:学号:专业:计算机科学与技术年级:2012级指导教师:职称:讲师2013年11月-I-面向对象程序设计(课程设计)成绩评定表评分项目分值得分程序(系统)原创性15程序功能25代码质量(健壮性和可扩展性)20核心代码和功能模块注释10设计报告课题来源&任务描述5系统设计10代码编写与实现结果说明10团队合作能力分工协作&联合研发5成绩总计指导老师签字:-II-目录1.课题来源...................................................................................................................12.任务描述...................................................................................................................12.1.课题的总体结构.............................................................................................12.2.核心功能模块与类设计.................................................................................22.3.任务分工与工作量说明.................................................................................33.程序(系统)详细设计...........................................................................................34.程序(系统)实现与测试.......................................................................................55.分析与讨论.............................................................................................................116.结束语.....................................................................................................................12-1-1.课题来源该作品为原创。课题灵感是能否做一个小游戏,寻找了很多小游戏比如俄罗斯方块等,发现其太复杂以目前的水平无法完成,于是就选择了一个比较简单的猜数字游戏,编写益智类的游戏可以让我们日常生活中自己使用来达到增加乐趣的作用。猜数字游戏的原游戏规则:通常由两个人玩,一方出数字,一方猜。出数字的人要想好一个没有重复数字的4位数,不能让猜的人知道。猜的人就可以开始猜。每猜一个数字,出数者就要根据这个数字给出几A几B,其中A前面的数字表示位置正确的数的个数,而B前的数字表示数字正确而位置不对的数的个数。如正确答案为5234,而猜的人猜5346,则是1A2B,其中有一个5的位置对了,记为1A,而3和4这两个数字对了,而位置没对,因此记为2B,合起来就是1A2B。接着猜的人再根据出题者的几A几B继续猜,直到猜中(即4A0B)为止。原游戏规则是两个人玩,于是我们想到了将规则改为人机对战,电脑出题玩家来猜。2.任务描述猜数字游戏:产生随机数,统计完全猜中的数字的个数以及统计猜中但位置错误数字的个数,并给出提示。最后计算积分。此程序体现了面向对象程序设计的继承性和封装性。2.1.课题的总体结构类层次结构图:contrast-A:int-B:int-n1:int-n2:int-n3:int-n4:int+setNum():void+count():void+getA():int+getB():int+setA(inta):voidscore-s1:int-s2:int-s3:int+score():+getS1():int+getS2():int+getS3():int+setS1(intb1):void+setS2(intb2):void+setS3(intb3):voidrandNumber-num2:int-num3:int-num4:int-ran():int+randNum():void+getnum1():int+getnum2():int+getnum3():int+getnum4():int-2-程序有三个类,其中randNumber类用来产生随机数,contrast类用来做对比并得出猜数字的结果,score类用来读取文件内容并统计分数,主函数进行循环输入猜数字,并将结果输入文件。程序的功能结构图:2.2.核心功能模块与类设计采用表格的形式,按照类在课题中的作用,列出核心类的功能定义和主要函数接口。randNumber类实现答案所需的随机数的产生randNum():void//制造随机数getnum1():int//获取随机数的第一位getnum2():int//获取随机数的第二位getnum3():int//获取随机数的第三位getnum4():int//获取随机数的第四位contrast类核心类,实现猜数字游戏主要玩法的设计setNum():void//用于设置用户输入的数据count():void//统计几A几BgetA():int//获取A的值getB():int//获取B的值setA(inta):void//设置A的值score类用于显示和统计分数score()://从文件获取排行榜数据并显示getS1():intgetS2():intgetS3():int//获取排行榜积分setS1(intb1):voidsetS2(intb2):voidsetS3(intb3):void//更改排行榜猜数字判断正误,给出提示随机数的产生输入所猜测的数据计算积分更新文件信息读取文件信息-3-2.3.任务分工与工作量说明成员名字任务分工工作量(%)韩泽宇(1)程序的初期设计制作(2)对积分统计显示错误的BUG进行修复,对循环的条件进行改变。(3)增加了文件保存功能,记录最高分并保存至文件(4)程序BUG测试及调试40%陈智杰(1)增加了变量对猜数字的次数进行限制,使得游戏更有挑战性(2)增加了在猜对数字时的(Y/N)退出功能,并能在退出时统计分数(3)程序BUG测试及调试30%钟扬(1)程序的外观界面设计(2)增加了对输入数字的限制,限定输入的数字每位必须各不相同,加强了程序健壮性(3)增加了积分统计(4)程序BUG测试及调试30%3.程序(系统)详细设计按照程序(系统)的总体结构,详细介绍程序中各个类和函数的设计思想和实现方法,并以图的方式说明程序的流程图。randNumber类实现答案所需的随机数的产生contrast类为核心类,继承至randNumber类,实现猜数字游戏主要玩法的设计-4-产生随机数字统计总分,判断是否上榜输出猜数字的提示(?A?B)输入所猜的数字与生成的随机数完全相同?NY猜数字的机会减少一次输出“你猜对了”次数耗尽?游戏结束开始读取并显示排行榜记录YY计算并打印积分是否继续?NN更新排行榜-5-4.程序(系统)实现与测试(1)给出典型的程序(系统)执行结果图。开始界面:猜数字界面:猜对时的显示界面:-6-破纪录时的显示界面:更新后的排行榜:(2)程序(系统)实现的功能随机数字的产生:产生四个随机数字分别代表四位数的四个位数字正误判断:给出既猜对位置也猜对的数字的个数以及猜对但是位置不对的数字的位置。积分计算:猜错按0分算,一次就猜对100分,两次猜对90分,三次80分……以此类推,最后一次猜对得20分。记录成绩的功能:给出排行榜记录前三名的成绩,保存在score.txt文件中。(3)根据课题的特性,列出带有详细注释的核心功能模块或类代码;源程序代码:随机数:classrandNumber{intnum1;intnum2;intnum3;intnum4;intran(){-7-srand((unsigned)time(NULL));for(inti=0;i10;i++){return(rand()%10);}}//返回0-9的一个随机数public:voidrandNum(){cout正在产生随机数...endl;//大概因为算法的问题产生随机数这个过程比较慢所以做个提示num1=-1;num2=-1;num3=-1;num4=-1;//清除上次的随机数记录,使得下次产生随机数与上次不冲突num1=ran();do{num2=ran();}while(num2==num1);do{num3=ran();}while(num3==num1||num3==num2);do{num4=ran();}while(num4==num1||num4==num2||num4==num3);};//产生四个不同的随机数intgetnum1(){returnnum1;}intgetnum2(){returnnum2;}intgetnum3(){returnnum3;}intgetnum4(){returnnum4;}};//获取随机数的方法用于比较:classcontrast:publicrandNumber{intA;intB;//用于记录结果(几A几B)-8-intn1;intn2;intn3;intn4;//(用于记录输入的数字)public:voidsetNum(inta1,inta2,inta3,inta4){n1=a1;n2=a2;n3=a3;n4=a4;}voidcount(){A=0;B=0;//每一次都重置A、Bif(n1==getnum1()){A++;}if(n2==getnum2()){A++;}if(n3==getnum3()){A++;}if(n4==getnum4()){A++;}//统计完全猜中的数字的个数(A)if(n1==getnum2()||n1==getnum3()||n1==getnum4()){B++;}if(n2==getnum1()||n2==getnum3()||n2==getnum4()){B++;}if(n3==getnum2()||n3==getnum1()||n3==getnum4()){B++;}if(n4==getnum2()||n4==getnum3()||n4==getnum1()){B++;}//统计猜中但位置错误数字的个数(B)}intgetA(){returnA;}intgetB(){returnB;}voidsetA(inta){A=a;}};classscore{ints1;ints2;ints3;//用于记录前三名积分public:intgetS1(){returns1;}intgetS2(){-9-returns2;}intgetS3(){returns3;}//用于获取积分的方法voidsetS1(intb1){s1=b1;}voidsetS2(intb2){s2=b2;}voidsetS3(intb3){s3=b3;}//用于最后修改积分排名score(){s1=0;s2=0;s3=0;FILE*fp;fp=fopen(score.txt,r);//打开文件if(!fp){cout当前暂无积分排名endl;}else{cout积分排行榜:endl;fscanf(fp,%d,&s1);cout