猜单词游戏c语言学习知识代码.doc

收藏

编号:2623912    类型:共享资源    大小:373.46KB    格式:DOC    上传时间:2020-04-25
8
金币
关 键 词:
单词 游戏 语言 学习 知识 代码
资源描述:
.\ 程序设计报告 ( 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运行看哪里不合要求再改。呵呵,貌似习惯不大好,但是用习惯了也挺顺手。。。。不过,调试必须熟练,得为以后打算啊!! 另外关于对该课程组织和考核方式,我觉得已经挺好了,但是还是自己的电脑用得比较顺,哈哈。
展开阅读全文
提示  淘文阁 - 分享文档赚钱的网站所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:猜单词游戏c语言学习知识代码.doc
链接地址:https://www.taowenge.com/p-2623912.html
关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

收起
展开