猜数字游戏(C语言)
猜数字游戏
编译环境VS2017
猜数字游戏,顾名思义,是需要人们猜测一个未知但已确定的数,此问题中还规定了范围0~99。其中,这个未知但要确定的数就要由编写程序来产生,当这个数生成后我们猜数字,程序告诉我们猜的高了,低了,或猜对了来提示我们猜数。
这个未知但已确定的数我们可以用随机数来代替,运用rand()函数可以产生产生随机数,但产生的随机数并不是真正意义上的随机数,因为rand的内部实现是用线性同余法做的,他并不是真的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的。 rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。rand ()产生的是假随机数字,每次执行时是相同的。若要不同,以不同的值来初始化它.初始化的函数就是srand()。 srand()用来设置rand()产生随机数时的随机数种子。其参数必须是个整数,通常可以利用time(0)的返回值来当做参数。如果每次参数都设相同值,rand()所产生的随机数值每次就会一样。 例如:当不设置随机数种子时每次产生随机数都一样,如下
int num[10]; for (int i =0; i < 10; ++i) { num[i] = rand()%100; printf("%d ", num[i]); }
这段代码每次运行产生的随机数列都不变如下: 当设置变化的随机种子后 即添加代码srand((unsigned int)time(0));
int num[10]; srand((unsigned int)time(0)); for (int i =0; i < 10; ++i) { num[i] = rand()%100; printf("%d ", num[i]); }
即运行结果为: 再次运行结果为 可以看出,设置变化的时间戳作为随机种子后生成的随机数组不再重复 需要注意的是time(0)返回值与srand()中参数类型并不同,srand()中参数类型为unsigned int型,为避免警告,需要进行类型强制转换 具体实现如下:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<time.h> void Menu() { printf("************************** "); printf(" 1.开始游戏 "); printf(" 0.退出游戏 "); printf("************************** "); printf("请输入您的选择 "); } void fun() { int x; srand((unsigned int)time(0));//用时间戳来改变每次产生的随机数序列 int to_guess = rand() % 100;//产生0到99的随机整数 while (1) { printf("请输入您猜的数字 "); scanf("%d", &x); if (x > to_guess) { printf("高了 "); } else if (x < to_guess) { printf("低了 "); } else { printf("猜对了 "); break; } } } int main() { int num; Menu(); scanf("%d", &num); system("cls"); if (num == 1) { fun(); } if (num == 0) { printf("再见! "); } system("pause"); return 0; }
运行结果如下: 再次运行后: