基于C语言的模拟猜单词游戏

Brokenner

发布日期: 2018-10-31 16:03:36 浏览量: 1570
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

一、课题内容和要求

“模拟猜单词游戏”系统要求用C或C++模拟猜单词游戏。游戏包括:单词管理、玩家纪录、猜词过程、系统设置等必须完成的基本功能以及成绩计算、猜词时间限制、词库管理等选做的扩展功能。

二、基本要求

  • 单词管理:程序中用来做谜题的单词必须存放在磁盘文件中

  • 猜词过程:

    1. 先请用户输入猜的单词数量,可以有一个默认值
    2. 随机抽取单词,对每个单词,系统根据谜底单词长度在屏幕上显示相应个数’-‘,假设谜底单词为”hello”,则在屏幕上输出”——-“
    3. 玩家输入一个字母进行猜测,如果这个字母不在单词中,系统提示玩家不对;如果猜对字母,比如玩家输入了一个’l’,则在屏幕上输出”—ll-“
    4. 重复3,直到玩家在规定的次数内猜出了单词或者超过次数游戏失败
    5. 显示玩家每个单词猜对与猜错次数等统计信息。如果玩家猜出单词,计算成绩,如进入前五名提示玩家并记录存储到记录文件中
    6. 询问玩家是否开始新一轮猜词,如果玩家选“否”,则系统退到外面的菜单
  • 系统设置:猜词次数可以为默认值。玩的时候,可以对其进行修改

二、需求分析

模拟猜单词游戏系统的功能框架图如下图所示。

  • 进入主菜单:输出菜单,用于显示若干个可选的功能选项。根据客户输入的选项来运行不同的功能,运行不同的函数

  • 进入游戏功能:用户进行游戏。系统随机提取单词,并提示玩家输入字母进行猜测,并匹配单词是否正确,若正确,输出正确对应的单词,否则提示错误,并提示还有几次出错机会。若游戏结束,显示游戏统计信息,然后询问是否再一次游戏

  • 设置功能:进入设置选项,可更改系统默认的玩家名字和默认的每一次游戏所要猜的单词数

  • 查看功能:进入查看选项,可查看历史玩家记录排名以及游戏版权信息

  • 退出功能:退出游戏

三、概要设计

3.1 主要结构体及全局变量

  1. struct player //玩家信息结构
  2. {
  3. char name[10]; //玩家名字
  4. double time; //玩家所用时间
  5. double score; //玩家成绩
  6. };
  7. typedef struct player player;
  8. char name[]="Player"; //全局变量,储存玩家姓名
  9. char word[10]; //全局变量,储存随机提取的单词
  10. int NUMBER=2; //全局变量,储存一次游戏猜单词的个数
  11. player allPlayer[100]; //全局结构体数组,储存从文件中提取的所有玩家信息
  12. player playerTemp; //全局结构体变量,用于临时储存操作玩家的信息
  13. char tempWord[100][20]; //全局字符二维数组,用于储存玩家所猜的单词

3.2 主要函数流程图

随机提取单词函数:用于从文本中读取单词到内存中,并随机从内存中抽取单词。随机提取单词函数流程图如下图所示。

游戏过程中单词判断函数:用于对玩家输入的字母进行判断,玩家先对一个单词进行猜测,如果玩家在规定次数内输出单词,则进行下一个单词的判断,直到所有单词都判断过为止,如果玩家把所有单词都输入正确,则转到游戏成功界面,显现玩家的成绩,并显现正确单词,否则转到失败界面,告知玩家GAME OVER,并显现正确单词。

四、测试数据及其结果分析

运行后,程序的主菜单界面如下。

4.1 欢迎界面

4.2 菜单界面

4.3 游戏开始界面

4.4 设置界面

4.5 查看界面

4.6 退出界面

4.7 测试数据及其分析

先进入游戏开始界面,开始第一回合,第一回合游戏的最终过程如下:

开始第二回合时,游戏过程如下:

最后显现成绩为:

下面分别有由玩家姓名为Jack,Tom,Mike,Jhon,Ken的五名玩家进行游戏体验,且他们都通过了猜词测试,他们的最终成绩通过“查看”中的“排名”选项显示如下:

如果已经完成猜单词游戏,不想继续进行,可以将选择查看直接查看排名,然后再退出。如果不想查看其他的信息的话,可以直接选择退出。

4.8 结果分析如下

  • 在输入主菜单选项时如果输入的内容不是1-4之间的数字,而是其他数字或字母,系统将进行报错,提醒用户输入正确的操作内容

  • 如果用户在进行游戏时只猜出一个单词,则系统不进行提示用户输入成功,必须全部输入正确才进行显现成功提示

  • 在进行游戏玩家的成绩排名时,只有有成绩的玩家才可以进行排名,并且只有前五名的玩家的成绩才可以输出至屏幕上显现给玩家

  • 在玩猜单词游戏时会有三个闪屏信息提醒玩家做好游戏准备,并告知玩家一些游戏必知信息,让玩家有心理准备

