猜单词游戏c语言代码.docx
- 文档编号:29371429
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:22
- 大小:175.09KB
猜单词游戏c语言代码.docx
《猜单词游戏c语言代码.docx》由会员分享,可在线阅读,更多相关《猜单词游戏c语言代码.docx(22页珍藏版)》请在冰豆网上搜索。
猜单词游戏c语言代码
程序设计报告
(2011/2012学年第二学期)
题目:
猜单词游戏
专业光电信息工程
学生姓名梅阳阳
班级学号B******06
指导教师李鹏
指导单位计算机学院
计算机系统与网络教学中心
日期2012.06.04-2012.06.13
评分细则
评分项
优秀
良好
中等
差
遵守机房规章制度
上机时的表现
学习态度
程序准备情况
程序设计能力
团队合作精神
课题功能实现情况
算法设计合理性
用户界面设计
报告书写认真程度
内容详实程度
文字表达熟练程度
回答问题准确度
简短评语
教师签名:
2012年6月20日
评分等级
备注
评分等级有五种:
优秀、良好、中等、及格、不及格
题目1:
猜单词
一、课题内容和要求
要求用C或C++模拟猜单词游戏。
游戏包括:
单词管理、玩家纪录、猜词过程、系统设置等必须完成的基本功能以及成绩计算、猜词时间限制、词库管理等选做的扩展功能。
通过该课题全面熟悉数组、字符串、文件的使用,掌握程序设计的基本方法及友好界面的设计。
二、需求分析
1.基本要求。
(1)单词管理:
程序中用来做谜题的单词必须存放在磁盘文件中。
(2)猜词过程:
①先请用户输入猜的单词数量,可以有一个默认值。
②随机抽取单词,对每个单词,系统根据谜底单词长度在屏幕上显示相应个数'-',假设谜底单词为"hello",则在屏幕上输出"-----"。
③玩家输入一个字母进行猜测,如果这个字母不在单词中,系统提示玩家不对;如果猜对字母,比如玩家输入了一个'l',则在屏幕上输出"--ll-"。
④重复③,直到玩家在规定的次数内猜出了单词或者超过次数游戏失败。
⑤显示玩家每个单词猜对与猜错次数等统计信息。
如果玩家猜出单词,计算成绩,如进入前五名提示玩家并记录存储到记录文件中。
⑥询问玩家是否开始新一轮猜词,如果玩家选“否”,则系统退到外面的菜单。
(3)系统设置:
猜词次数可以为默认值。
玩的时候,可以对其进行修改。
2.扩展要求。
(1)成绩计算:
考虑各种情况下所设计的成绩计算方法是否合理。
(2)玩家纪录:
程序要求记录前五名成绩。
成绩指标自行设计,必须包括时间。
记录的时候要求有排名、玩家姓名、成绩三项,并保存在文件中。
在程序开始运行的时候就必须读入,以便随时供玩家查询、及时更新成绩。
三、概要设计
1、主要结构体:
structPlayer
{
charname[20];//玩家姓名
intright;//猜对字母数
intwrong;//猜错字母数
inttime;//猜单词的时间
};
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]);
voidMenu();
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;//用来查看是否猜对所有字母
right=0;
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"); } } 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"); printf("\n"); printf("**************************************\n"); printf(">>>>>>>>>>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("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); } } 五、测试数据及其结果分析 显示的主菜单界面: 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 输出: Pressanykeytocontinue 结果分析: 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运行看哪里不合要求再改。 呵呵,貌似习惯不大好,但是用习惯了也挺顺手。 。 。 。 不过,调试必须熟练,得为以后打算啊! ! 另外关于对该课程组织和考核方式,我觉得已经挺好了,但是还是自己的电脑用得比较顺,哈哈。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单词 游戏 语言 代码