分支和循环·练习
数字游戏:电脑生成1~100的随机数。玩家进行猜数字,根据猜测的数据给出大了或者小了的反馈,直到猜对为止,游戏结束。
1)生成随机数
1.1)首先生成随机数需要用到 rand 函数。函数原型如下:
int rand (void);
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());
return 0;
}
第一次结果:第二次结果:
很明显这不是我们想要的结果。
rand 生成的始终是一个伪随机值,它是对一个叫“种子”的基准值进行运算生成的, rand 函数生成随机数的默认种子是1。
我们要生成不同的随机数,就不要让种子为默认值,而是随机变化的,但首先我们先要让种子初始化,不让它以默认值进行,这个时候就需要用到srand函数。
1.2)srand
原型如下:
viod srand(unsigned int seed);
加上 srand 函数之后,只是让 rand 函数初始化了而已,我们想要真正生成一个随机值,就要让“种子”始终保持一个一直变化的值,还需要用到 time 函数。
1.3)time
原型如下:
time_t time(time_t* timer);
time函数的使用需要包含一个头文件:time.h
time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的差值,单位是秒。
现在我们可以让生成随机数的代码改成如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
//使用time函数的返回值作为种子
//因为srand的参数是unsigned int类型,我们要将time函数的返回值进行强制类型转换
srand((unsigned int)time(NULL));
//NULL指的是调用、time函数返回“时间戳”,没有接受返回值。此处是指针内容,不会细说。
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());
return 0;
}
1.4)随机数范围
如果要生成a~b的随机数,方法如下:
a + rand()%(b-a+1)
例:如果生成100~200之间的随机数
100 + rand()%(200-100+1)
2)游戏实现
#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.开始---------\n");
printf("----------0.结束---------\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");
default:
printf("选择错误,请重新选择\n");
break;
}
}while(input);
return 0;
}