五、调试过程中的问题

  • 随机提取单词时,随机读取单词出现问题。因为文件指针使用很容易造成指针指向不明的情况,为避免此类问题的出现,通过放弃随机使用指针指向文件字母来读取完整的单词的随机抽取单词方法,改为先读取完所有字母到内存数组中,然后产生随机数来随机提取内存数组中的完整单词,最后成功随机提取单词。

  • 读入玩家信息到已建立的玩家信息记录本时,由于结构体变量定义错误导致不能读入,然后我们尝试定体结构体全局变量,这样就方变了程序中的多个函数都能够调用,并且每个函数进行调用时将改过的信息都能够输入到玩家信息记录本中,方便了用户在游戏主界面进行信息的查询。

  • 进入游戏界面进行游戏,最开始设置时程序逻辑上出现了问题:如果玩家第一个单词输入正确,在猜第二个单词时,有可能造成第二个单词输入正确时没有显示成功界面,直到错误次数到了规定次数才退出游戏界面,为解决这个问题,程序中定义了一个临时记录正确次数的变量tenpCorrectTimes,每猜一个单词时,就初始化为0,每猜对一个字母,就自增一,游戏中判断是否等于正在猜单词的长度,然后判断玩家是否成功猜对单词。

  • 玩家进入菜单界面,如果不小心敲了键盘上某个按键,这时可能出现无数次循环显示“输入错误”提示信息,为解决这类问题,程序从新设定输入类型,由最初的整形改为字符型,这样就能避免由于整形输入而输入字母时无法判断所造成的无限次输出“错误输入”提示信息,改为字符型输入就能判断所有的字符是否输入错误,从而解决了问题。

  • 在将玩家信息记录本中的玩家信息读取出来进行冒泡法排序时,由于一开始调用fread函数进行玩家信息的读取时,容易出现一系列错误,都是由于fread就函数的要求较为严格,一般读取二进制文件,后来老师叫我们用fscanf函数进行格式化读写,但是由于一点小细节没有注意,第文件内容只有一个结构变量内容的话,用fscanf函数进行读取,读取完之后,fp文件指针指向末尾,!feof(fp)函数判断为0,就不能将结构体变量的内容赋给结构体数组,这样就不能进行冒泡法排序,不能判断玩家的名次。后来再第一个fscanf后直接赋值,就解决只有一个玩家信息时读取失败的问题。

六、课程设计总结

做一个完整的游戏系统非常不容易,不仅要考虑游戏本身的游戏性问题,还要考虑跟这个游戏有关的一些问题,比如主菜单界面,设置问题,提示信息等等。开始做这个系统是并没有考虑这些,只考虑了游戏本身几个函数的实现,如猜词游戏中随机提取文件中的单词函数以及进入游戏的游戏主体函数。但随着游戏的不断完善,在不断排除几个主要函数在逻辑上的错误的过程中,以及在投入力量做界面优化方面时,发现做一个完整游戏所需要满足玩家对游戏体验的附带功能必不可少。通过这次游戏系统的开发,在和同学的合作中让我们受益很多。

所谓学以致用,这次的系统开发让我知道C语言不仅仅是书上那几个示例那么简单,C语言所能做的事远远超出了我们这些初学者的想象。这次这个简单游戏,几乎用到了书上所学的知识,如一维数组、二维字符数组、各种循环、指针、文件的写入及读出等等。让我们对课本的理解更深刻。

在具体到函数书写的时候,会碰到一些问题。除了一些语法错误,最令人头疼的应该是程序逻辑上的问题。如果逻辑上除了一丁点小错误,将导致整个函数无法正常运行,常常导致一些意外的结果。但这些逻辑上的小错误隐藏得非常深,如果不仔细耐心调试,是很难发现问题所在。这些问题常常导致我们感到不知所措,甚至导致我们产生放弃的念头,但经过我们的细心调试,终于把那些逻辑上的小错误都一一解决了。当程序运行正确时,我们在欣喜若狂的同时,也感触良多。

这次的系统设计让我们学到了很多,除了对C语言的更深入理解之外,最大的收获是渐渐学会如何和他人合作。如今社会工作中不会别人合作是不可能的,一个人单打独斗是很难成功。唯有合作,才能双赢。

这就是我们做系统的总结,虽不多,但很实在。

上传的附件 cloud_download 基于C语言的模拟猜单词游戏.7z ( 260.95kb, 143次下载 )
error_outline 下载需要6点积分

发送私信

时间能冲淡一切,但却冲不掉一切

9
文章数
6
评论数
最近文章
eject