猜数游戏课程设计报告.docx
《猜数游戏课程设计报告.docx》由会员分享,可在线阅读,更多相关《猜数游戏课程设计报告.docx(45页珍藏版)》请在冰豆网上搜索。
![猜数游戏课程设计报告.docx](https://file1.bdocx.com/fileroot1/2022-11/17/2a809c46-b959-4241-a615-8f1ed661987f/2a809c46-b959-4241-a615-8f1ed661987f1.gif)
猜数游戏课程设计报告
课程设计(论文)任务书
一、课程设计(论文)题目 猜数游戏
二、课程设计(论文)工作自2008年12月22日起至2009年1月2日止。
三、课程设计(论文)地点:
多媒体实验室
四、课程设计(论文)内容要求:
1.本课程设计的目的
(1)熟练掌握C++语言的基本知识和技能;
(2)基本掌握面向对象程序设计的基本思路和方法;
(3)利用所学的基本知识和技能,解决简单的面向对象程序设计问题;
(4)提高学生的科技论文写作能力。
2.课程设计的任务及要求
1)基本要求:
(1)课程设计前必须根据课程设计题目认真准备实验源程序及调试时所需的数据;
(2)要求采用简明、严格的问题描述,设计求解算法;
(3)数据结构选用得当,程序结构合理;
(4)程序简明易懂,多运用输出提示,程序运行正确;
(5)对设计进行总结和讨论。
2)课程设计论文编写要求
(1)要按照书稿的规格打印撰写课设论文
(2)论文包括中文摘要、目录、绪论、正文、总结和体会、参考文献、附录等
(3)正文中要有问题描述、设计求解算法、算法的实现、调试分析(调试时出现
的主要问题:
编译语法错误及修改,重点是运行逻辑问题修改和调整)
(4)课设论文装订按学校的统一要求完成
3)课设考核:
从以下几方面来考查:
(1)出勤情况;
(2)设计任务的难易程度及饱满程度;
(3)课设任务完成情况;
(4)动手调试能力;
(5)论文撰写的原理分析、设计思路以及论述的层次性、条理性、格式的规范性。
4)参考文献:
[1]吕鳯翥.C++.清华大学出版社.
[2]http:
//www.bc-
[3
[4]C++编程思想PrenticeHill(美)BruceEckel[同作者作品]
5)课程设计进度安排
内容天数 地点
构思及收集资料2 图书馆
程序设计与调试5 计算机房
撰写论文3 图书馆
6)选择课程设计题目具体要求:
猜数字游戏
1、任务描述
用户从键盘输入4位不重复的数,来匹配计算机给出的4位随机数,若数字和位数均等同,表示用户赢了。
每猜一次,计算机均给出提示信息(x,y),x表示数字、位置都匹配的个数,y表示数字匹配但位置不匹配的个数。
2、要求
(1)设计友好的中文交互界面。
(2)按H键,可得到更详细的帮助信息,如:
第一位数字正确,第2,3位数字位置不对等。
(3)按K键 后,可以查看计算机所给出的4位数,但查看前需要输入密码,密码自定。
(4)猜的结果以分值的形式给出,每猜错一次扣10分,若猜对1个数,奖励50分。
(5)每次游戏结束后将分值存盘,文件名自定。
学生签名:
2008年12月22日
课程设计(论文)评审意见
(1)任务难易及完成情况:
优( )、良( )、中( )、一般( )、差( );
(2)调试能力评价 :
优( )、良( )、中( )、一般( )、差( );
(3)论文撰写水平评价 :
优( )、良( )、中( )、一般( )、差( );
(4)论文格式规范性评价:
优( )、良( )、中( )、一般( )、差( );
(5)考勤:
优( )、良( )、中( )、一般( )、差( );
摘要
为了到达友好交互界面的设计要求,设计了四个Menu()函数,提供友好界面解决方案。
在所有函数设计中也都融入了友好交互的思想,会提示要求玩家输入的信息。
除了开始满足基本的游戏要求之外,为了解决输入K,H时可以提供答案和进一步的帮助,特意定义了Key()和MoreHelp(a[],c[])两个函数。
Key()提供了解决密码的读取比较和返回的解决方案,为程序的后步执行提供了依据;MoreHelp()用来比较给出的随机数(即答案)与玩家所猜的数,并根据比较结果给出进一步的帮助信息。
除此之外,还提供了SetKey()函数为用户更改密码提供了途径;Win(na[],j)函数为每次游戏结束记录玩家信息并存盘提供解决方案。
Clear()函数用于将原有记录清除,并且写入初始数据。
Hero()函数会将存盘数据取出,并按高分的顺序显示出玩家信息.
Guess()函数提供交互式界面,为玩家选择功能提供方便。
这些函数大都将被Start()调用来完成必要的功能。
而且为了满足重新输入或退出界面的要求,本程序大量使用了转向语句goto。
绪论
为方便阅读本报告,将报告分六章,包括流程图,模块分析,调试过程,运行结果,心得体会及附录。
在第一章流程图中,将给大家一个对本程序的初步整体的了解,包括有那些函数并对其作用有感性的认识;
在第二章模块分析中,将会详细的介绍每一个函数的编程思想,实现过程甚至详尽到没一个变量的作用;
在第三章调试过程一章中,将会介绍我在编程中遇到的问题,还有解决的方法,为以后的实践打下基础;
在第四章运行结果中,将一起检验程序是否符合要求及使用的方法。
在第五章心得体会中,将介绍我在课程设计过程中的所得与感想;
附录中将附上参考文献及完整的源代码,在模块分析中虽然有部分代码,但是多数有省略,故附上完整代码方便读者对照。
希望在阅读完本报告以后能对本程序有更加深入的了解,并且也希望您能对本程序提出修改的意见,让程序更加的完善。
第一章流程图
main()
Guess()
若无pai.dat,创建一个pai.dat
Menu1()
123456
Hero()
Menu2()
Clear()
SetKey()
exit(0)
Start()
导入数据,显示排行榜
Menu3
Menu4
将原pai.dat文件中的数据用“****”与“0”代替,重写数据
修改code.dat文件内容前,调用Key()判断是否有权限更密码
Key()(()
Guess()
K
H
输入任意整数
Key()
MoreHelp()
直接给出答案
完成游戏
Win(cahrna,intj)
与pai.dat文件内数据比较,排序后存入pai.dat文件中
第二章模块分析
1.引入的头文件
#include//使用了time()函数,调用系统时间作为种子产生随机数
#include//getch()
#include//Sleep()
#include//strcpy(),strcmp()
#include
#include
说明:
引入time.h,使用到time()函数;用time()获得系统时间,为srond()产生随机数提供种子。
若不提供种子的话,在需要产生随机数的数的时候,每次产生的数抖相同,不符合设计要求。
引入conio.h,使用到其中的getch()函数,用于接收玩家输入的字符或在需要时暂停程序的执行。
引入windows.h,使用到其中的Sleep(),用于让程序执行时延迟,本来用的是用空的for循环语句来实现延迟效果,但是违背了程序要高效性的原则,故引入该头文件。
引入string,使用到其中包含的strcpy()字符串拷贝函数与strcmp()字符串比较函数。
引入iostream,使用了标准输入输出流如cin,cout,endl等。
引入fstream,使用到其中定义的两个类ifstream与ofstream,分别用与创建输入流对象与输出流对象,实现对磁盘文件的读取与数据的存盘。
2.定义的结构体
本程序中仅定义了一个结构类型,即player。
其中包含两个成员变量charname[20]与intgoa;分别对应玩家的姓名与游戏得分.
structplayer
{
charname[20];
intgoal;
}play[7];
在定义的同时,创建程序级的结构类型数组play[7],这样做的话每次需显示或使用到玩家信息时都是最新的。
3.函数分析
(0)intKey()
设计思路:
提供判断密码比较的功能,并在密码匹配时返回1,不匹配时返回0,要求是玩家输入的密码与磁盘文件中储存的密码比较,然后返回1或0,为程序后步执行提供依据。
实现的方法是:
定义一个输入流并打开密码文件code.dat,in(“code.dat”);将文件中数据导入字符数组key[16]中,并与玩家输入并储存在code[16]中的内容通过strcmp(char*,char*)比较并判断内容是否一致。
具体实现:
intKey()//判断密码是否与文件中保存的密码一致,一致则返回1,否则返回2
{
inti=-1;//控制字符位置
charcode[16];//用于接收玩家从键盘输入的密码
charkey[16];//用于接收从code.dat中读取的密码
cout<<"\n请输入密码:
";
while
(1)
{
code[++i]=getch();
if(code[i]=='\r')
{
code[i]='\0';//若回车,则插入结束符,并退出循环
break;
}
cout<<"*";
}
ifstreamin("code.dat");
in>>key;//取出code.dat文件中存的密码
cout<if(!
strcmp(key,code))//strcmp()字符串比较函数,相同返回0,不同返回1,比较key与code是否相等~~
return1;//注意(code==key)不能判断code是否与key相同,因为比较的是地址
else
return0;
}
(1)voidSetKey()
设计思路:
提供密码设置功能,但是修改密码之前必须先输入就密码,输入正确之后才能设置新的密码.首先调用Key(),利用其返回值作为依据判断是允许修改密码还是不允许.若密码正确,则可以修改密码,修改后的密码需要重新巨鹿到磁盘文件code.dat中,这样就需要定义一个输出流对象同时打开文code.dat,ofstreamout(“code.dat”),而后将新密码导入code.dat中储存起来.
具体实现:
voidSetKey()//修改密码
{
charcode1[16],code2[16],s;
cout<<"确定修改密码?
(y/n):
";
cin>>s;
if(s=='y')
{
if(Key())
{
loop:
cout<<"\n请输入新密码:
";
inti=-1;
while
(1)
{
code1[++i]=getch();
if(code1[i]=='\r')
{
code1[i]='\0';
break;
}
cout<<"*";
}
cout<i=-1;
cout<<"\n请再次输入密码:
";
while
(1)
{
……………………
}
cout<if(strcmp(code1,code2))
{
cout<<"两次输入的密码不一致,";
cout<<"是否继续修改密码y/n:
";
cin>>s;
if(s=='y')
gotoloop;
else