//猜数字游戏
//电脑产生一个随机数(1-100)
//猜数字,根据输入的数字 输出“猜大了”/“猜小了” 直到猜对了结束
首先我们先设计前半部分,防止我们猜数一次之后就游戏结束退出了,我们来设置一个循环入口,进入以后我们需要先做选择,这样定义一个函数menu()作为菜单,这样一进去就要进行选择,所以我们使用do…while进行循环,
#include<stdio.h>
void menu()
{
printf("********************\n");
printf("********1.play*******\n");
printf("********0.exit*******\n");
printf("********************\n");
}
int main()
{
int input = 0;
do {
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("猜数字游戏\n");
break;
case 0:
printf("退出游戏!");
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
} while (input);
{
}
return 0;
}
实现的初步效果如图:
当选择1.play时,便需要开始游戏,这样我们再来设计一个game()函数,然后在case1对应位置添加game()函数,首先我们先设置生成随机数,代码如下:
#include<stdio.h>
void menu()
{
printf("********************\n");
printf("********1.play*******\n");
printf("********0.exit*******\n");
printf("********************\n");
}
game()
{
//生成随机数: rand()函数用于生成一个0~RAND_MAX(最大值32767)的随机数
int ret = rand();
printf("%d\n", ret);
//猜数字
}
int main()
{
int input = 0;
do {
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("猜数字游戏\n");
game();
break;
case 0:
printf("退出游戏!");
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
} while (input);
{
}
return 0;
}
但是在这里调试过程中我们发现每次产生的随机数相同,下面两张截图可以对比发现不同时间的运行效果,随机数是相同的,显然这样出现在游戏中是不合理的,接下来我们来解决一下生成随机数相同的问题:
这里我们引入一个新的函数:srand(),是一个C语言标准库函数,其作用是设置随机数发生器的种子(seed)。它必须在调用rand()函数之前被调用。
随机数生成器根据种子生成伪随机数序列。如果每次种子相同,那么生成的随机数序列也将是相同的。因此,在每次程序运行时都使用不同的种子可以获得不同的随机数序列。
srand()函数通常使用time()函数的返回值来设置种子,以获取基于当前时间的随机数序列。例如:srand(time(NULL))。
srand()函数的作用是在需要产生随机数的程序中提供一种初始化随机数生成器的方法,以确保每次运行程序时都能获得不同的随机数序列。
game()
{
srand((unsigned int)time(NULL));
//srand(time(NULL));
//生成随机数: rand()函数用于生成一个0~RAND_MAX(最大值32767)的随机数
int ret = rand();
printf("%d\n", ret);
//猜数字
}
这样我们将game()部分添加srand()函数便解决了上述随机数相同的问题
需要注意的是time()函数返回值类型为time_t,srand()函数期望得到的返回值是unsigned,所以我们可以进行一下类型转换(unsigned int)(此处的类型不转换有的编译器会报错,有的不会!)
这里注意srand()函数需要包含头文件#include<stdlib.h>
time()函数需要包含头文件#include<time.h>
接下来我们进一步优化代码,需要注意的是,我们并非每一次设置随机数的时候都需要调用srand()函数,就单独的上面一小部分而言的例子,我们可以这样解决,就整体的大的工程而言,我们只需要调用一次就可以,所以我们只需要将srand()函数放在项目开始部分调用一次即可,不用放在game函数里面每次调用,上面的举例是为了方便理解。
这样,我们将srand()函数放在int main()里面
int main()
{
srand((unsigned int)time(NULL));
//srand(time(NULL));
//生成随机数: rand()函数用于生成一个0~RAND_MAX(最大值32767)的随机数
//srand()函数需要包含头文件#include<stdlib.h> time()函数需要包含头文件#include<time.h>
int input = 0;
//此处的do……while循环暂且省略
return 0;
}
接下来我们再来优化生成随机数的范围,在game部分的注释中,我们可以看到//生成随机数: rand()函数用于生成一个0~RAND_MAX(最大值32767)的随机数,但是题目要求生成随机数的范围为0~100,这样我们用 int ret = rand()%100+1;来解决范围问题
接下来我们来继续写game()部分 生成随机数之后我们进行第二步猜数字,同时,我们希望游戏可以玩多次,这里使用while()循环,参考值为1;一直执行!
下面是game()部分的完整代码:
game()
{
int guss = 0;
//生成随机数: rand()函数用于生成一个0~RAND_MAX(最大值32767)的随机数
int ret = rand()%100+1;
//printf("%d\n", ret); 测试上面使用的
//猜数字
while (1)
{
printf("请输入猜的数字:>");
scanf("%d", &guss);
if (guss < ret)
{
printf("猜小了\n");
}
else if (guss < ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了!\n");
break;
}
}
}
运行示例:
到此,小游戏设计完成,下面是完整的设计代码:
//猜数字游戏
//电脑产生一个随机数(1-100)
//猜数字,根据输入的数字 输出“猜大了”/“猜小了” 直到猜对了结束
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("********************\n");
printf("********1.play*******\n");
printf("********0.exit*******\n");
printf("********************\n");
}
game()
{
int guss = 0;
//生成随机数: rand()函数用于生成一个0~RAND_MAX(最大值32767)的随机数
int ret = rand()%100+1;
//printf("%d\n", ret); 测试上面使用的
//猜数字
while (1)
{
printf("请输入猜的数字:>");
scanf("%d", &guss);
if (guss < ret)
{
printf("猜小了\n");
}
else if (guss < ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了!\n");
break;
}
}
}
int main()
{
srand((unsigned int)time(NULL));
//srand(time(NULL));
//srand()函数需要包含头文件#include<stdlib.h> time()函数需要包含头文件#include<time.h>
int input = 0;
do {
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("猜数字游戏\n");
game();
break;
case 0:
printf("退出游戏!");
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
} while (input);
{
}
return 0;
}