1、目录猜单词游戏1一 课题内容和要求1二 需求分析2三、概要设计3四、源程序代码4五、测试数据及其结果分析15六、调试过程中的问题19七、课程设计总结19猜单词游戏一 课题内容和要求(一)课题内容要求用C语言实现一个猜单词游戏程序。游戏包括:单词管理、玩家纪录、猜词过程、系统设置等必须完成的基本功能以及成绩计算、猜词时间限制、词库管理等选做的扩展功能。通过该课题全面熟悉数组、字符串、文件的使用,掌握程序设计的基本方法及友好界面的设计。(二)课题要求(1) 单词管理:程序中用来做谜题的单词必须存放在磁盘文件中,文件中的单词数不得少于200个。(2) 玩家纪录:程序要求记录前五名成绩。成绩指标自行设
2、计,必须包括时间。记录的时候要求有排名、玩家姓名、成绩三项,并保存在文件中。在程序开始运行的时候就必须读入,以便随时供玩家查询、及时更新成绩。(3) 猜词过程:先请用户输入猜的单词数量,可以有一个默认值。随机抽取单词,对每个单词,系统根据谜底单词长度在屏幕上显示相应个数-,假设谜底单词为hello,则在屏幕上输出-。玩家输入一个字母进行猜测,如果这个字母不在单词中,系统提示玩家不对;如果猜对字母,比如玩家输入了一个l,则在屏幕上输出-ll-。重复,直到玩家在规定的次数内猜出了单词或者超过次数游戏失败。显示玩家每个单词猜对与猜错次数等统计信息。如果玩家猜出单词,计算成绩,如进入前五名提示玩家并记
3、录存储到记录文件中。询问玩家是否开始新一轮猜词,如果玩家选“否”,则系统退到外面的菜单。(4) 系统设置:猜词次数可以为默认值。玩的时候,可以对其进行修改。 二 需求分析 功能框架图如下: 猜单词游戏开始游戏设置游戏游戏帮助成绩排行退出游戏游戏音乐游戏背景游戏规则语言设置 单词库管理管理提供可操作的主菜单:输出5个菜单,用于显示若干个可选的功能选项。根据玩家输入的选项来运行不同的功能,运行不同的函数。1.开始游戏:进行文本信息的载入,从指定的文件中以一维数组形式加载游戏玩家记录信息这里的文件是在编译时就已经指定好的、存在的文本,需设计者预先自己建立好。猜词过程:随机抽取单词,对每个单词,系统根
4、据谜底单词长度在屏幕上显示相应个数“-”。玩家输入一个字母进行猜测,如果这个字母不在单词中,系统提示玩家不对;如果猜对字母,则替换单词中相应位置的“-”。直到玩家在规定的次数内猜出了单词或者超过次数游戏失败。显示玩家每个单词猜对与猜错次数等统计信息。如果玩家猜出单词,计算成绩,满足进入记录前五名的记录写入到记录文件中覆盖原纪录。询问玩家是否开始新一轮猜词,如果玩家选“否”,则系统退到外面的菜单。2.成绩排行:查看更新过的游戏排行榜,显示分数前五名。3.设置游戏:下设菜单,可对游戏音乐,游戏背景,游戏规则,语言进行设置和修改。4.查看游戏帮助。5.退出游戏。三、概要设计 1、主要结构体/类:st
5、ruct Playerchar name20;/玩家姓名 int right; /猜对的字母int wrong; /猜错的字幕int time; /猜单词的时间;class ByTimeprivate:clock_t start;public:ByTime()start=clock(); /开始计时ByTime(); /析构函数void Endtime()clock_t end;end=clock(); /结束计时times=(end-start)/CLOCKS_PER_SEC; /计算时间cout共用时:times秒endl; /输出时间;2、主要函数:(1)文件打开函数void OpenW
6、ordFile(char string20012):设计思想一致,用于打开单独储存的单词库及游戏记录txt文件。(2)设置函数void set(),void Setgame:用于设置游戏中猜单词的次数与数目。(3)“玩游戏”函数:void PlayGame (char wordlist20012):用于对玩家输入的字母进行处理与判断(4)“开始游戏”函数void StartGame (char wordlist20012):将OpenWordFile (str); Change (wordlist,str);PlayGame(wordlist)等函数统一调用(5)记录显示函数void Show
7、():用于将写入过新纪录的文件显示到屏幕上。(6)记录读入函数void Record():将最新的游戏成绩记录通过文件读写,从内存中保存到原文本文件中四、源程序代码 #include #include #include #include #include #include void OpenWordFile(char string20012);void PlayGame(char wordlist20012);void Change(char wordlist20012,char str20012);void StartGame (char wordlist20012);int round;v
8、oid Set() printf(请输入您想猜的单词数:);scanf(%d,&round);struct Playerchar name20; int right;int wrong;int time;typedef struct Player Player;Player p5=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;int times;class ByTimeprivate:clock_t start;pub
9、lic:ByTime()start=clock();ByTime();void Endtime()clock_t end;end=clock();times=(end-start)/CLOCKS_PER_SEC;cout共用时:times秒endl; ;void OpenWordFile (char string20012)FILE *fp; char c; int i=0; int j=0; if(fp=fopen(word.txt,r)=NULL) /读文件 printf(单词库无法打开!n); exit(0); elsec=fgetc(fp); while(c!=EOF) if(c!=n
10、) stringij=c; j+; else i+; j=0; c=fgetc(fp); int guesstime=10;void SetGame ()printf(请输入你想猜的次数:);scanf(%d,&guesstime);void PlayGame (char wordlist20012)char guess; /存用户打入的字母char guessword12;/存用户打入的词int l,j,k,f;int p=1,q=0,x=0,y=0;char WrongGuess12;int t=0;int flag=0; int c=1; /用来查看是否猜对所有字母srand(time(
11、NULL);q=rand()%200;l=strlen(wordlistq); /求单词长for(f=0;fl;f+) /定义词一空单词,词长与所选一样guesswordf=-;guesswordl=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;jy) y=x; elsek+; c=strcmp(guessword,wordlistq); if(c=0
12、)printf(nHow smart you are! 你成功猜出了这个单词!n正确单词就是:%s,wordlistq);right+;if(c!=0)printf(nSorry. 你已经超过了规定的次数,挑战失败了.n正确单词是:%s,wordlistq);wrong+;printf(你猜对了%d个字母,猜错了%d个字母。n,x,k-1);WrongGuesst = 0;printf(错误字母分别是%sn,WrongGuess);void Change (char wordlist20012,char str20012)int i,j;for(i=0;i200;i+)for(j=0;j12;
13、j+)wordlistij=strij; void Input()printf(请先输入您的大名:);scanf(%s,temp.name);void Result()temp.right=right;temp.wrong=wrong;void Time()temp.time=times;void Compare()int i,j,k;for(i=0;ipi.right) for(j=5;ji;j-)for(k=0;k20;k+)pj.namek=pj-1.namek;pj.right=pj-1.right; pj.wrong=pj-1.wrong; pj.time=pj-1.time;for
14、(k=0;k20;k+)pi.namek=temp.namek;pi.right=temp.right;pi.wrong=temp.wrong;pi.time=temp.time;break;void Record()int i;FILE *fp;fp=fopen(record.txt,r+);if(!fp)printf(游戏记录无法打开!);exit(1); fprintf(fp,名次t姓名tt成绩:猜对 or 猜错)t时间(s)n);for(i=0;i5;i+)fprintf(fp,%dt%sttRight:%d Wrong:%dt%dn,i+1,pi.name,pi.right,pi.w
15、rong,pi.time);fclose(fp);void Show()int i;FILE *fp;fp=fopen(record.txt,r);if(!fp)printf(游戏记录无法打开!n);exit(1);fprintf(stdout,名次t姓名tt成绩(猜对 猜错)t时间(s)n);for(i=0;i5;i+)fprintf(stdout,%dt%sttRight:%d Wrong:%dt%dn,i+1,pi.name,pi.right,pi.wrong,pi.time);fclose(fp);void StartGame (char wordlist20012)int p=1;w
16、hile(p)int i; char play; ByTime t; for(i=0;i 1. 开始游戏 2. 设置游戏 3. 成绩排行 4. 退出游戏 n);printf( *n);printf( 制作人:杜昊阳 B09011422 n);printf(n);printf(请输入你的选择:);scanf(%d,&choice);while(choice4)printf(Please choice 1-4 againn);scanf(%d,&choice);switch (choice)/选择case 1:Set();Input();StartGame (wordlist);/调用游戏函数br
17、eak;case 2:SetGame ();/调用设置函数Set();Input();StartGame (wordlist);break;case 3:Show();break;case 4:exit(0);五、测试数据及其结果分析显示的主菜单界面: * 猜单词游戏 * A small game to guess a certain word. Good Luck! * 1. 开始游戏 2. 设置游戏 3. 成绩排行 4. 退出游戏 *制作人:杜昊阳 B09011422请输入你的选择:1、查看之前的游戏成绩排行榜;2、设置游戏; 3、开始猜单词游戏;4、进行游戏;5、游戏记录保存;6、查看游
18、戏结束后更新过的成绩排行榜;1、查看之前的游戏成绩排行榜:输入:3输出:名次 姓名 成绩:猜对 & 猜错 时间(s) 1 unknown Right:0 Wrong:0 0 2 unknown Right:0 Wrong:0 0 3 unknown Right:0 Wrong:0 0 4 unknown Right:0 Wrong:0 0 5 unknown Right:0 Wrong:0 02、设置游戏:输入:2输出:请输入你想猜的次数:输入:20输出:请输入你想猜的单词数:输入:2输出:请先输入您的大名:输入:Adu输出:请输入你要猜的字幕,每次一个,祝你好运哦! - 你还有20次机会!3
19、、开始猜单词游戏: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次机会输入:ehelpHow smart you are! 你成功猜出了这个单词正确单词就是:help 你猜对了4个字母,猜错了4个字母。错误字母分别是:afrt共用时:23
20、秒是否在玩一次?(Y/N)输入:N输出:请输入你的选择:5、游戏记录保存:6、查看游戏结束后更新过的成绩排行榜:输入:3输出:名次 姓名 成绩:猜对 & 猜错 时间(s) 1 Adu Right:1 Wrong:0 23 2 unknown Right:0 Wrong:0 0 3 unknown Right:0 Wrong:0 0 4 unknown Right:0 Wrong:0 0 5 unknown Right:0 Wrong:0 07、退出程序:输出:请输入你的选择:输入:4输出:Press any key to continue结果分析:1、当单词库文本和游戏记录文本无法读入时,系统
21、将分别提示:“”、“游戏记录无法打开!”2、在输入菜单选项时如果输入的内容不是1-4之间的数字,而是其他数字,系统将提示“请重新在14中选择”;若输入的为其他字符(字母或符号),系统将自动认为操作结束而退出系统。3、当猜一个单词的次数超过预定次数时(默认为10次),系统将提示:“Sorry. 你已经超过了规定的次数,挑战失败了. 正确单词是:” 4、当一轮游戏结束后,系统提示:“是否再玩一次?(Y/N)”,选y,重新开始游戏,选n,返回主菜单。六、调试过程中的问题1、文件读入问题:文件路径编写不正确,会造成读入失败,使得的程序可以通过编译和链接,但无法正常运行。2、猜单词次数初始化问题:int
22、 round应在Set函数之前定义,应为后续的其他函数还要调用它。3、判断单词中是否有输入的字母和是否之前是否输入过这个字母用到了多层循环判断的嵌套,不仔细时漏洞、错误百出4、统计猜错字母时,要输出的计数器为k-1,而不是k,因为前一步k+为先调用再自增。5、要使得猜完单词退出后返回主菜单,必须设计一个while循环,否则结束游戏或查看完排行榜后程序自动结束。6、要在case 2 Setgame函数后加case 1中的所有函数,否则程序无法正常运行。 七、课程设计总结这次的设计课通过自己动手设计一个较有规模的程序,自己发现问题、解决问题。其中不仅对C和C+的操作有了进一步的掌握,还提高了程序的
23、调试方法,了解到了程序设计的各种书写风格及其注释的格式。对于这个课题来说,重点在于循环和判断语句的使用和文件的读写问题,当然还有不少典型的算法以及界面美观设计的问题。重点和难点很多,其中还有很多在平时学习基础上需要变通的地方。例如,存放时间、正确错误字母的变量要定义结构体或类来解决,区分temp.X和p.X。还有学会了计算程序运行时间的算法语句,温习了数组,字符串以及结构体与类的区别等各种知识。此外,在与别的同学交流的过程中,我还体会了学生选课系统及火车票务系统的设计思想,了解了有名的Dijkstra算法,并与同学交流了如何将txt文件中的矩阵读入二维数组,学会了怎样美化人机操作界面。猜单词这个程序虽不是十分复杂但也有许多要思考的地方,对我们学完C和C+的总结和正在学习的数据结构都用很大的帮助。总的来说,本人这两个星期的努力还是有了回报,不管是多是少,总算是学到了一些东西!-19-