资源描述
.\
程序设计报告
( 2011 / 2012 学年 第 二 学期)
题目: 猜单词游戏
专 业 光电信息工程
学 生 姓 名 梅阳阳
班 级 学 号 B11030506
指 导 教 师 李鹏
指 导 单 位 计算机学院
计算机系统与网络教学中心
日 期 2012.06.04-2012.06.13
评 分 细 则
评分项
优秀
良好
中等
差
遵守机房规章制度
上机时的表现
学习态度
程序准备情况
程序设计能力
团队合作精神
课题功能实现情况
算法设计合理性
用户界面设计
报告书写认真程度
内容详实程度
文字表达熟练程度
回答问题准确度
简 短 评 语
教师签名:
2012 年 6 月 20 日
评分等级
备注
评分等级有五种:优秀、良好、中等、及格、不及格
.\
题目1:猜单词
一、 课题内容和要求
要求用C或C++模拟猜单词游戏。游戏包括:单词管理、玩家纪录、猜词过程、系统设置等必须完成的基本功能以及成绩计算、猜词时间限制、词库管理等选做的扩展功能。通过该课题全面熟悉数组、字符串、文件的使用,掌握程序设计的基本方法及友好界面的设计。
二、需求分析
1. 基本要求。
(1) 单词管理:程序中用来做谜题的单词必须存放在磁盘文件中。
(2) 猜词过程:①先请用户输入猜的单词数量,可以有一个默认值。②随机抽取单词,对每个单词,系统根据谜底单词长度在屏幕上显示相应个数-,假设谜底单词为"hello",则在屏幕上输出"-----"。③玩家输入一个字母进行猜测,如果这个字母不在单词中,系统提示玩家不对;如果猜对字母,比如玩家输入了一个l,则在屏幕上输出"--ll-"。④重复③,直到玩家在规定的次数内猜出了单词或者超过次数游戏失败。⑤显示玩家每个单词猜对与猜错次数等统计信息。如果玩家猜出单词,计算成绩,如进入前五名提示玩家并记录存储到记录文件中。⑥询问玩家是否开始新一轮猜词,如果玩家选“否”,则系统退到外面的菜单。
(3) 系统设置:猜词次数可以为默认值。玩的时候,可以对其进行修改。
2. 扩展要求。
(1) 成绩计算:考虑各种情况下所设计的成绩计算方法是否合理。
(2) 玩家纪录:程序要求记录前五名成绩。成绩指标自行设计,必须包括时间。记录的时候要求有排名、玩家姓名、成绩三项,并保存在文件中。在程序开始运行的时候就必须读入,以便随时供玩家查询、及时更新成绩。
三、概要设计
1、主要结构体:
struct Player
{
char name[20]; //玩家姓名
int right;//猜对字母数
int wrong; //猜错字母数
int time;//猜单词的时间
};
2、主要函数:
(1)文件打开函数void OpenWordFile(char string[200][12]):设计思想一致,用于打开单独储存的单词库及游戏记录txt文件。
(2)设置函数void set(),void Setgame:用于设置游戏中猜单词的次数与数目。
(3)“玩游戏”函数:void PlayGame (char wordlist[200][12]):用于对玩家输入的字母进行处理与判断
(4)“开始游戏”函数void StartGame (char wordlist[200][12]):将OpenWordFile (str); Change (wordlist,str);PlayGame(wordlist)等函数统一调用
(5)记录显示函数void Show():用于将写入过新纪录的文件显示到屏幕上。
玩游戏
开始
游戏记录
游戏设置
(6)记录读入函数void Record():将最新的游戏成绩记录通过文件读写,从内存中保存到原文本文件中
游戏操作
是否继续
结束
Y
N
四、详细设计
#include
#include
#include
#include
#include
#include
#include
void OpenWordFile(char string[21][11]);
void PlayGame(char wordlist[21][11]);
void Change(char wordlist[21][11],char str[21][11]);
void StartGame (char wordlist[21][11]);
void Menu();
int guesstime=10;
int round;
void Set()
{
printf("请输入您想猜的单词数:");
scanf("%d",&round);
}
struct Player
{
char name[20];
int right;
int wrong;
int time;
};
typedef struct Player Player;
Player p[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}};
Player temp;
int right=0,wrong=0;
void OpenWordFile (char string[21][11])
{
FILE *fp;
char c;
int i=0;
int j=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);
}
}
}
void SetGame ()
{
printf("请输入你想猜的次数:");
scanf("%d",&guesstime);
}
void PlayGame (char wordlist[21][11])
{
char guess; //存用户打入的字母
char guessword[11]; //存用户打入的词
int l,j,k,f;
int p=1,q=0,x=0,y=0;
char WrongGuess[11];
int t=0;
int flag=0;
int c=1;//用来查看是否猜对所有字母
right=0;
srand(time(NULL));
q=rand()%21;
l=strlen(wordlist[q]); //求单词长
for(f=0;fy)
y=x;
else
k++;
c=strcmp(guessword,wordlist[q]);
}
if(c==0)
{
printf("\nHow smart you are! 你成功猜出了这个单词!\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);
}
void Change (char wordlist[21][11],char str[21][11])
{
int i,j;
for(i=0;i<21;i++)
{
for(j=0;j<11;j++)
{
wordlist[i][j]=str[i][j];
}
}
}
void Input()
{
printf("您尊姓大名:");
scanf("%s",temp.name);
}
void Result()
{
temp.right=right;
temp.wrong=wrong;
}
void Compare()
{
int i,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;
}
}
}
void Record()
{
int i;
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:%d Wrong:%d\t%d\n",i+1,p[i].name,p[i].right,p[i].wrong,p[i].time);
}
fclose(fp);
}
void Show()
{
int i;
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:%d Wrong:%d\t%d\n",i+1,p[i].name,p[i].right,p[i].wrong,p[i].time);
}
fclose(fp);
}
void StartGame (char wordlist[21][11])
{int t1,t2,t;
int p=1;
t1=time(NULL);
while(p)
{
int i;
char play;
for(i=0;i>>>>>>>>> 1. 开始游戏 <<<<<<<<<<\n");
printf(" >>>>>>>>>> 2. 设置游戏 <<<<<<<<<<\n");
printf(" >>>>>>>>>> 3. 成绩排行 <<<<<<<<<<\n");
printf(" >>>>>>>>>> 4. 退出游戏 <<<<<<<<<<\n");
printf(" **************************************\n");
printf(" 制作人: B110305 \n");
printf("\n");
printf("请输入你的选择:");
scanf("%d",&choice);
while(choice<1||choice>4)
{
printf("Please choice 1--4 again\n");
scanf("%d",&choice);
}
switch (choice) //选择
{
case 1:
Set();
Input();
StartGame (wordlist);//调用游戏函数
break;
case 2:
SetGame ();//调用设置函数
Set();
Input();
StartGame (wordlist);
break;
case 3:
Show();
break;
case 4:
exit(0);
}
}
五、测试数据及其结果分析
显示的主菜单界面:
1、查看之前的游戏成绩排行榜;
2、设置游戏;
3、开始猜单词游戏;
4、进行游戏;
5、游戏记录保存;
6、查看游戏结束后更新过的成绩排行榜;
1、查看之前的游戏成绩排行榜:
输入:3
输出:<回车>
2、设置游戏:
输入:2
输出:请输入你想猜的次数:
输入:20
输出:请输入你想猜的单词数:
输入:2
输出:您尊姓大名:
输入:梅阳阳
输出:---------------高手过招----------------
请输入你要猜的字母,每次一个!a
---- 你还有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
你成功猜出了这个单词,算你狠,下次整个难点儿的!
正确单词就是:help 你猜对了4个字母,猜错了4个字母。
错误字母分别是:afrt
共用时:23秒
是否在玩一次?(Y/N)
输入:N
输出:请输入你的选择:
5、游戏记录保存:
6、查看游戏结束后更新过的成绩排行榜:
输入:3
输出:
7、退出程序:
输出:请输入你的选择:
输入:4
输出:Press any key to continue
结果分析:
1、当单词库文本和游戏记录文本无法读入时,系统将分别提示:“单词库无法打开”、“游戏记录无法打开!”
2、在输入菜单选项时如果输入的内容不是1--4之间的数字,而是其他数字,系统将提示“请重新在1—4中选择”。
3、当猜一个单词的次数超过预定次数时(默认为10次),系统将提示:“Sorry... 壮志未酬身先死... 正确单词是:”
4、当一轮游戏结束后,系统提示:“是否再玩一次?(Y/N)”,选y,重新开始游戏,选n,返回主菜单。
六、调试过程中的问题
1.函数的互相调用如果掌握不好调用顺序,就先全部声明,因为程序比较大了。
2.事实证明while(1)在c语言中可用,不用担心死循环,因为可以用break,exit跳出循环。
3.c语言中用以计时的算法有n中,我选择的是最简单适用的,但计时并不很准确,有待改进。
4.目前为止,还没有行到该怎么控制程序运行时间,以时间控制程序的运行和停止,估计还是计时的算法需要更改。
5. 之前看准了一个计时算法(运行一次耗时10ms)感觉计时比较精确就一直相融合到程序里来当计时工具,纠结了两天,以失败告终,很明显,我在运行计时程序会停下来等待。
七、程序设计总结
这是我学习c语言以来遇到的较为“庞大”的程序,324行嘞!很好地锻炼了我的思维(各种循环啊,乖乖)和记忆力(写到后面忘了前面)。接触了很多没学过的头文件windows.h,time.h, fstream.h, conio.h,感觉挺有意思的,激发了我继续学习c语言的兴趣!!
这几天遇到的最头疼的问题就是计时,之前看准了一个计时算法(运行一次10ms)感觉计时比较精确就一直相融合到程序里,纠结了两天,以失败告终,很明显,我在运行计时程序会停下来等,555。最终换了另一个精度较差但比较实用的算法。
从这几天来看,调试能力弱爆了,一来比较麻烦二来操作步骤不熟练,有待提高哇。再不提高以后能力就不够用了。但是我好想形成了一个习惯代替调试,步骤如下:1有错误2注释或更改错误部分使之可以运行3运行看哪里不合要求再改。呵呵,貌似习惯不大好,但是用习惯了也挺顺手。。。。不过,调试必须熟练,得为以后打算啊!!
另外关于对该课程组织和考核方式,我觉得已经挺好了,但是还是自己的电脑用得比较顺,哈哈。
展开阅读全文
相关搜索