要求:
1)电脑会生成一个随机数
2)玩家猜数字,若猜的比生成的随机数大,系统会提示“猜大了”;同理猜小也是,直到猜对.
首先,我们得知道C语言生成随机数的操作.这与rand()函数、srand()函数、time_s()函数相关.
rand()函数:
函数原型:int rand(void);
它返回的类型为整型,且包含在头文件stdlib.h中.但当我们写出如下代码:
int main()
{
int num = 0;
int i = 0;
for (i = 0; i < 10; i++)
{
num = rand();
printf("%d ", num);
}
return 0;
}
但我们不同时间运行多次,都是如下结果:
所以rand()函数并不是生成随机数的函数,甚至我们可以预测它的随机序列.
- 为什么每次生成的数字是固定的?
rand()函数每次生成的数字与所谓的"种子"有关.使用rand()函数之前要使用srand()函数进行种"种子".若没有使用srand()函数,系统会默认给1,导致每次生成随机数一样.
srand()函数:
函数原型:
void srand(unsigned seed);//unsigned seed无符号种子
但当调用srand()函数传入一个种子时,这样生成随机数仍是固定的(因为种子不变,类似系统默认给的1).
解决方法:将系统时间作为种子,因为以系统时间为种子,达到不同的结果(时间是一直在改变的)。
时间函数time(): 利用时间函数time()获取系统时间(其返回值time_t一定是数值类型)。time()的参数是一个time_t类型对象的地址,时间值则存储在该地址中。time(NULL)和time(0)返回的是系统的时间,从1970年1月1日0点0分0秒算起,单位为秒,包含在头文件time.h中。 综上得出:srand((unsigned)time(NULL));
由上得:
至此,生成随机数的任务就完成啦!
那该如何固定随机数的范围呢?
常用方法:随机数取模+1(比如随机数%100,结果在0-99之间,加1后便在1-100之间)
代码实现如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()//关于菜单的函数
{
printf("***********************************\n");
printf("**** 1.进入游戏 0.退出游戏 ****\n");
printf("***********************************\n");
}
void game()//关于游戏实现的函数
{
int guess = 0;
int ret = rand() % 100 + 1;//生成1-100的随机数
int count = 1;//计数变量来实现猜数字次数
printf("游戏开始,你有10次机会,请猜数字:>\n");
while (1)
{
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了,你还有%d次机会\n",10-count);
count++;
}
else if (guess > ret)
{
printf("猜大了,你还有%d次机会\n",10-count);
count++;
}
else
{
printf("恭喜你,用了%d次猜对了\n",count);
system("pause");
system("cls");
break;
}
if (11 == count)//count从1加起,加10次1是11
{
printf("猜数字次数用尽,游戏失败\n");
system("pause");
system("cls");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned)time(0));
do
{
menu();
printf("请选择(1/0):\n");
scanf("%d", &input);
switch (input)//switch语句选择是否进行游戏
{
case 0:
printf("退出游戏\n");
break;
case 1:
game();
break;
default:
printf("输入有误,请重新输入(1/0):\n");
}
} while (input);
return 0;
}
其中,system(“pause”)可以实现冻结屏幕;system(“cls”)可以实现清理屏幕。
通过游戏的技巧就是二分查找法!