要求:
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”)可以实现清理屏幕。
通过游戏的技巧就是二分查找法!