前言
掌握前面的学习知识后,我们就可以适当的写一些稍微有趣的代码,比如猜数字游戏
游戏要求:
- 随机生成1~100的生成数
- 猜数字的过程中,我们在猜数字的过程中,电脑会提示猜大了,还是猜小了,直到猜对,游戏结束
1.随机数生成
想要完成猜数字游戏,首先就要想如何产生随机数字呢?
rand:
C语言提供了一个函数叫做rand,这个函数是可以生成随机数的
函数原型如下
int rand(void);
rand函数会返回一个伪随机数,这个伪随机数的范围是在0~rand_max之间,这个rand_max的大小是依赖编译器上实现的,但是大部分的编译器上面为32767。
在使用rand()函数之前必须包含一个头文件<stdlib.h>
接下来我代码测试一下
#include<stdio.h>
#include<stdlib.h>
int main() {
//rand()会随机出一个伪随机数
//rand生成的随机数默认种子数为1
int r = rand();
printf("%d\n",r);
r = rand();
printf("%d\n", r);
r = rand();
printf("%d\n", r);
r = rand();
printf("%d\n", r);
return 0;
}
运行一次结果: 运行二次结果:
我们会发现这两次调试随机数都是相对随机的,但是第一次运行和第二次运行没有变化,这是为什么呢?
其实rand函数其实返回的是一个伪随机数,伪随机数不是真正的随机数,是通过某种算法生成的随机数,真正的随机数是不会预测到下一个值是多少的,而rand函数是对一个叫“ 种子 ”的基准值进行运算的随机值。
每次运行结果都是一样的,rand()函数默认的种子数为1
srand:
C语言又提供另一种函数叫做srand,它是用来初始化随机数的生成器
函数原型如下
void srand(unsigned int send);
程序中在调⽤rand函数之前先调⽤srand函数,通过srand函数的参数seed来设置rand函数⽣成随 机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了。
那也就是说将srand的种子随机,我们就能做到真正能实现生成随机数
time:
在程序中我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的
C语言提供了一个函数叫做time,在使用前必须包含一个头文件<time.h>
函数形式如下
time_t time(time_t*timer);
time函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t类型本质上其实就是32位或者64位的整型类型
time函数的参数timer如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存 中带回去
如果返回的值是NULL,那么只就返回这个时间的差值。time函数返回的这个时间也叫做:时间戳
如果只是让time函数返回时间按戳,就直接写成
time(NULL);
那么我们现在就可以写些代码来测下
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main() {
int r;
// srand(unsigned int send)
// 可改变rand生成的随机数默认的种子数
srand((unsigned int)time(NULL));
r = rand() % 100 + 1;
printf("%d\n",r);
r = rand() % 100 + 1;
printf("%d\n",r);
r = rand() % 100 + 1;
printf("%d\n",r);
r = rand() % 100 + 1;
printf("%d\n",r);
return 0;
}
运行多次:
运行多次后,发现不会在重复了
注意:截图只是当前运行结果,会和你的运行结果不符
设置随机数的范围
如果我们要生成0~99的随机数
rand() % 100 //余数范围是0~99
如果我们要生成0~100的随机数
rand() % 100 + 1 // 余数是0~100
如果我们要生成a~b的随机数
a + rand() % (b - a + 1)
猜数字游戏实现
参考代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//猜数字游戏
void menu() {
printf("*************************\n");
printf("******* 1.PLAY ********\n");
printf("******* 0.EXIT ********\n");
printf("*************************\n");
}
void game() {
//生成1~100的随机数
int guess = 0;
int r = rand() % 100 + 1;
int count = 5;
while(count) {
// 只有5次机会
printf("还有%d次机会\n", count);
printf("请猜数字=>");
scanf("%d", &guess);
if (guess > r) {
printf("猜大了!\n\n");
}
else if (guess < r) {
printf("猜小了!\n\n");
}
else {
printf("恭喜你猜对了!!!正确的数字是: %d\n",r);
break;
}
count--;
continue;
}
if (count == 0) {
printf("你的次数已经用完了,你失败了,正确数字是: %d\n ",r);
}
}
int main() {
int option = 0;
srand((unsigned int)time(NULL));
do {
//生成简易的菜单
menu();// 调用函数
printf("请选择=> 1 or 0\n");
scanf("%d", &option);
switch(option)
{
case 1:
//开始游戏
game();//调用函数
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新选择。\n");
break;
}
} while (option);
return 0;
}