目录
思路:
1.电脑产生一个随机数
2.猜数字:a.猜大了 b.猜小了 c.猜中了
分析:
菜单函数:
void menu() { printf("########################\n"); printf("########1.play#########\n"); printf("########0.Exit#########\n"); }
游戏函数:
1.产生随机数:
a.需要调用rand函数,rand()%100+1表示的是产生一个在1至100的随机数。
原因:任意一个数对100取余数结果必小于100,在加上1则是产生100以内的随机数。
如果对rand函数的概念不理解,可以查一下:
编辑
b.由上面这个图知道rand随机的范围是0到RAND_MAX,RAND_MAX是7fff(十六进制),转化为十进制是32767,但是如果你只是这样设计的话,你将会发现: 运行这个程序产生随机值后,关闭再运行,会发现两次运行的结果对应的位置随机相同!!!
如下图:
编辑
c.如果每一轮对应位置的随机值都相同的话,可能与我们的预期不相同,因此我们需要再修改一下!!!那修改什么呢?答案在上上个图:
编辑
就是最后一句话:
Use the srand function to seed the pseudorandom-number generator before calling rand.
意思:调用rand函数前要调用srand函数进行产生随机数生成器。
2.而srand函数:
Sets a random starting point.设置一个随机的起点。
调用它是:srand(unsigned int seed)这里要放一个时刻变化量,否则产生的随机值是不变的。
编辑
而什么是时刻可以变化的呢?答案不言而喻,时间呗。
那怎么输入一个时间呢?那么我们需要理解一个给概念:时间戳
编辑
在C语言中有一个函数可以输出时间戳:time函数
编辑
由此调用scrand函数是这样的: srand((unsigned int)time(NULL));
而且这个调用要写在主函数,而不是game函数,因为如果输入过快,则导致两次随机值相同:
编辑
game函数源码:
void game() { int guess = 0; int ret = rand() % 100 + 1; printf("%d\n", ret); while (1) { printf("guess the number:"); scanf("%d", &guess); if (guess > ret) { printf("guess a bigger!\n"); } else if (guess < ret) { printf("guess a litter!\n"); } else { printf("Find!\n"); break; } } }
源码:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> void menu() { printf("########################\n"); printf("########1.play#########\n"); printf("########0.Exit#########\n"); } void game() { int guess = 0; int ret = rand() % 100 + 1; printf("%d\n", ret); while (1) { printf("guess the number:"); scanf("%d", &guess); if (guess > ret) { printf("guess a bigger!\n"); } else if (guess < ret) { printf("guess a litter!\n"); } else { printf("Find!\n"); break; } } } int main(void) { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("please choose :->"); scanf("%d", &input); switch (input) { case 1:game(); break; case 2:printf("EXIT\n"); break; defalut: printf("Choose wrong! again choose!\n"); break; } } while (input); return 0; }
运行结果截图:
编辑