游戏规则:1.电脑自动生成1-100的随机数;
2.猜数字过程中,根据猜测数据的大小给出提示,比如大了还是小了,直到猜对为止。
目标一:随机数的生成
1.rand函数
c语言中有一个函数:rand,可以生成伪随机数,函数原型如下:
int rand (void);
这个位随机数的范围在0~RAND_MAX之间,这个RAND_MAX的大小是依赖编译器上实现的,但是大部分编译器上是32767。在使用rand函数时,需要包含头文件:stdlib.h。
我们使用rand函数生成五个随机数。
#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函数是通过某种算法生成的随机数,对一个叫”种子“的基准值进行运算生成的随机数。在我们刚运行的程序中,默认种子是1。如果我们让这个种子变化,那生成的随机数也会跟着变化。
2.srand函数
c语言中又提供了函数叫srand,用来初始化随机数的种子,也就是说,通过srand函数的参数来设置rand函数生成随机数的时候的种子,只要种子变化,每次生成的随机数也就跟着变化。srand的原型如下:
void srand (unsigned int seed);
3.time函数
在程序中我们一般是使用运行的时间作为种子,因为时间是时刻在变化的。我们可以通过time函数来获取这个时间。time函数使用时,需要包含头文件:time.h。time函数的原型如下:
time_t time (time_t* timer);
time函数会返回当前日历时间,其实返回的是1970年1月1日0时0点0分0秒到现在程序运行时间之间的差值(这个时间差值也被叫做时间戳),单位是秒。返回的类型是time_t类型的,time_t类型本质上是32位或64位的整型类型。
time函数的参数timer,如果是非NULL(非空)的指针的话,函数也会将这个差值放在timer指向的内存中带回去。如果timer是NULL,就只返回时间戳。
time(NULL); //只让time函数返回时间戳
那么我们生成随机数的代码改写如下:
#include <stdio.h>
#include <stdlib.h>//随机数头文件
#include <time.h>//time函数的头文件
int main()
{
//(unsigned int)强制类型转换为无符号的int类型 time(NULL)表示返回时间戳
srand((unsigned int)time(NULL));
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
运行几次我们就可以看到差异。这里要注意,加了 srand((unsigned int)time(NULL)) 之后生成的仍然是伪随机数,不是真随机数。这是因为time(NULL)让程序每次启动的时种子不同,使序列每次都变,算法仍然是固定公式计算出来的序列,只是起点变了,如果知道启动时间就能重现整个序列。
4.设置随机数范围
我们要生成0~99之间的随机数,方法如下:
rand( ) % 100; // 余数的范围是0~99
如果要1~100之间,我们可以给其+1就可以实现:
1 + rand( ) % 100; // %100余数的范围是0~99,(0~99) + 1 = (1~100)
如果要生成100~200呢:
100 + rand( ) % (200 - 100 + 1); // rand( ) % (200 - 100 + 1)的余数范围为0~100
// +100后,余数范围变为 100~200
如果想要生成a~b呢:
a + rand(b - a + 1);
目标二:猜数字游戏实现
第一版:基本实现游戏过程,猜对后结束游戏。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>//随机数头文件
#include <time.h>//time函数的头文件
int main()
{
int guess = 0; //存储玩家猜测的数字
int r = 0; //存储随机数
//设置随机数的种子(当前的时间)
srand((unsigned int)time(NULL));
//生成1~100的随机数
r = 1 + rand()%100;
while (1)
{
printf("请猜数字:");
//获取玩家输入
scanf("%d", &guess);
if (guess > r)
{
printf("猜大了\n");
}
else if (guess < r)
{
printf("猜小了\n");
}
else
{
printf("猜对啦\n");
break;//跳出循环
}
}
return 0;
}
第二版:我们增加菜单,可供用户选择继续玩游戏还是退出游戏;采用函数将代码分块处理。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>//随机数头文件
#include <time.h>//time函数的头文件
//完成菜单功能
void menu()
{
printf("*************************\n");
printf("*********1. play*********\n");
printf("*********0. exit*********\n");
printf("*************************\n");
}
//游戏逻辑
void game()
{
//1.生成随机数
int r = 1 + rand() % 100;
//猜数字
int guess = 0;
while (1)
{
printf("请猜数字:");
scanf("%d", &guess);
if (guess > r)
{
printf("猜大了\n");
}
else if (guess < r)
{
printf("猜小了\n");
}
else
{
printf("猜对啦\n");
break;
}
}
}
int main()
{
printf("欢迎来到猜数字游戏\n");
int input = 0;
//设置随机数生成起点,整个工程中只需要调用一次
srand((unsigned int)time(NULL));
do
{
//打印菜单
menu();
//选择
printf("请选择:\n");
scanf("%d", &input);
switch (input)
{
case 1:
//玩游戏的逻辑
game();
break;
case 0:
printf("游戏结束!!!\n");
break;
default:
printf("输入错误,请重新输入:\n");
break;
}
}
while (input);
return 0;
}
第三版:我们增加次数限制。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>//随机数头文件
#include <time.h>//time函数的头文件
//完成菜单功能
void menu()
{
printf("*************************\n");
printf("*********1. play*********\n");
printf("*********0. exit*********\n");
printf("*************************\n");
}
//游戏逻辑
void game()
{
//1.生成随机数
int r = 1 + rand() % 100;
//猜数字
int guess = 0;
//增加次数限制
int count = 5;
while (count)
{
//次数提示
printf("还有%d次机会\n", count);
printf("请猜数字:");
scanf("%d", &guess);
if (guess > r)
{
printf("猜大了\n");
}
else if (guess < r)
{
printf("猜小了\n");
}
else
{
printf("猜对啦\n");
break;
}
//每猜一次,次数减少一次
count--;
}
//机会用完,可以给出正确值
if (count == 0)
{
printf("机会用完啦,游戏失败,答案是%d\n",r);
}
}
int main()
{
printf("欢迎来到猜数字游戏\n");
int input = 0;
//设置随机数生成起点,整个工程中只需要调用一次
srand((unsigned int)time(NULL));
do
{
//打印菜单
menu();
//选择
printf("请选择:\n");
scanf("%d", &input);
switch (input)
{
case 1:
//玩游戏的逻辑
game();
break;
case 0:
printf("游戏结束!!!\n");
break;
default:
printf("输入错误,请重新输入:\n");
break;
}
}
while (input);
return 0;
}