目录
游戏需求:
1.随机生成一个1-100之间的数
2.会随着你猜的数字来提示
3.玩完一次游戏会紧接着下一次
这里需要先了解一下随机数的知识:
rand
C语言提供了一个函数rand,这个函数可以生成随机数
rand的原型:
int rand(void);
rand函数会返回一个伪随机数,这个随机数的范围是在0~RAND-MAX之间.RAND-MAX依靠编译器来实现,其中大部分的编译器是32767
rand函数需要头文件 stdlib.h
rand函数是通过某种算法,是对一个叫"种子"的基准值进行运算生成的随机数,其种子的默认值是1,
所以它生成的数字都是按种子内的数字依次输出。想要真正的随机,就要种子不断变化。
srand
为了解决随机数的种子问题,C语言又提供了一个函数,srand函数。它用来初始化随机数的生成器的
原型:
void srand (unsigned int seed)
参数seed是用来设置rand函数生成随机数的种子
但又有一个问题,想要真正的随机,必须要使种子不断变化,难道要咱们不停使用srand函数吗?这也太麻烦了
time
为了解决上述问题,就要让参数seed不断变化,那什么是不断变化的呢?是时间。
在程序中我们一般使用程序的运行的时间作为种子,time函数可以获得这个时间
原型:
time_t time (time_t* timer)
返回值类型是time_t类型,其类型本质是32位或64位的整型类型
time函数需要头文件 time.h
time函数会返回1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒,这个时间差也被叫做:时间戳
time函数的参数类型是time_t*,是个指针。
- 非NULL的指针,函数会将返回的差值放在timer指向的内存中带回
- NULL的指针,只会返回这个时间的差值
注:在这里,我们只需要返回时间戳就行了,也就是说这样写就可以了 将time(NULL)代入参数seed
代码:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void begin() //游戏开头
{
printf("*猜数字游戏*\n");
printf("*1:开始游戏*\n");
printf("*0:结束游戏*\n");
}
void game() //游戏主体
{
int r = rand(srand) % 100 + 1; //生成随机数
int num = 0;
printf("\n");
printf("请输入一个0-100的整数\n");
while (1) //判断提示部分
{
scanf("%d", &num);
if (num < r)
printf("数字小了\n");
else if (num > r)
printf("数字大了\n");
else {
printf("恭喜你答对了,数字是%d\n", num);
printf("\n");
break;
}
}
}
int main() {
srand((unsigned int)time(NULL)); //建立不断改变的种子
int n = 0;
do {
begin(); //使用begin函数
scanf("%d", &n); //游戏开始和结束的判断
if (n == 1) {
game(); //使用game函数
}
else if (n == 0) {
printf("游戏结束,请下次再来\n");
break;
}
else {
printf("\n");
printf("选择错误,请输入1或0\n");
}
} while (1);
return 0;
}
这只不过是解法的一种,你来试试别的吧。