先给大家分享一个查阅函数的网站:cplusplus.com - The C++ Resources Network
我们通过一道题讲解:实现1-100的猜数字游戏
先将代码大框架罗列出来:
void menu()
{
printf("********** 1.play ***********\n");
printf("********** 0.eixt ***********\n");
}
void game()
{
}
void test()
{
int input = 0;
//注意:input不能定义在循环里面,否则条件判断无法进行
//上来循环得先走一遍,所以用do-while
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("输入错误,重新输入:\n");
break;
}
} while (input);//如果input非0为真,就再次进入循环
}
int main()
{
test();
return 0;
}
一.如何产生随机值
1. rand 函数
rand函数是专门用来生成随机数的,返回的是0~RAND_MAX(32767)之间的一个随机数,需要头文件 #include <stdlib.h>
RAND_MAX是一个值 #define RAND_MAX 0x7fff
用 int 类型来接收
void game()
{
//1.生成随机数
int ret = rand();
printf("%d\n", ret);
//2.猜数字
}
每玩一次游戏,生成一个随机数打印。但是我们发现,每次运行程序,生成的随机数都是一样的,有问题。
2. srand 函数
rand 函数使用前,要调用另一个函数:srand,来设置随机数的生成起点
这里需要给 srand 传一个整数值,那我们给它个0
void game()
{
srand(0);
//1.生成随机数
int ret = rand();
printf("%d\n", ret);
//2.猜数字
}
但这样每次都是38,生成的数不够随机了
那我们这样:
srand(1)
srand(100)
发现:值分别变成了 41 和 365
确实变起来了,所以我们要给 srand 传一个变化的值,电脑上时间一直变化,能不能把时间传进去?
3.时间戳
只要时间在变化,时间戳就在变化,怎么传时间戳呢?
4. time 函数
C语言中,time函数会返回时间戳,srand 需要传一个整型,谁给呢?time 函数
这里的返回值 time_t 本质上是 long long 整型,只是重命名成 time_t 了
需要一个参数,参数是指针,我们不管他,只需要让 time 返回一个值给我们,给他传一个空指针 NULL
需要头文件:#include <time.h>
srand(time(NULL));
这里编译器警告:“函数”: 从“time_t”转换到“unsigned int”,可能丢失数据。
time 函数返回 time_t ,我们把他强制转换为 unsigned int
void game()
{
srand((unsigned int)time(NULL));
//1.生成随机数
int ret = rand();
printf("%d\n", ret);
//2.猜数字
}
运行起来,生成的都是随机数,但是都非常临近。如果按得快,甚至生成的随机数是一样的,还是不够随机
其实,srand 设置随机数生成起点,只要被调用一次就可以了(有一个起点就行)
srand函数在程序中只要调用一次就可以了,不需要频繁调用
上面的代码玩一次游戏,起点就重新设置。所以将 srand 放到 test 函数里,只调用一次
二.缩范围
rand 函数返回 0-32767,但我只要1-100
这样做:
void game()
{
//1.生成随机数
int ret = rand()%100+1;
printf("%d\n", ret);
//2.猜数字
}
rand()%100 —— 0-99
三.整体代码
将游戏 2.猜数字 部分补充完整。下面展示完整代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("********** 1.play ***********\n");
printf("********** 0.eixt ***********\n");
}
void game()
{
int num = 0;
//1. 生成随机数
int ret = rand()%100+1;
//printf("%d\n", ret);
//2. 猜数字
while (1)
{
printf("请猜数字:>");
scanf("%d", &num);
if (num < ret)
{
printf("猜小了\n");
}
else if (num > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
void test()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("输入错误,重新输入:\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注。
小编会以自己学习过程中遇到的问题为素材,持续为您推送文章。