C语言猜数字游戏(rand函数)
首先声明,此博客不照搬抄袭,存在自己的见解,我所使用的编译器是VS2022
一、游戏规则
电脑随机生成一个1~100的随机值
玩家猜值,并给出相应的猜大猜小还是猜对的游戏反馈
二、游戏所需函数
(1)rand()函数:用于生成随机值
可以生成一个伪随机数,使用该库函数需要头文件#include <stdlib.h>
#include <stdio.h> #include <stdlib.h> int main() { printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); return 0; }每次调用都会生成一个不一样的随机值
运行截图:
我们再运行一次,运行截图:
我们发现结果依然没变,这是因为我们在调用rand()函数之前,我们需要在主函数里先调用一次srand()函数,才能让rand函数每次调用的返回值都不一样
(2)srand()函数
我们在调用rand()之前,得先调用srand()函数,srand(参数)函数的参数类型是unsigned int,不需要返回值,只要srand()函数里面的参数实时在变,那么rand的返回值就会实时在变,每次生成的值就都会不一样,此时我们需要time()函数的返回值,作为我们srand()函数的参数
int main() { srand(变化的值); return 0; }(3)time()函数
time()函数的作用是返回一个时间戳,而时间戳是时刻都在变化的,它作为srand()的参数正合适,由于我们time()函数并不需要给其他参数去调用,所以我们用time(NULL)
time函数会返回当前的日历时间,其实返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t类型本质上其实就是32位或者64位的整型类型。
// 32位系统 typedef long int time_t; // 64位系统 typedef long long time_t;如果time函数的参数是NULL,那么只会返回当前时间差值,
如果time函数的参数是一个指针,那么会把时间戳差值存入这个指针指向的变量,并返回时间差值
#include <stdio.h> #include <time.h> // time函数必须包含这个头文件 int main() { // 1. 定义time_t类型变量 t // time_t本质就是长整型,存时间戳(秒数) time_t t; // 写法1:time(&t); // 把当前时间戳 存入变量 t 当中 time(&t); printf("time(&t) 方式得到的时间秒数:%lld\n", t); // 写法2:time(NULL) // 只通过返回值获取时间,不存入外部变量 time_t t2 = time(NULL); printf("time(NULL) 方式得到的时间秒数:%lld\n", t2); return 0; }运行截图:
这里我们用time(NULL)更合适,用time(&t)创建了一个多余的指针变量t
然后因为srand函数的参数类型是unsigned int,而time函数的返回值是time_t,所以我们要把time(NULL)的返回值强制类型转化为unsigned int
srand((unsigned int)time(NULL));总结:
此时我们再调用rand()函数时,每次运行就都会创建一个新的srand值,相当于给rand函数创建一个新的种子,使得rand函数每次调用生成的值都可以不一样,做到真正意义上的伪随机值
#include <stdlib.h> #include <time.h> int main() { srand((unsigned int)time(NULL)); int a = rand(); int b = rand(); int c = rand(); int d = rand(); printf("%d\n%d\n%d\n%d\n", a, b, c, d); return 0; }两次运行的截图:
可以发现,两次运行每个变量的值都会成不一样的随机值
三、猜数字游戏代码的实现
游戏总代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> void game() { int r = rand() % 100 + 1; int guess = 0; while (1) { printf("请猜数字>:"); scanf("%d", &guess); if (guess < r) { printf("猜⼩了\n"); } else if (guess > r) { printf("猜⼤了\n"); } else { printf("恭喜你,猜对了\n"); break; } } } void menu() { printf("***********************\n"); printf("****** 1. play ******\n"); printf("****** 0. exit ******\n"); printf("***********************\n"); } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("游戏结束\n"); break; default: printf("选择错误,重新选择\n"); break; } } while (input); return 0; }代码清晰易懂,不做过多赘述,注意一行代码
int r = rand() % 100 + 1;这串代码的作用是:使生成的随机数的值的范围在1~100之间
rand()%100的值为0~99,加1就为1~100
公式:若要生成a~b的随机值:a+ rand()%(b-a+1)
当然也可以扩展功能例如,五次没猜中则游戏失败,游戏结束
文章结语:
我们本章主要学习到的就是rand()函数、srand()函数、time()函数的组合使用,利用这三个函数达到我们想要生成的随机数的效果,但其实底层也是依靠算法的生成的一个伪随机值。还学习到了分支和循环的组合使用,让分支和循环的使用更加得心应手