猜单词游戏c语言学习知识代码.doc
.程序设计报告( 2011 / 2012 学年 第 二 学期)题目: 猜单词游戏 专 业 光电信息工程 学 生 姓 名 梅阳阳 班 级 学 号 B11030506 指 导 教 师 李鹏 指 导 单 位 计算机学院 计算机系统与网络教学中心日 期 2012.06.042012.06.13 评 分 细 则评分项优秀良好中等差遵守机房规章制度上机时的表现学习态度程序准备情况程序设计能力团队合作精神课题功能实现情况算法设计合理性用户界面设计报告书写认真程度内容详实程度文字表达熟练程度回答问题准确度简 短 评 语教师签名: 2012 年 6 月 20 日评分等级备注评分等级有五种:优秀、良好、中等、及格、不及格.题目1:猜单词一、 课题内容和要求要求用C或C+模拟猜单词游戏。游戏包括:单词管理、玩家纪录、猜词过程、系统设置等必须完成的基本功能以及成绩计算、猜词时间限制、词库管理等选做的扩展功能。通过该课题全面熟悉数组、字符串、文件的使用,掌握程序设计的基本方法及友好界面的设计。二、需求分析1. 基本要求。(1) 单词管理:程序中用来做谜题的单词必须存放在磁盘文件中。(2) 猜词过程:先请用户输入猜的单词数量,可以有一个默认值。随机抽取单词,对每个单词,系统根据谜底单词长度在屏幕上显示相应个数-,假设谜底单词为"hello",则在屏幕上输出"-"。玩家输入一个字母进行猜测,如果这个字母不在单词中,系统提示玩家不对;如果猜对字母,比如玩家输入了一个l,则在屏幕上输出"-ll-"。重复,直到玩家在规定的次数内猜出了单词或者超过次数游戏失败。显示玩家每个单词猜对与猜错次数等统计信息。如果玩家猜出单词,计算成绩,如进入前五名提示玩家并记录存储到记录文件中。询问玩家是否开始新一轮猜词,如果玩家选“否”,则系统退到外面的菜单。(3) 系统设置:猜词次数可以为默认值。玩的时候,可以对其进行修改。 2. 扩展要求。 (1) 成绩计算:考虑各种情况下所设计的成绩计算方法是否合理。 (2) 玩家纪录:程序要求记录前五名成绩。成绩指标自行设计,必须包括时间。记录的时候要求有排名、玩家姓名、成绩三项,并保存在文件中。在程序开始运行的时候就必须读入,以便随时供玩家查询、及时更新成绩。三、概要设计 1、主要结构体:struct Playerchar name20;/玩家姓名 int right;/猜对字母数int wrong;/猜错字母数int time;/猜单词的时间;2、主要函数:(1)文件打开函数void OpenWordFile(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():用于将写入过新纪录的文件显示到屏幕上。玩游戏开始游戏记录游戏设置(6)记录读入函数void Record():将最新的游戏成绩记录通过文件读写,从内存中保存到原文本文件中游戏操作是否继续结束YN四、详细设计 #include <stdio.h>#include <stdlib.h>#include <string.h> #include <time.h>#include <fstream.h>#include <conio.h>#include <windows.h> void OpenWordFile(char string2111);void PlayGame(char wordlist2111);void Change(char wordlist2111,char str2111);void StartGame (char wordlist2111);void Menu();int guesstime=10;int round;void 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;void OpenWordFile (char string2111)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) stringij=c; j+; else i+; j=0; c=fgetc(fp); void SetGame ()printf("请输入你想猜的次数:");scanf("%d",&guesstime);void PlayGame (char wordlist2111)char guess; /存用户打入的字母char guessword11;/存用户打入的词int l,j,k,f;int p=1,q=0,x=0,y=0;char WrongGuess11;int t=0;int flag=0; int c=1;/用来查看是否猜对所有字母right=0;srand(time(NULL);q=rand()%21;l=strlen(wordlistq); /求单词长for(f=0;f<l;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;j<l;j+) /循环判断单词中是否有所输入字母if(guesswordj=- ) /判断是否猜过这个字母if(wordlistqj=guess|wordlistqj-guess=32) /如果单词中有这个字母guesswordj=wordlistqj;/在空单词中打入这个字母x+; flag = 1;else if(guesswordj=guess|guesswordj-guess=32) /如果猜过这个字母则提示(仅提示猜过的正确的字母)printf("你已经输入过这个字母了。n");break;if(flag = 0) /如果单词中没有这个字母WrongGuesst = guess ;t+; /在空单词中打入-printf("%s",guessword); if(x>y) y=x; elsek+; c=strcmp(guessword,wordlistq); if(c=0)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 wordlist2111,char str2111)int i,j;for(i=0;i<21;i+)for(j=0;j<11;j+)wordlistij=strij; 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>pi.right) for(j=5;j>i;j-)for(k=0;k<20;k+)pj.namek=pj-1.namek;pj.right=pj-1.right; pj.wrong=pj-1.wrong; pj.time=pj-1.time;for(k=0;k<20;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;i<5;i+)fprintf(fp,"%dt%sttRight:%d Wrong:%dt%dn",i+1,pi.name,pi.right,pi.wrong,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;i<5;i+)fprintf(stdout,"%dt%sttRight:%d Wrong:%dt%dn",i+1,pi.name,pi.right,pi.wrong,pi.time);fclose(fp);void StartGame (char wordlist2111)int t1,t2,t; int p=1;t1=time(NULL);while(p)int i; char play; for(i=0;i<round;i+)char str2111=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");void main()int p=1;while(p) /使得猜完单词或查看完排行榜后返回主菜单Menu();Record();void Menu() int choice;char wordlist2111;system("title 猜字母游戏-A small game to guess a certain word");system("color f2");printf("n");printf(" * 猜单词游戏 * n");printf(" A small game to guess a certain word. Good Luck! 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("Please choice 1-4 againn");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次机会输入:ehelp你成功猜出了这个单词,算你狠,下次整个难点儿的!正确单词就是:help 你猜对了4个字母,猜错了4个字母。错误字母分别是:afrt共用时:23秒是否在玩一次?(Y/N)输入:N输出:请输入你的选择:5、游戏记录保存:6、查看游戏结束后更新过的成绩排行榜:输入:3输出:7、退出程序:输出:请输入你的选择:输入:4输出:Press any key to continue结果分析:1、当单词库文本和游戏记录文本无法读入时,系统将分别提示:“单词库无法打开”、“游戏记录无法打开!”2、在输入菜单选项时如果输入的内容不是1-4之间的数字,而是其他数字,系统将提示“请重新在14中选择”。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运行看哪里不合要求再改。呵呵,貌似习惯不大好,但是用习惯了也挺顺手。不过,调试必须熟练,得为以后打算啊!另外关于对该课程组织和考核方式,我觉得已经挺好了,但是还是自己的电脑用得比较顺,哈哈。