猜单词游戏程序设计报告.docx
《猜单词游戏程序设计报告.docx》由会员分享,可在线阅读,更多相关《猜单词游戏程序设计报告.docx(22页珍藏版)》请在冰豆网上搜索。
猜单词游戏程序设计报告
程序设计报告
题目:
猜单词游戏
专业
学生姓名
班级学号
指导教师徐小龙
指导单位
日期
南京邮电大学
程序设计
指导教师成绩评定表
题 目
学生姓名
班级学号
专业
评分内容
评分标准
优秀
良好
中等
差
平时成绩
认真对待课程设计,遵守实验室规定,上机不迟到早退,不做和设计无关的事。
设计成果
设计的科学、合理性
功能丰富、符合设题目要求
界面友好、外观漂亮、大方
设计的原创性
设计报告
设计报告正确合理、反映系统设计流程
文档内容详实程度
文档格式规范、排版美观
答辩
简练、准确阐述设计内容,能准确有条理回答各种问题,系统演示顺利。
评分等级
□优秀□良好□中等□及格□不及格
指导教师签章
日期
2011-11-5
备注
评分等级有五种:
优秀、良好、中等、及格、不及格
猜单词游戏
一、课题内容和要求
一)课题内容
要求用C或C++模拟猜单词游戏。
游戏包括:
单词管理、玩家纪录、猜词过程、系统设置等必须完成的基本功能以及成绩计算、猜词时间限制、词库管理等选做的扩展功能。
通过该课题全面熟悉数组、字符串、文件的使用,掌握程序设计的基本方法及友好界面的设计。
(二)课题要求
(1)单词管理:
程序中用来做谜题的单词必须存放在磁盘文件中,文件中的单词数不得少于200个。
(2)玩家纪录:
程序要求记录前五名成绩。
成绩指标自行设计,必须包括时间。
记录的时候要求有排名、玩家姓名、成绩三项,并保存在文件中。
在程序开始运行的时候就必须读入,以便随时供玩家查询、及时更新成绩。
(3)猜词过程:
①先请用户输入猜的单词数量,可以有一个默认值。
②随机抽取单词,对每个单词,系统根据谜底单词长度在屏幕上显示相应个数'-',假设谜底单词为"hello",则在屏幕上输出"-----"。
③玩家输入一个字母进行猜测,如果这个字母不在单词中,系统提示玩家不对;如果猜对字母,比如玩家输入了一个'l',则在屏幕上输出"--ll-"。
④重复③,直到玩家在规定的次数内猜出了单词或者超过次数游戏失败。
⑤显示玩家每个单词猜对与猜错次数等统计信息。
如果玩家猜出单词,计算成绩,如进入前五名提示玩家并记录存储到记录文件中。
⑥询问玩家是否开始新一轮猜词,如果玩家选“否”,则系统退到外面的菜单。
(4)系统设置:
猜词次数可以为默认值。
玩的时候,可以对其进行修改。
二、
设置游戏
进行游戏
查看游戏排行榜
游戏
次数
猜单词次数
猜单词游戏
需求分析
功能框架图如右:
1、提供可操作的主菜单:
输出4个菜单,用于显示若干个可选的功能选项。
根据玩家输入的选项来运行不同的功能,运行不同的函数。
2、进行文本信息的载入:
从指定的文件中以一维数组形式加载游戏玩家记录信息这里的文件是在编译时就已经指定好的、存在的文本,需设计者预先自己建立好。
3、设置游戏功能:
以客户输入的猜单词游戏次数和猜的单词数目进行游戏功能的个性化修改。
4、猜词过程:
随机抽取单词,对每个单词,系统根据谜底单词长度在屏幕上显示相应个数'-'。
玩家输入一个字母进行猜测,如果这个字母不在单词中,系统提示玩家不对;如果猜对字母,则替换单词中相应位置的“-”。
直到玩家在规定的次数内猜出了单词或者超过次数游戏失败。
显示玩家每个单词猜对与猜错次数等统计信息。
如果玩家猜出单词,计算成绩,满足进入记录前五名的记录写入到记录文件中覆盖原纪录。
询问玩家是否开始新一轮猜词,如果玩家选“否”,则系统退到外面的菜单。
5、查看更新过的游戏排行榜:
退回主界面选3,打开之前进行游戏时重新写入过的记录文件。
三、概要设计
1、主要结构体/类:
structPlayer
{
charname[20];//玩家姓名
intright;//猜对的字母
intwrong;//猜错的字幕
inttime;//猜单词的时间
};
classByTime
{
private:
clock_tstart;
public:
ByTime()
{
start=clock();//开始计时
}
~ByTime(){};//析构函数
voidEndtime()
{
clock_tend;
end=clock();//结束计时
times=(end-start)/CLOCKS_PER_SEC;//计算时间
cout<<"共用时:
"<}
};
2、主要函数:
(1)文件打开函数voidOpenWordFile(charstring[200][12]):
设计思想一致,用于打开单独储存的单词库及游戏记录txt文件。
(2)设置函数voidset(),voidSetgame:
用于设置游戏中猜单词的次数与数目。
(3)“玩游戏”函数:
voidPlayGame(charwordlist[200][12]):
用于对玩家输入的字母进行处理与判断
(4)“开始游戏”函数voidStartGame(charwordlist[200][12]):
将OpenWordFile(str);Change(wordlist,str);PlayGame(wordlist)等函数统一调用
(5)记录显示函数voidShow():
用于将写入过新纪录的文件显示到屏幕上。
(6)记录读入函数voidRecord():
将最新的游戏成绩记录通过文件读写,从内存中保存到原文本文件中
四、源程序代码
#include
#include
#include
#include
#include
#include
#include
voidOpenWordFile(charstring[21][11]);
voidPlayGame(charwordlist[21][11]);
voidChange(charwordlist[21][11],charstr[21][11]);
voidStartGame(charwordlist[21][11]);
intguesstime=10;
intround;
voidSet()
{
printf("请输入您想猜的单词数:
");
scanf("%d",&round);
}
structPlayer
{
charname[20];
intright;
intwrong;
inttime;
};
typedefstructPlayerPlayer;
Playerp[5]={{1,"unknown",0,0,0},{2,"unknown",0,0,0},{3,"unknown",0,0,0},{4,"unknown",0,0,0},{5,"unknown",0,0,0}};
Playertemp;
intright=0,wrong=0;
voidOpenWordFile(charstring[21][11])
{
FILE*fp;
charc;
inti=0;
intj=0;
if((fp=fopen("word.txt","r"))==NULL)//读文件
{
printf("单词库无法打开!
\n");
exit(0);
}
else
{
c=fgetc(fp);
while(c!
=EOF)
{
if(c!
='\n')
{
string[i][j]=c;
j++;
}
else
{
i++;
j=0;
}
c=fgetc(fp);
}
}
}
voidSetGame()
{
printf("请输入你想猜的次数:
");
scanf("%d",&guesstime);
}
voidPlayGame(charwordlist[21][11])
{
charguess;//存用户打入的字母
charguessword[11];//存用户打入的词
intl,j,k,f;
intp=1,q=0,x=0,y=0;
charWrongGuess[11];
intt=0;
intflag=0;
intc=1;//用来查看是否猜对所有字母
srand(time(NULL));
q=rand()%21;
l=strlen(wordlist[q]);//求单词长
for(f=0;f{
guessword[f]='-';
}
guessword[l]='\0';//字符串结尾
printf("%s",guessword);//打印与词长相同的"-"
for(k=1;k<=guesstime&&c!
=0;)//判断是否猜完
{
flag=0;
printf("你还有%d次机会!
\n",guesstime-k+1);
scanf("%c",&guess);
for(j=0;j{
if(guessword[j]=='-')//判断是否猜过这个字母
{
if(wordlist[q][j]==guess||wordlist[q][j]-guess==32)//如果单词中有这个字母
{
guessword[j]=wordlist[q][j];//在空单词中打入这个字母
x++;
flag=1;
}
}
elseif(guessword[j]==guess||guessword[j]-guess==32)//如果猜过这个字母则提示(仅提示猜过的正确的字母)
{
printf("你已经输入过这个字母了。
\n");
break;
}
}
if(flag==0)//如果单词中没有这个字母
{
WrongGuess[t]=guess;
t++;//在空单词中打入'-'
}
printf("%s",guessword);
if(x>y)
y=x;
else
k++;
c=strcmp(guessword,wordlist[q]);
}
if(c==0){
printf("\nHowsmartyouare!
你成功猜出了这个单词!
\n正确单词就是:
%s",wordlist[q]);
right++;
}
if(c!
=0)
{
printf("\nSorry...壮志未酬生先死!
!
!
!
...\n正确答案是:
%s",wordlist[q]);
wrong++;
}
printf("你猜对了%d个字母,猜错了%d个字母。
\n",x,k-1);
WrongGuess[t]='\0';
printf("错误字母分别是%s\n",WrongGuess);
}
voidChange(charwordlist[21][11],charstr[21][11])
{
inti,j;
for(i=0;i<21;i++)
{
for(j=0;j<11;j++)
{
wordlist[i][j]=str[i][j];
}
}
}
voidInput()
{
printf("您尊姓大名:
");
scanf("%s",temp.name);
}
voidResult()
{
temp.right=right;
temp.wrong=wrong;
}
voidCompare()
{
inti,j,k;
for(i=0;i<6;i++)
{
if(temp.right>p[i].right)
{
for(j=5;j>i;j--)
{
for(k=0;k<20;k++)
{
p[j].name[k]=p[j-1].name[k];
}
p[j].right=p[j-1].right;
p[j].wrong=p[j-1].wrong;
p[j].time=p[j-1].time;
}
for(k=0;k<20;k++){
p[i].name[k]=temp.name[k];
}
p[i].right=temp.right;
p[i].wrong=temp.wrong;
p[i].time=temp.time;
break;
}
}
}
voidRecord()
{
inti;
FILE*fp;
fp=fopen("record.txt","r+");
if(!
fp)
{
printf("游戏记录无法打开!
");
exit
(1);
}
fprintf(fp,"名次\t姓名\t\t成绩:
猜对or猜错)\t时间(s)\n");
for(i=0;i<5;i++)
{
fprintf(fp,"%d\t%s\t\tRight:
%dWrong:
%d\t%d\n",i+1,p[i].name,p[i].right,p[i].wrong,p[i].time);
}
fclose(fp);
}
voidShow()
{
inti;
FILE*fp;
fp=fopen("record.txt","r");
if(!
fp)
{
printf("游戏记录无法打开!
\n");
exit
(1);
}
fprintf(stdout,"名次\t姓名\t\t成绩(猜对猜错)\t时间(s)\n");
for(i=0;i<5;i++)
{
fprintf(stdout,"%d\t%s\t\tRight:
%dWrong:
%d\t%d\n",i+1,p[i].name,p[i].right,p[i].wrong,p[i].time);
}
fclose(fp);
}
voidStartGame(charwordlist[21][11])
{intt1,t2,t;
intp=1;
t1=time(NULL);
while(p)
{
inti;
charplay;
for(i=0;i{
charstr[21][11]={0};
printf("--------------高手过招---------------\n请输入你要猜的字母,每次一个!
\n");
OpenWordFile(str);
Change(wordlist,str);
PlayGame(wordlist);
}
t2=time(NULL);
t=t2-t1;
temp.time=t;
temp.right=right;
temp.wrong=wrong;
Compare();
Record();
printf("是否再玩一次?
(Y/N)\n");
scanf("%c",&play);
if(play!
='n')
continue;
else
break;
printf("\n");
}
}
voidMenu();
voidmain()
{
intp=1;
while(p)//使得猜完单词或查看完排行榜后返回主菜单
{
Menu();
Record();
}
}
voidMenu()
{intchoice;
charwordlist[21][11];
system("title猜字母游戏---Asmallgametoguessacertainword");
system("colorf2");
printf("\n");
printf("********************猜单词游戏********************\n");
printf("Asmallgametoguessacertainword.GoodLuck!
\n\n");
printf("**************************************\n");
printf(">>>>>>>>>>1.开始游戏<<<<<<<<<<\n");
printf(">>>>>>>>>>2.设置游戏<<<<<<<<<<\n");
printf(">>>>>>>>>>3.成绩排行<<<<<<<<<<\n");
printf(">>>>>>>>>>4.退出游戏<<<<<<<<<<\n");
printf("**************************************\n");
printf("制作人:
B11030506\n\n");
printf("请输入你的选择:
");
scanf("%d",&choice);
while(choice<1||choice>4)
{
printf("Pleasechoice1--4again\n");
scanf("%d",&choice);
}
switch(choice)//选择
{
case1:
Set();
Input();
StartGame(wordlist);//调用游戏函数
break;
case2:
SetGame();//调用设置函数
Set();
Input();
StartGame(wordlist);
break;
case3:
Show();
break;
case4:
exit(0);
}
}
五、测试数据及其结果分析
显示的主菜单界面:
********************猜单词游戏********************
Asmallgametoguessacertainword.GoodLuck!
**************************************
>>>>>>>>>>1.开始游戏<<<<<<<<<<
>>>>>>>>>>2.设置游戏<<<<<<<<<<
>>>>>>>>>>3.成绩排行<<<<<<<<<<
>>>>>>>>>>4.退出游戏<<<<<<<<<<
**************************************
请输入你的选择:
1、查看之前的游戏成绩排行榜;
2、设置游戏;
3、开始猜单词游戏;
4、进行游戏;
5、游戏记录保存;
6、查看游戏结束后更新过的成绩排行榜;
1、查看之前的游戏成绩排行榜:
输入:
3
输出:
名次姓名成绩:
猜对&猜错时间(s)
1unknownRight:
0Wrong:
00
2unknownRight:
0Wrong:
00
3unknownRight:
0Wrong:
00
4unknownRight:
0Wrong:
00
5unknownRight:
0Wrong:
00
2、设置游戏:
输入:
2
输出:
请输入你想猜的次数:
输入:
20
输出:
请输入你想猜的单词数:
输入:
2
输出:
请先输入您的大名:
输入:
Adu
输出:
请输入你要猜的字幕,每次一个,祝你好运哦!
----你还有20次机会!
3、开始猜单词游戏:
4、进行游戏:
输出:
请输入你要猜的字母,每次一个,祝你好运哦!
----你还有20次机会!
输入:
a
输出:
----你还有19次机会
输入:
f
输出:
----你还有18次机会
输入:
l
输出:
--l-你还有18次机会
输入:
r
输出:
--l-你还有17次机会
输入:
h
输出:
h-l-你还有17次机会
输入:
t
输出:
h-l-你还有16次机会
输入:
l
输出:
你已经输入过这个字母了
h-l-你还有15次机会
输入:
p
输出:
h-lp你还有15次机会
输入:
e
help
Howsmartyouare!
你成功猜出了这个单词
正确单词就是:
help你猜对了4个字母,猜错了4个字母。
错误字母分别是:
afrt
共用时:
23秒
是否在玩一次?
(Y/N)
输入:
N
输出:
请输入你的选择:
5、游戏记录保存:
6、查看游戏结束后更新过的成绩排行榜:
输入:
3
输出:
名次姓名成绩:
猜对&猜错时间(s)
1AduRight:
1Wrong:
023
2unknownRight:
0Wrong:
00
3unknownRight:
0Wrong:
00
4unknownRight:
0Wrong:
00
5unknownRight:
0Wrong:
00
7、退出程序:
输出:
请输入你的选择:
输入:
4
输出:
Pressanykeytocontinue
结果分析:
1、当单词库文本和游戏记录文本无法读入时,系统将分别提示:
“”、“游戏记录无法打开!
”
2、在输入菜单选项时如果输入的内容不是1--4之间的数字,而是其他数字,系统将提示“请重新在1—4中选择”;若输入的为其他字符(字母或符号),系统将自动认为操作结束而退出系统。
3、当猜一个单词的次数超过预定次数时(默认为10次),系统将提示:
“Sorry...你已经超过了规定的次数,挑战失败了...正确单词是:
”
4、当一轮游戏结束后,系统提示:
“是否再玩一次?
(Y/N)”,选y,重新开始游戏,选n,返回主菜单。
六、调试过程中的问题
1、文件读入问题:
文件路径编写不正确,会造成读入失败,使得的