《数据结构》课程设计报告new.docx
《《数据结构》课程设计报告new.docx》由会员分享,可在线阅读,更多相关《《数据结构》课程设计报告new.docx(25页珍藏版)》请在冰点文库上搜索。
《数据结构》课程设计报告new
南京晓庄学院信息技术学院
《数据结构》课程设计报告
题目:
猜数字游戏
班级:
2007级计算机2班
学号:
07413207姓名:
李松松
摘要
猜数字游戏是一个运行在Windows平台下的小型游戏软件,依据猜数字游戏的基本规则,给用户进行成绩排行,在排行榜中排出前五名玩家的游戏记录,并可以随着玩家的游戏记录进行更新。
关键字:
游戏、猜数字、C语言
1.设计目的
猜数字游戏软件的总体目标是按照特定游戏规则为用户提供一个方便友好的游戏界面,同时给用户提供排行榜的功能使用户能够按照特定的目标提高自己的成绩,并且提供相应的帮助功能。
2.设计任务
该软件在Windows系统上为玩家提供猜数字游戏的基本功能,游戏用户可以选择开始游、排行榜查看、帮助等主要功能。
当用户选择开始游戏时,系统会提示用户排行榜上猜数字成绩的最好记录,并让用户逐次猜数字,用户每次猜数字后系统会给出本次猜数字的结果提示,如位置和数字都正确的数字个数、数字正确介位置不正确的数字个数。
如果用户猜数字的次数超过10次,则提示用户游戏失败,如果在10次之内猜出4个数字和正确的顺序,则提示用户猜数字成功,并到排行榜中进行比较,如果排名在前一名,则计入排行榜中,以便其他用户查看。
在排行榜查看功能中,用户可以查看当前的游戏排行,排行榜中总共显示5名玩家的排行,如有新的记录产生,则插入到排行榜中,并把排行榜中位次最末的记录挤出排行榜。
在帮助模块,用户可以查看游戏规则,当熟悉规则后可以退出帮助模块
3.总体设计
4.详细设计
1、游戏区模块
该模块为玩家提供猜数字游戏的主休功能,由系统自动产生4个随机排列的整数,并给用户10次机会猜测数字的数值和排列顺序。
如果用户在10次之内没有猜出正确的结果,则提示用户游戏失败,否则提示用户猜数字成功,并调用产生新记录模块对玩家游戏成绩进行处理。
(因精力有限且只能用画图来画个框架,所以就不再有图了)
①产生原始数字:
由系统产生4个随机数,并按任意顺序排列,作为游戏的原始数字供玩家进行猜数字游戏。
②游提示:
提示用户数值和位置全对的数字个数,和只有数值但位置不对的数字个数。
③原始数字显示:
当用户在10次之内仍未能猜出原始数字和顺序时,系统提示玩家失败,并给玩家显示出原始数字和顺序。
2、排行榜模块
该模块为玩家提供排行榜的浏览和清除功能,包括按玩家成绩顺序浏览、按玩家姓名浏览和清除排行榜3个子功能。
①按玩家成绩顺序浏览子功能中,将玩家的姓名、游戏成绩按猜数字次数从少到多的顺序列表显示,即将玩家记录从高到底显示。
②按玩家姓名浏览的子功能中,为了玩家便于查找到自己的游戏成绩,将玩家的姓名和猜数字次数记录按照玩家姓名的字母顺序列表显示。
③清除排行榜:
当用户选择清除排行榜功能时,系统会将所有玩家的历史游戏记录和玩家姓名一起从排行榜中清除,在排行榜中只留下默认的游戏记录和默认的玩家姓名,即系统默认玩家姓名player和系统默认记录10次。
3、产生新记录模块
该模块的功能是当玩家成功完成游戏时,判断用户可否进入排行榜,如果可以进入,则刷新排行榜中的记录,将当前玩家的游戏记录写入排行榜,并将排行榜目前结果显示给用户。
4、读取最好记录模块
读取最好记录模块的主要功能是当用户选择游戏开始选项时,首先提示用户目前排行榜中的最游戏记,如果目前没有排行的玩家记录,则初始化排行榜,给出系统默认的玩家姓名和默认的游戏记录。
如果目前排行榜中有玩家记录,则判断出最好记录显示给用户。
5、帮助模块
帮助模块提供的功能是当玩家选项为帮助功能对应的选项数字时,进入帮助模块,给出用户猜数字的游戏规则和游戏中相关提示的含义。
5.开发过程与调试
在写程序中的随机取数是发现如果只用a=rand()%9000+1000来取一个四位数,好像每次取的数的第一位都是1,后来从网上看到srand((unsigned)time(NULL))这个函数,他是利用时间函数time来获取当前的系统时间,它的返回值为从00:
00:
00GMT,January1,1970到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型再传给srand函数,这样可以增加随机种子的随机性。
关于记录成绩,用到了文件函数详细见下面:
fopen(打开文件)
相关函数
open,fclose
表头文件
#include
定义函数
FILE*fopen(constchar*path,constchar*mode);
函数说明
参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
mode有下列几种形态字符串:
r打开只读文件,该文件必须存在。
r+打开可读写的文件,该文件必须存在。
w打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。
若文件不存在则建立该文件。
w+打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。
若文件不存在则建立该文件。
a以附加的方式打开只写文件。
若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
a+以附加方式打开可读写的文件。
若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。
size_tfread(void*Buffer,size_tSize,size_tCount,FILE*Stream);
Size:
每个要读取的元素的大小,单位字节----第二个参数
Count:
要读取的元素个数------------------第三个参数
函数的返回值是实际读出元素的个数。
例如:
fwrite(rec,sizeof(record),MAX,fp),rec为存放读取进来的数据空间,sizeof(record)为读取字符的大小,max为读取记录的个数,fp为打开的文件指针。
6、实验感想
经过一段时间的上机实践学习,我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对C语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。
通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己更好地学好计算机。
参考文献
[1]严蔚敏,吴伟明.《数据结构》(C语言版),清华大学出版社,1994
源程序清单
#include
#include
#include
#include
#include
#defineMAX5
structrecord
{
charname[10];
intsorce;
}rec[MAX],Rec;
intn;//记录行数
intnum;//输入的数字
voiddisplay();//开始界面
voidxuanze();//选择函数
voidsys(inta);//操作函数
voidnewgame();//新游戏
voidvdisplay();//浏览记录界面
voidvxuanze();//浏览选择函数
voidhelp();//帮助说明
voidvsys(inta);//浏览操作函数
voidviewsorce();//按记录的顺序浏览
voidviewname();//按记录的姓名浏览
voidviewsname();//按记录和姓名浏览
voiddelrec();//删除记录
intqushu();//取数函数
inttishi(intaa);//提示函数
voidaddrec(inta);//判断并且增加记录
voidrecread();//读取记录文件
voidrecwrite();//写入记录文件
///////////////////////////////////////////////////////////////////////////////////////////////
////////////////////函数定义//////////////
voiddisplay()//开始界面
{
system("cls");//清屏
printf("============================================\n");
printf("================数字竞猜游戏================\n");
printf("============================================\n");
printf("\n");
printf("1:
新游戏\n");
printf("\n");
printf("2:
浏览记录\n");
printf("\n");
printf("3:
帮助说明\n");
printf("\n");
printf("4:
清除记录\n");
printf("\n");
printf("5:
退出\n");
printf("\n");
printf("============================================\n");
xuanze();
}
voidxuanze()//选择函数
{
inta;
printf("请输入你所选择的操作数:
\n");
scanf("%d",&a);
if(a==1||a==2||a==3||a==4||a==5)
{
sys(a);
}//选择相应的操作数执行函数
else
{
printf("错误的操作数!
\n");;
printf("\n");
printf("请按任意键继续...\n");
getchar();
getchar();
display();
}
}
voidsys(inta)//操作函数
{
switch(a)
{
case1:
newgame();break;
case2:
vdisplay();break;
case3:
help();break;
case4:
delrec();break;
case5:
exit(0);break;//退出
}
}
voidnewgame()//新游戏
{
recread();
system("cls");//清屏
intsnum;//输入的数字
intsn=10;//机会次数
num=qushu();//取数
L:
system("cls");//清屏
printf("============================================\n");
printf("================数字竞猜游戏================\n");
printf("============================================\n");
printf("\n");
printf("%d\n",num);
printf("1:
显示答案\n");
printf("============================================\n");
printf("\n");
printf("请输入你猜想的四个数字(格式为9999样式)你还有%d次机会:
\n",sn);
scanf("%d",&snum);
if(snum<10000&&snum>1000||snum==1)
{
if(snum==1)
{
printf("你放弃了本局游戏!
该四个数字是:
%d\n",num);
printf("\n");
printf("请按任意键继续...\n");
getchar();
getchar();
display();
}
else
{
intflag=tishi(snum);
if(flag!
=0&&sn!
=0)
{
sn--;
if(sn==0)
{
printf("真是遗憾!
十次机会没有了!
没有关系!
下次继续!
\n");
printf("\n");
printf("请按任意键继续...\n");
getchar();
getchar();
display();
}
printf("请按任意键继续猜...\n");
getchar();
getchar();
gotoL;
}
else
{
if(sn!
=0)addrec(sn);//判断并怎加记录
else
{
printf("请按任意键继续...\n");
getchar();
getchar();
display();
}
}
}
}
else
{
printf("错误的操作数!
\n");;
printf("\n");
printf("请按任意键继续...\n");
getchar();
getchar();
gotoL;
}
}
voidhelp()//帮助说明
{
system("cls");//清屏
printf("============================================\n");
printf("==============数字竞猜游戏帮助==============\n");
printf("============================================\n");
printf("\n");
printf("1.新游戏中,你可以输入四位数,来竞猜系统自动生成的四个数字!
只有十次的机会,\n");
printf("每次机会都有相对应的提示,十次的机会利用完了还没有猜对的话就算失败!
四个数字的\n");
printf("相应格式在游戏中会有提示!
当成功猜出系统给定的数字时候,就会统计你的成绩.当你的\n");
printf("成绩比记录文件中的记录好的时候就会提示你是否把记录记录到记录文件中,当你选择是\n");
printf("的时候就会接着提示你输入你的名字.再按回车.没有意外就会提示保存成功!
\n");
printf("还有要说明的是记录中的分数是越低就代表成绩越好!
\n");
printf("2.浏览记录有三种方式!
第一种只是列出记录中的姓名;第二种是列出记录中的成绩次序\n");
printf("第三种是姓名跟成绩一起列出来!
\n");
printf("3.清除记录就是把记录文件初始化.即是让记录文件为空!
\n");
printf("\n");
printf("请按任意键继续...\n");
getchar();
getchar();
display();
}
voidvdisplay()//浏览记录界面
{
system("cls");//清屏
printf("============================================\n");
printf("================数字竞猜游戏================\n");
printf("============================================\n");
printf("\n");
printf("1:
按记录的顺序浏览\n");
printf("\n");
printf("2:
按记录的姓名浏览\n");
printf("\n");
printf("3:
姓名记录全部浏览\n");
printf("\n");
printf("4:
返回上级\n");
printf("\n");
printf("============================================\n");
vxuanze();
}
voidvxuanze()//浏览选择函数
{
inta;
printf("请输入你所选择的操作数:
\n");
scanf("%d",&a);
if(a==1||a==2||a==3||a==4)
{
vsys(a);
}//选择相应的操作数执行函数
else
{
printf("错误的操作数!
\n");;
printf("\n");
printf("请按任意键继续...\n");
getchar();
getchar();
vdisplay();
}
}
voidvsys(inta)//浏览操作函数
{
switch(a)
{
case1:
viewsorce();break;//记录顺序
case2:
viewname();break;//记录姓名
case3:
viewsname();break;//记录全部
case4:
display();break;//返回上级
}
}
voidviewname()//按记录的顺序浏览
{
recread();
system("cls");//清屏
printf("\n");
printf("记录列表显示如下:
\n");
printf("\n");
for(inti=0;i{
if(rec[i].sorce==0)printf("<---空记录--->\n");
else
printf("第%d名:
姓名:
%s\n",i+1,rec[i].name);
}
printf("\n");
printf("请按任意键继续...\n");
getchar();
getchar();
vdisplay();
}
voidviewsorce()//按记录的姓名浏览
{
recread();
system("cls");//清屏
printf("\n");
printf("记录列表显示如下:
\n");
printf("\n");
for(inti=0;i{
if(rec[i].sorce==0)printf("<---空记录--->\n");
else
printf("第%d名:
分数%d\n",i+1,rec[i].sorce);
}
printf("\n");
printf("请按任意键继续...\n");
getchar();
getchar();
vdisplay();
}
voidviewsname()//按姓名和记录浏览
{
recread();
system("cls");//清屏
printf("\n");
printf("记录列表显示如下:
\n");
printf("\n");
for(inti=0;i{
if(rec[i].sorce==0)printf("<---空记录--->\n");
else
printf("第%d名:
姓名:
%s分数%d\n",i+1,rec[i].name,rec[i].sorce);
}
printf("\n");
printf("请按任意键继续...\n");
getchar();
getchar();
vdisplay();
}
voiddelrec()//删除记录
{
recread();
for(inti=0;i{
rec[i].sorce=0;
}
recwrite();
printf("删除成功!
\n");
printf("\n");
printf("请按任意键继续...\n");
getchar();
getchar();
display();
}
intqushu()
//取数函数
{
inta=0;
srand((unsigned)time(NULL));//随机数种子设置
a=rand()%9000+1000;
return(a);
}
inttishi(intaa)//提示函数
{
inta,b,c,d;
intaf,bf,cf,df;
if(aa==num)
{
printf("恭喜!
你猜对了!
四个数就是:
%d\n",num);
return(0);
}
else
{
a=(num-num%1000)/1000;
b=(num%1000-(num%1000)%100)/100;
c=((num%1000)%100-((num%1000)%100)%10)/10;//获取默认四个数字
d=((num%1000)%100)%10;
af=(aa-aa%1000)/1000;
bf=(aa%1000-(aa%1000)%100)/100;
cf=((aa%1000)%100-((aa%1000)%100)%10)/10;//获取输入的四个数字
df=((aa%1000)%100)%10;
if(af>a)printf("\n第一个数应该比%d小一点!
\n",af);
if(af==a)printf("恭喜!
第一个数字对了!
应该是:
%d\n",af);//数字比较
if(af\n",af);
if(bf>b)printf("第二个数应该比%d小一点!
\n",bf);
if(bf==b)printf("恭喜!
第二个数字对了!
就是:
%d\n",bf);//数字比较
if(bf
\n",bf);
if(cf>c)printf("第三个数应该比%d小一点!
\n",cf);
if(cf==c)printf("恭喜!
第三个数字对了!
就是:
%d\n",cf);//数字比较
if(cf\n",cf);
if(df>d)printf("第四