1、面向对象程序设计课程设计报告解析福建农林大学计算机与信息学院计算机类课程设计报告课程名称: 面向对象程序设计(课程设计)课题名称: 猜数字游戏姓 名:学 号:专 业:计算机科学与技术年 级:2012级指导教师:职 称:讲师2013年11月面向对象程序设计(课程设计)成绩评定表评分项目分值得分程序(系统)原创性15程序功能25代码质量(健壮性和可扩展性)20核心代码和功能模块注释10设计报告课题来源&任务描述5系统设计10代码编写与实现结果说明10团队合作能力分工协作&联合研发5成绩总计指导老师签字:1. 课题来源 1.2. 任务描述 1.2.1. 课题的总体结构 1.2.2. 核心功能模块与类
2、设计 22.3. 任务分工与工作量说明 33. 程序(系统)详细设计 3.4. 程序(系统)实现与测试 5.5. 分析与讨论 116. 结束语 121. 课题来源该作品为原创。课题灵感是能否做一个小游戏,寻找了很多小游戏比如俄罗斯方块等, 发现其太复杂以目前的水平无法完成, 于是就选择了一个比较简单的猜数字游戏, 编写益智类的游戏可以让我们日常生活中自己使用来达到增加乐趣的作用。猜数字游戏的原游戏规则:通常由两个人玩,一方岀数字,一方猜。岀数字的人要想好一个没有重复 数字的4位数,不能让猜的人知道。猜的人就可以开始猜。每猜一个数字,岀数者就要根据这个数字给岀几A几B,其中A前面的数字表示位置正
3、确的数的个数, 而B前的数字表示数字正确而位置不对的数的个数。如正确答案为 5234,而猜的人猜 5346,则是1A2B,其中有一个5的位置对了,记为1A,而3和4这 两个数字对了,而位置没对,因此记为 2B,合起来就是1A2B。接着猜的人再根据出题者的几 A几B继续猜,直到猜中(即 4A0B )为止。原游戏规则是两个人玩,于是我们想到了将规则改为人机对战,电脑出题玩家来猜。2. 任务描述猜数字游戏:产生随机数,统计完全猜中的数字的个数以及统计猜中但位置 错误数字的个数,并给出提示。最后计算积分。此程序体现了面向对象程序设计 的继承性和封装性。2.1.课题的总体结构程序有三个类,其中randN
4、umber类用来产生随机数, con trast类用来做对比并得出猜数字的结果, score类用来读取文件内容并统计分数, 主函数进行循环输入猜数字,并将结果输入文件读取文件信息随机数的产生输入所猜测的数据22核心功能模块与类设计判断正误,给出提示采用表格的形式,按照类在课题中的作用,列出核心类的功能定义和主要函 数接口。ran dNumber 类实现答案所需的随机数的产生ran dNum():void制造随机数get num1():i nt获取随机数的第一位 get nu m2():i nt获取随机数的第二位 get nu m3():i nt获取随机数的第三位 get nu m4():i n
5、t获取随机数的第四位con trast 类核心类,实现猜数字游戏主要玩法的设 计setNum():void用于设置用户输入的数 据count():void统计几 A 几 B getA():int/ 获取 A 的值 getB():int/获取 B 的值 setA(int a):void/ 设置 A 的值score 类用于显示和统计分数score()::/从文件获取排仃榜数据并显示getS1():i ntgetS2():i ntgetS3():i nt获取排行榜积分setS1( int b1):voidsetS2( int b2):voidsetS3(i nt b3):void 更改排行榜23任务
6、分工与工作量说明成员名字任务分工工作量(%)韩泽宇(1) 程序的初期设计制作(2) 对积分统计显示错误的 BUG进行修复,对循环的 条件进行改变。(3) 增加了文件保存功能,记录最咼分并保存至文件(4) 程序BUG测试及调试40%陈智杰(1 )增加了变量对猜数字的次数进行限制,使得游戏 更有挑战性(2) 增加了在猜对数字时的(Y/N)退出功能,并能在退出 时统计分数(3) 程序BUG测试及调试30%钟扬(1) 程序的外观界面设计(2) 增加了对输入数字的限制,限定输入的数字每位 必须各不相同,加强了程序健壮性(3 )增加了积分统计(4)程序BUG测试及调试30%3. 程序(系统)详细设计按照程
7、序(系统)的总体结构,详细介绍程序中各个类和函数的设计思想和 实现方法,并以图的方式说明程序的流程图。randNumber类实现答案所需的随机数的产生contrast类为核心类,继承至 randNumber类,实现猜数字游戏主要玩法的设计猜数字的机会减少一次Y次数耗尽?开始丁读取并显示排行榜记录r*产生随机数字J 输入所猜的数字是否继续?N4. 程序(系统)实现与测试(1)给出典型的程序(系统)执行结果图 开始界面:C:Userslen ovoDe 5 ktqpM諭手游戏De b u 数字% 游戏启畑” 一制作者:韩泽 游饗會机产生一个没有重复養rill钟扬次败数 -F H 将三 羸束前 玩囁
8、存戏保第一电:200 第二名:100 第三苕0猜数字界面:猜对时的显示界面:请输入您所猜的四位数字4706夬刀 分60 得为 了松分 对本总BB谓输人肛继绑蒯 退岀破纪录时的显示界面4A0B分为严分 檢的忌分为丄盹分请输入丫继续或应退岀更新后的排行榜:积魁E行橡第一电;200M4: Ise第三名;100(2) 程序(系统)实现的功能随机数字的产生:产生四个随机数字分别代表四位数的四个位数字正误判断:给出既猜对位置也猜对的数字的个数以及猜对但是位置 不对的数字的位置。积分计算:猜错按0分算,一次就猜对100分,两次猜对90分,三次 80分以此类推,最后一次猜对得 20分。记录成绩的功能:给出排行
9、榜记录前三名的成绩,保存在score.txt文件 中。(3) 根据课题的特性,列出带有详细注释的核心功能模块或类代码; 源程序代码:随机数:class ran dNumberint nu ml;int nu m2;int nu m3;int num4;int ran()srand( (unsigned)time( NULL ) );for(int i=0;i10;i+)return (rand()%10);/返回 0-9 的一个随机数 public:void randNum()cout正在产生随机数 .endl;/ 大概因为算法的问题产生随机数这个过程 比较慢所以做个提示num1=-1;num
10、2=-1;num3=-1;num4=-1;/ 清除上次的随机数记录,使得下次产生随机数与上次不冲突 num1=ran();donum2=ran();while(num2=num1);donum3=ran(); while(num3=num1|num3=num2); donum4=ran(); while(num4=num1|num4=num2|num4=num3);/ 产生四个不同的随机数int getnum1()return num1;int getnum2()return num2;int getnum3()return num3;int getnum4()return num4;/ 获取
11、随机数的方法用于比较:class contrast:public randNumberint A;int B;/ 用于记录结果 (几 A 几 B)int n1;int n2;int n3;int n4;/( 用于记录输入的数字 )public:void setNum(int a1,int a2,int a3,int a4)n1=a1;n2=a2;n3=a3;n4=a4;void count()A=0;B=0;/ 每一次都重置 A、Bif(n1=getnum1()A+;if(n2=getnum2()A+;if(n3=getnum3()A+;if(n4=getnum4()A+;/ 统计完全猜中的数
12、字的个数 (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)int getA()return A;int getB()return B;void setA(int a)A=a;class scoreint s1;int s2;int s3;/ 用于
13、记录前三名积分public:int getS1()return s1;int getS2()return s2;int getS3()return s3;/ 用于获取积分的方法void setS1(int b1) s1=b1;void setS2(int b2) s2=b2;void setS3(int b3) s3=b3;/ 用于最后修改积分排名score()s1=0;s2=0;s3=0;FILE *fp;fp=fopen(score.txt,r);/ 打开文件 if(!fp)cout当前暂无积分排名 endl;elsecout积分排行榜: endl; fscanf(fp,%d,&s1);s
14、1s2s3cout第一名: s1endl;/ 读取第一个数字存入变量 fscanf(fp,%d,&s2);cout第二名: s2endl;/ 读取第二个数字存入变量 fscanf(fp,%d,&s3);cout第三名: s3endl;/ 读取第三个数字存入变量 coutendl;fclose(fp); 主函数: void main()score score;/从文件读取并输出上次成绩contrast number;int s=0;/用于统计总分donumber.randNum(); int n1,n2,n3,n4;int k=9;/ 用于统计剩余次数docout请输入您所猜的四位数字 endl
15、; scanf(%1d%1d%1d%1d,&n1,&n2,&n3,&n4);/ 输入数字 while(n1=n2|n1=n3|n1=n4|n2=n3|n2=n4|n3=n4)/ 当 输 入 的 数 字 中含有相同的数字cout请重新输入正确格式的数字 endl;scanf(%1d%1d%1d%1d,&n1,&n2,&n3,&n4);/ 若输入格式错误重新 输入number.setNum(n1,n2,n3,n4);number.count();coutendl;coutnumber.getA()Anumber.getB()Bendl;/ 输出结果 ( 几 A 几 B)k-;/ 剩余次数减 1if
16、(number.getA()=4)cout你猜对了 endl;cout你的本轮得分为(20+10*k)分endl;统计本轮得分 s+=(20+10*k);/ 统计总分cout你的总分为s分nendl;统计总分char yn;cout请输入 Y(继续)或N(退出)yn;if(yn=N|yn=n)number.setA(-1); while(yn!=Y&yn!=y&yn!=N&yn!=n);/ 当输入格式正确时退 出循环if(number.getA()!=4&number.getA()!=-1)cout你还有 k次机会 endl;coutendl;while(number.getA()!=4&k!
17、=0&number.getA()!=-1);/ 次数用完或者猜对时 选择 N 退出循环if(number.getA()!=4&number.getA()!=-1)cout机会用完了,游戏结束 endl;数字为cout 正 确 的number.getnum1()number.getnum2()number.getnum3()number.getnum4()end l;cout你的本轮得分为 0分e ndl;while(number.getA()=4);/ 当猜对时循环结束coute ndl;cout你的最终得分为s分score.getS3()&sscore.getS2()&sscore.getS
18、1()score.setS3(score.getS2();score.setS2(score.getS1();score.setS1(s);/当成绩大于第一名时修改第一、二、三名成绩if (sscore.getS3()cout你破记录了 !你的成绩将写入新记录中 endl;FILE *stream;stream = fopen( score.txt, w);fprintf( stream, %d %d %d,score.getS1(),score.getS2(),score.getS3(); 将成绩写入文件(4)游戏开始之前会产生一个随机的 4位数字,然后会让玩家输入自己猜 的数字,在猜的数字
19、为有重复的4位数或者不为4位数时会提示输入 数字错误并返回重新输入。比如输入错误格式的数字后(数字中有两个 1,位数重复)结果提示重新输入正确格式的数字5. 分析与讨论程序提供了一个猜数字的游戏,程序解决了产生随机数,判断猜中数字的位 数、计算积分,保存成绩的问题。但是在产生随机数的方面处理不够完善,随机数产生耗时过长。在进行此程序设计的过程中,发现我们还有很多方面不会,必须一边查书一 边进行设计,其中文件读取和写入功能还用到了XX, 下次进行设计时会拓展自 己的知识。6. 结束语进行此课程设计,让我们发现自己很多的不足, 也在设计的过程中进行查询, 得到很多以前不会的知识, 并且发现团队合作的重要性, 只有团队更好地合作才 能写出更好,更精简的代码。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1