C语言程序设计——成语学习系统
头文件
包含内容:
代码:
主函数
功能:
初始化数据,负责调用各个函数,运行登录系统、游戏系统、数据写入系统,完成程序的完整执行。
流程图
代码
Data文件
Data文件包含函数
函数 | 功能 |
---|---|
GetData | 读取成语文件 |
SeekWord | 查找成语 |
SuperGet | 成语接龙专用数据读取 |
SuperSearch | 成语接龙专用检索 |
MatchingIdioms | 匹配接龙成语 |
MyRand | 生成一个在开区间(0,num)的随机数 |
GetData函数
该函数用于将带释义的成语文件存入到在主函数中定义好的结构体数组
流程图
代码
利用'\0'切割字符串的灵感来源于删除字符串中的子串
SeekWord函数
该函数用于查找是否有符合要求的函数,查找到则返回结构体数组中的对应下标,找不到返回-1。
流程图
代码
Game文件
Game文件函数
函数 | 功能 |
---|---|
StartGame | 游戏程序控制中枢函数 |
OpenDictionary | 成语词典 |
PlayTest | “女娲补天”成语测试 |
ManMachineWar | 成语接龙,人机大战 |
PlayTest2 | “望义生文”成语测试 |
StartGame函数
此函数是整个成语游戏的中枢,不仅要接收传进来的数据指针,还要输出菜单,以供用户选择程序功能,并调用相对应的函数。
流程图
代码
OpenDictionary函数
此函数被调用之后将进入成语词典界面,用户可通过这个函数进行成语释义查询,查询到了输出释义,查询不到就输出提示信息。
流程图
代码
PlayTest函数
此函数被调用之后将进入成语测试界面,用户可通过这个函数进行成语测试,函数将给出10道题,用户依次作答,系统将根据作答情况结算,打分,结束后返回用户作答成绩。
流程图
代码
ManMachineWar函数
此函数被调用之后将进入成语测试界面,用户可通过这个函数进行成语接龙人机大战,函数将随机给出一个成语,系统将判断用户是否输入了成语,如果正确输入则判断是否能够接龙,如果可以,就由系统进行接龙,如果系统接龙成功则开启新一轮接龙。接龙结束后,返回接龙的轮次。
流程图
代码
Ranking文件
Ranking文件函数
函数 | 功能 |
---|---|
RankingList | 读取排行榜数据 |
InList | 显示排行榜 |
WriteList | 向排行榜写入数据 |
WriteList函数
此函数用于向排行榜文件写入数据,根据用户的分数判断是否写入文件,若满足则按顺序写入,若不满足则不写入文件。
流程图
代码
Users文件
Users文件函数
函数 | 功能 |
---|---|
OutMenu | 登录菜单及登录系统中枢 |
SignIn | 登录操作 |
IsRegister | 注册操作 |
InCartoon | 过场动画 |
OutMenu函数
此函数是登录系统的中枢,先显示菜单,然后根据用户的选择分别进行注册或登录的操作,对登录失败的用户有再次尝试登录的功能。
流程图
代码
SignIn函数
该函数被调用之后将进入登录系统,接收用户输入的用户名和密码,并进行核对,核对成功之后结束登录操作。
流程图
代码
IsRegister函数
该函数被调用之后将进入注册系统,接收用户输入的用户名进行查重,通过查重之后接收用户输入的密码,之后写入文件,完成注册。
流程图
代码
运行结果
登录系统
过场动画
选择取消,退出程序。
登录界面
选择是,进入登录界面,故意输入错误。
重新正确输入。
注册界面
先选择否,再选择进入注册。
故意输入存在的用户名。
重新注册。
游戏主菜单
成语词典
阅读使用说明。
查询成语。
故意查询文件没有的成语。
成语测试
成语接龙,人机大战
查看排行榜
退出程序
碰到问题及解决办法
Q1:用户登录时密码会显示,达不到安全的要求;
A1:学习getch函数,达到用户输入的密码不回显的目的;
Q2:登录界面太寒酸,用户体验不好,想要做一点简单的可视化;
A2:学习MessageBoxA函数,利用提示框来做简单的可视化,优化用户体验;
Q3:界面切换得太快,有的文字来不及看清;
A3:在切换页面之前都放一句system("pause")代码暂停运行;
Q4:fflush(stdin)语句在调试的时候失灵;
A4:经查找资料,用rewind(stdin)语句代替,但是原因暂时未知;
Q5:无法准确分开文件中的成语和释义;
A5:想起“删除子串”这道题目的做法,通过利用“\0”分割字符串实现;
Q6:原有成语文件只有233个成语,程序词穷;
A6:自行上网找了个13355个成语的版本,利用记事本和Word进行清洗,程序瞬间变学霸;
Q7:非法输入会影响程序的正常使用;
A7:将输入的函数全部改为fgets(),并且遇到输入就清空缓冲区,程序变得极其安全;
Q8:成语测试出题时遇到了只隐去了一个字的情况,并且要求用户作答两次;
A8:是两次隐去的字的随机数重复了,加一段代码让需要隐去的字的随机数不重复;
Q9:成语接龙时,用户可以作弊,即只输入一个字接龙,然后剩下乱输;
A9:在进行接龙之前先进行查错,由于数据量被改大,可以实施;
Q10:游戏时没有音乐,嗨不起来,学习mciSendString播放音乐,但是编译器报错;
A10:使用这个函数之前,需要引入对应的库,vs只需要一段代码即可做到,Dev c需要手动配置;
Q11:排行榜文件的日期不好处理;
A11:学习time_t结构体和asctime函数,日期数据的处理变得容易;
Q12:读取日期数据时,会把日期数据之前的空格读入;
A12:另外用fgetc函数吸收空格;
Q13:排行榜数据排序用排序法很繁琐;
A13:想起插入排序,修改文件打开方式为“w”,变得简单;
Q14:如果用户登录之后直接退出,会出错;
A14:提前把用户成绩都初始化为0,再开启游戏。
参考资料
《C语言程序设计(第3版)》——何钦铭、颜辉
菜鸟教程
C语言教你怎么改变字体颜色
MessageBox
getch()
system
rewind
getch()函数的使用方法及其返回值问题
fflush(stdin)引起的问题
解决关于VS2017无法使用flush(stdin)的问题
c语言获取当前时间
asctime
VS2013 0xCCCCCCCCC 读取字符串的字符时出错
mciSendString的介绍
Dev C++项目开发是添加背景音乐 C&C++
mciSendString