# 基于C语言的模拟猜单词游戏
# 一、课题内容和要求
“模拟猜单词游戏”系统要求用C或C++模拟猜单词游戏。游戏包括:单词管理、玩家纪录、猜词过程、系统设置等必须完成的基本功能以及成绩计算、猜词时间限制、词库管理等选做的扩展功能。
# 二、基本要求
- 单词管理:程序中用来做谜题的单词必须存放在磁盘文件中
- 猜词过程:
1. 先请用户输入猜的单词数量,可以有一个默认值
2. 随机抽取单词,对每个单词,系统根据谜底单词长度在屏幕上显示相应个数'-',假设谜底单词为"hello",则在屏幕上输出"-----"
3. 玩家输入一个字母进行猜测,如果这个字母不在单词中,系统提示玩家不对;如果猜对字母,比如玩家输入了一个'l',则在屏幕上输出"--ll-"
4. 重复3,直到玩家在规定的次数内猜出了单词或者超过次数游戏失败
5. 显示玩家每个单词猜对与猜错次数等统计信息。如果玩家猜出单词,计算成绩,如进入前五名提示玩家并记录存储到记录文件中
6. 询问玩家是否开始新一轮猜词,如果玩家选“否”,则系统退到外面的菜单
- 系统设置:猜词次数可以为默认值。玩的时候,可以对其进行修改
# 二、需求分析
模拟猜单词游戏系统的功能框架图如下图所示。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/3e28ad6bc3bf379a0d64a54e436fa2b5.writebug)
- 进入主菜单:输出菜单,用于显示若干个可选的功能选项。根据客户输入的选项来运行不同的功能,运行不同的函数
- 进入游戏功能:用户进行游戏。系统随机提取单词,并提示玩家输入字母进行猜测,并匹配单词是否正确,若正确,输出正确对应的单词,否则提示错误,并提示还有几次出错机会。若游戏结束,显示游戏统计信息,然后询问是否再一次游戏
- 设置功能:进入设置选项,可更改系统默认的玩家名字和默认的每一次游戏所要猜的单词数
- 查看功能:进入查看选项,可查看历史玩家记录排名以及游戏版权信息
- 退出功能:退出游戏
# 三、概要设计
## 3.1 主要结构体及全局变量
```c++
struct player //玩家信息结构
{
char name[10]; //玩家名字
double time; //玩家所用时间
double score; //玩家成绩
};
typedef struct player player;
char name[]="Player"; //全局变量,储存玩家姓名
char word[10]; //全局变量,储存随机提取的单词
int NUMBER=2; //全局变量,储存一次游戏猜单词的个数
player allPlayer[100]; //全局结构体数组,储存从文件中提取的所有玩家信息
player playerTemp; //全局结构体变量,用于临时储存操作玩家的信息
char tempWord[100][20]; //全局字符二维数组,用于储存玩家所猜的单词
```
## 3.2 主要函数流程图
随机提取单词函数:用于从文本中读取单词到内存中,并随机从内存中抽取单词。随机提取单词函数流程图如下图所示。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/d8799d1d0bb4c096c4f1a1ecf0c03745.writebug)
游戏过程中单词判断函数:用于对玩家输入的字母进行判断,玩家先对一个单词进行猜测,如果玩家在规定次数内输出单词,则进行下一个单词的判断,直到所有单词都判断过为止,如果玩家把所有单词都输入正确,则转到游戏成功界面,显现玩家的成绩,并显现正确单词,否则转到失败界面,告知玩家GAME OVER,并显现正确单词。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/8c3de3d9afe952c689a28e36226d282f.writebug)
# 四、测试数据及其结果分析
运行后,程序的主菜单界面如下。
## 4.1 欢迎界面
![](http://www.writebug.com/myres/static/uploads/2021/10/19/0263f08fc9abfc5fb65cb0788e6ded2c.writebug)
## 4.2 菜单界面
![](http://www.writebug.com/myres/static/uploads/2021/10/19/87732dba5be69d4e2c64569f1e59b18f.writebug)
## 4.3 游戏开始界面
![](http://www.writebug.com/myres/static/uploads/2021/10/19/4ad56b1114b124d1c9b520736714093c.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/31e1207a23f1553d6f47d0603169eb97.writebug)
## 4.4 设置界面
![](http://www.writebug.com/myres/static/uploads/2021/10/19/ff47e10ad9ba93cfb4268cc0f94255cb.writebug)
## 4.5 查看界面
![](http://www.writebug.com/myres/static/uploads/2021/10/19/87c754f16f51621ba442e80bd41f0ca7.writebug)
## 4.6 退出界面
![](http://www.writebug.com/myres/static/uploads/2021/10/19/7dc541960c179a5c295f8fd00a190c4d.writebug)
## 4.7 测试数据及其分析
先进入游戏开始界面,开始第一回合,第一回合游戏的最终过程如下:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/615d0165e36ff720c6e4c06e0d89d1bc.writebug)
开始第二回合时,游戏过程如下:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/2a626c61a6823229be0beeab99d40bf2.writebug)
最后显现成绩为:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/0161d5ef08d46b2ca00f8be7641aad60.writebug)
下面分别有由玩家姓名为Jack,Tom,Mike,Jhon,Ken的五名玩家进行游戏体验,且他们都通过了猜词测试,他们的最终成绩通过“查看”中的“排名”选项显示如下:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/6bda4de5a384ed724926291503b83a55.writebug)
如果已经完成猜单词游戏,不想继续进行,可以将选择查看直接查看排名,然后再退出。如果不想查看其他的信息的话,可以直接选择退出。
## 4.8 结果分析如下
- 在输入主菜单选项时如果输入的内容不是1-4之间的数字,而是其他数字或字母,系统将进行报错,提醒用户输入正确的操作内容
- 如果用户在进行游戏时只猜出一个单词,则系统不进行提示用户输入成功,必须全部输入正确才进行显现成功提示
- 在进行游戏玩家的成绩排名时,只有有成绩的玩家才可以进行排名,并且只有前五名的玩家的成绩才可以输出至屏幕上显现给玩家
- 在玩猜单词游戏时会有三个闪屏信息提醒玩家做好游戏准备,并告知玩家一些游戏必知信息,让玩家有心理准备
# 五、调试过程中的问题
- 随机提取单词时,随机读取单词出现问题。因为文件指针使用很容易造成指针指向不明的情况,为避免此类问题的出现,通过放弃随机使用指针指向文件字母来读取完整的单词的随机抽取单词方法,改为先读取完所有字母到内存数组中,然后产生随机数来随机提取内存数组中的完整单词,最后成功随机提取单词。
- 读入玩家信息到已建立的玩家信息记录本时,由于结构体变量定义错误导致不能读入,然后我们尝试定体结构体全局变量,这样就方变了程序中的多个函数都能够调用,并且每个函数进行调用时将改过的信息都能够输入到玩家信息记录本中,方便了用户在游戏主界面进行信息的查询。
- 进入游戏界面进行游戏,最开始设置时程序逻辑上出现了问题:如果玩家第一个单词输入正确,在猜第二个单词时,有可能造成第二个单词输入正确时没有显示成功界面,直到错误次数到了规定次数才退出游戏界面,为解决这个问题,程序中定义了一个临时记录正确次数的变量tenpCorrectTimes,每猜一个单词时,就初始化为0,每猜对一个字母,就自增一,游戏中判断是否等于正在猜单词的长度,然后判