设计目的
1、加深学生对该课程基础知识和基本理论的理解和掌握,培养学生综合运用所学知识独立
分析和解决问题的能力;
2、培养学生在计算机软硬件开发、理论计算、查阅资料等方面的能力,使学生逐步树立正
确的设计思想;
3、加强理论联系实际,培养学生科学严谨、实事求是的工作作风和勇于探索的创新精神。
任务描述
为了提高学生编程能力,请设计一款人机猜数游戏程序。该程序主要功能要求如下:
1、游戏开始时,先由计算机“想”一个四位数,然后让人猜这个四位数是多少。
猜数时,计算机先判断输入的四位数猜对几个数字,并且在猜对的这些数字中有几个位置是对的,将统计情况显示出来供猜数人参考;猜数人可据此提示继续猜数,直到猜对为止。2、猜对后,计算机显示本轮猜数一共猜了几次以及获得的分数;
分数计算公式如下:
次数<=3 计100分
5<次数<=10 计60分
3<次数<=5 计80分
10<次数计0分
3、一轮猜数游戏结束后,可重复玩,直到不想再玩为止:
4、开始每轮猜数游戏时,要保证计算机“想”的数和前面“想”的数不同;
5、游戏结束后,可查看每轮猜数历史记录(显示每次计算机“想”的数,人猜数所用次数
和得分)
设计要求
1、要求按照分析、设计、编码、调试和测试的软件开发过程独立完成本任务;
2、应用模块化编程思想。系统的各项功能分别用函数编写,并通过主函数调用实现其所有功
能。
3、系统完成的各项功能要求设计成一个菜单。开始运行程序时,先显示主菜单,然后用户通过菜单项选择操作完成相应操作。例如以下菜单形式:猜数游戏查看历史2竹退出系统请选择[11213]:
源码
void display_menu()
{
puts("1、猜数游戏");
puts("2、查看历史");
puts("3、退出系统");
puts("请选择[1/2/3]: ");
}
int get_choise()
{
int i;
CLS;
display_menu();
scanf("%d", &i);
CLS;
return i;
}
void game()
{
int flag = 1;
while (flag)
{
int num = get_random();
int step = 0;
puts("我准备好了一个数字,快来猜猜看吧!");
int g_num = -1;
while (g_num != num)
{
if (g_num != -1)
{
printf(g_num > num ? "大了" : "小了");
}
step++;
puts("请输入数字:");
系统分析
猜数字游戏,是对用户输入的数字进行判定,是否与游戏程序产生的数字相同,从而判定游戏胜负的程序。主要包括:随机数产生,历史记录,流程控制三个部分。
总体设计
本游戏设计要求运用模块化思想,设计和实现一个猜数字游戏,因此本游戏可划分为以下三个模块,系统功能结构图如图1所示。
- 随机数产生模块:作为游戏的重要组成部分,用以产生固定范围内的随机数,及四位整数。
- 成绩判定模块:用以判定玩家最终得分。
- 菜单输出模块:输出菜单,给玩家提供以相应的引导。
- 流程控制模块:控制整个程序的运行,根据用户的输入来进行相关的操作。
- 游戏本体模块:即游戏本身,整个游戏的逻辑部分。
- 历史查询模块:可以查询玩家历史的游戏成绩。
图1
详细设计
数据结构设计
typedef struct
{
int count;
int grade;
} history;//历史记录
history his_list[1000];//记录池
int count;//当前游戏轮数
函数功能描述
序号 | 函数名 | 功能 |
1 | main | 主函数,调用play函数 |
2 | get_random | 获取随机数 |
3 | get_grade | 计算并返回玩家成绩 |
4 | display_menu | 打印菜单 |
5 | get_choise | 获取玩家选择功能 |
6 | game | 执行游戏本体逻辑 |
7 | find_history | 列出历史成绩 |
8 | play | 控制整体游戏流程 |
各函数流程讲解
- main函数
调用play函数 - get_random函数
首先设置初始随机数种子为当前时间
获取当前随机数,并保证其大于1000
然后另其对10000取余,保证其小于10000 - get_grade函数
依次判断a的范围,并返回最终成绩 - display_menu函数
依次打印菜单各个选项 - get_choise函数
获取并返回玩家的菜单选项 - game函数
首先调用get_random以获取随机数
然后设置step记录玩家所耗费操作步数
接着通过循环,只要玩家输入数字和预定随机数不同,便继续循环,让玩家输入
如果玩家输入数字和预期相同,则记录该次游玩记录,并询问玩家是否继续,若继续,重复上述步骤 - find_history函数
遍历记录数组,并依次打印玩家的成绩和操作次数,之后以星号行分割 - play函数
调用get_choise函数,如果该函数返回的是0以外的数字,则执行对应选择,否则推出游戏