写一个猜数字游戏
游戏要求:
- 电脑自动生成1~100的随机数
- 玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了或小了的反馈,直到猜对,游戏结束。
如何生成一个随机数?
让我们来认识一个新函数,C语言中提供的一个函数rand,这个函数是可以生成随机数的,函数原型如下所示:
int rand (void)
rand函数会返回一个伪随机数,这个随机数的范围在0-RAND_MAX之间,这个RAND_MAX的大小是依赖编译器上实现的。
rand函数的使用需要包含头文件是:stdlib.h。
现在来测试一下rand函数。
#include
#include
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函数生成的随机数是伪随机,伪随机数不是真正的随机数,是通过某种算法生成的随机数。真正的随机数的是无法预测下一个值是多少的。而rand函数是对一个叫“种子”的基准值进行运算生成的随机数。
之所以每次运行程序产生的随机数序列是一样的,那是因为rand函数生成随机数的默认种子是1。如果要生成不同的随机数,就要让种子是变化的。
C语言中又提供了一个函数叫 srand函数,通过srand函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,每次生成的随机数序列也就变化起来了。
也就是说srand的种子如果是随机的,rand就能生成随机数;在生成随机数的时候又需要一个随机数,这就矛盾了。
void srand (unsigned int seed);
在程序中我们一般是使用程序运行的时间作为种子的,因为时间时刻在发生变化的。
在C语言中有一个函数叫time,就可以获得这个时间,time函数原型如下(包含头文件:time.h):
time_t time (time_t* timer);
//vs2022上的time_t类型的说明
#ifndef _CRT_NO_TIME_T
#ifndef _USE_32BIT_TIME_T
typedef __time32_t time_t;
#else
typedef __time64_t time_t;
#endif
#endif
typedef long __time32_t;
typedef __int64 __time64_t;
如果只是让time函数返回时间戳,我们就可以这样写:
time(NULL);
那我们就可以让生成随机数的代码改写如下:
srand函数是不需要频繁调用的,你的运行结果不一定和这个一样。
#include
#include
#include
int main()
{
//使用time函数的返回值设置种子
//因为srand的参数是unsigned int类型,将time函数的返回值强制类型转换
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;
}
如果要生成0-99之间的随机数,方法如下:
rand() %100;//余数的范围是0-99
如果要生成1-100之间的随机数,方法如下:
rand() %100+1;//%100的余数的范围是0-99,0-99的数字+1,范围是1-100
如果要生成100-200之间的随机数,方法如下:
100 + rand() %(200-100+1)
//余数的范围是0-100,加100后就是100-200
如果要生成a-b的随机数,方法如下:
a + rand() %(b-a+1)
参考代码:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
void menu()
{
printf("**********************\n");
printf("****** 1.Play ******\n");
printf("****** 0.Exit ******\n");
printf("**********************\n");
}
void game()
{
int guess = 0;
int ret = rand() % 100 + 1;
while (1)//猜数字是循环多次的,所以使用循环语句
{
printf("Please enter a number:>");//由于猜数字也是多次进行的,所以要包含在循环之中
scanf("%d", &guess);
if (guess < ret)
{
printf("Guess it's too small\n");
}
else if (guess > ret)
{
printf("Guess it's too big\n");
}
else
{
printf("Correct answer\n");
break;//数字猜对后,跳出循环
}
}
}
int main()//首先考虑一下游戏的界面和步骤
{
int input = 0;
srand((unsigned int)time(NULL));
do {//考虑到可以多次进行游戏,所以使用循环
menu();//首先是游戏的菜单界面,显示了游戏的选择项目
printf("Please select:>");//作为引导显示
scanf("%d", &input);//输入是否进行游戏
switch (input) {
case 1://输入1时,游戏开始
game();//跳转至游戏的代码
break;//记得带上break
case 0://输入0时,退出游戏
printf("Exit the game\n");
break;
default://输入其他字符,显示错误
printf("Error\n");
break;
}
} while (input);//根据input值,判断是否再次进入循环
//0为假,非0为真
return 0;
}
还可以加上猜数字的次数限制,如果5次猜不出来,就算失败:
#include
#include
#include
void menu()//菜单设计
{
printf("**********************\n");
printf("****** 1.Play ******\n");
printf("****** 0.Exit ******\n");
printf("**********************\n");
}
void game()
{
int guess = 0;
int ret = rand() % 100 + 1;//随机值的范围是1-100
int count = 5;
while (count)//可以猜测的机会
{
printf("You have %d opportunities\n",count);//提示给多少次机会
printf("Please enter a number:>");//由于猜数字也是多次进行的,所以要包含在循环之中
scanf("%d", &guess);
if (guess < ret)
{
printf("Guess it's too small\n");
}
else if (guess > ret)
{
printf("Guess it's too big\n");
}
else
{
printf("Correct answer\n");
break;//数字猜对后,跳出循环
}
count--;//每输入一次,机会减1
}
if (count == 0)
{
printf("Unfortunately, the game has ended. The answer is %d\n", ret);
}
}
int main()//首先考虑一下游戏的界面和步骤
{
int input = 0;
srand((unsigned int)time(NULL));
do {//考虑到可以多次进行游戏,所以使用循环
menu();//首先是游戏的菜单界面,显示了游戏的选择项目
printf("Please select:>");//作为引导显示
scanf("%d", &input);//输入是否进行游戏
switch (input) {
case 1://输入1时,游戏开始
game();//跳转至游戏的代码
break;//记得带上break
case 0://输入0时,退出游戏
printf("Exit the game\n");
break;
default://输入其他字符,显示错误
printf("Error\n");
break;
}
printf("\n");//让每一关游戏之间有间隔隔开,更清晰
} while (input);//根据input值,判断是否再次进入循环
//0为假,非0为真
return 0;
}