展示程序与程序解析
一、展示程序与效果
程序如下:
# define _CRT_SECURE_NO_WARNINGS 1 # include <stdio.h> # include <stdlib.h> # include <time.h> void menu()//开始选择是否开始游戏 { printf("******************** "); printf("**** 1.开始游戏 **** "); printf("**** 0.退出游戏 **** "); printf("******************** "); printf("请选择是否开始游戏:>"); } void game()//选择开始游戏后进入游戏 { int guess; srand((unsigned int)time(NULL));//下面的讲解 int ret = rand()%100; //生成一个随机的100以内的数字(不包括100,想包括100就在后面+1) int count = 5;//一共有5次机会 while (count) { printf("您还有%d次机会 ", count); printf("请输入一个数字:>"); scanf("%d", &guess); if (guess == ret) { printf("恭喜您猜对了!!! "); break; } else if(guess < ret) { printf("猜小了! "); } else if (guess > ret) { printf("猜大了! "); } count--; } if (count == 0) { printf("很遗憾,五次机会用完,挑战失败,答案是%d ",ret); } } int main() { int input; do { menu(); scanf("%d", &input); switch (input) { case 1://选择1进入game()函数进入游戏 game(); break; case 0: printf("期待您的下次游戏 "); break; default: printf("输入错误,请重新输入 "); break; } } while (input);//选择0,退出游戏即推出循环 return 0; }
VS运行效果如下:
二、程序解析
一共两个部分,一为相关知识讲解,二为函数讲解
第一部分:相关知识随机数
想必各位看到srand((unsigned int)time(NULL));时一定相当困惑这是什么玩意儿?啊我上过翁恺老师的课,明明rand()就可以生成一个随机数为什么还要用一个srand()呢?
其实rand()生成的数是受srand(n)里面的n控制的,当n不变时,rand()生成的数的是相同的,单一次看的话确实时随机的,但是多运行几次,就会发现(如图所示,运行了两次)所以从多次运行的结果来看rand()并不是真正的随机数。
不加srand()时(并不表示没有srand,系统会给你默认n = 1):
VS第一次运行:
VS第二次运行:
后面运行多少次都是一样的一组数,单次运行随机,多次运行相同
加上srand(n):n = 1;运行多少次都一样的数字组和,顺序都一样
......
改变n,n = 0;
哈哈哈哈也可以把srand()弄到循环里面去
所以rand()生成的数和srand()相关,那么rand()就不是真正的随机数。
那么问题又来了,srand里面是数不断改变的时候,rand()才是随机数,那么srand()里面的数从哪里来呢,那么time()就登场了,time()是什么?time()返回的值就是时间戳,是指的现在的时间,距离1970年1月1日经过了多少秒,你运行程序的北京时间不同那么time返回给srand 的数字就是一个一直在改变的数,由此rand()生成的数就是真正随机的数字。
计算时间戳的网站:时间戳(Unix timestamp)转换工具 - 在线工具
那么srand((unsigned int)time(NULL));和rand();就生成了一个随机的数。
第二部分:函数讲解
int main() { int input; do { menu(); //程序运行到这里会展示 //******************** //**** 1.开始游戏 **** //**** 0.结束游戏 **** //******************** scanf("%d", &input); switch (input) { case 1://选择1进入game()函数进入游戏 game(); break; case 0: printf("期待您的下次游戏 "); break; default: printf("输入错误,请重新输入 "); break; } } while (input);//选择0,退出游戏即推出循环 return 0; }
主函数在do while循环中调用了两个函数menu()和game()
menu()就显示了一个游戏开始的界面,让你选择进入游戏还是不进入游戏
void menu()//开始选择是否开始游戏 { printf("******************** "); printf("**** 1.开始游戏 **** "); printf("**** 0.退出游戏 **** "); printf("******************** "); printf("请选择是否开始游戏:>"); }
game()就是当你选择进入游戏后,会随即生成一个100以内的数字,你有5次机会进行猜测,猜对和次数用完没猜对,回到do while的循环开始,又重新展示menu()的游戏开始界面,如此循环
void game()//选择开始游戏后进入游戏 { int guess; srand((unsigned int)time(NULL));//下面的讲解 int ret = rand()%100; //生成一个随机的100以内的数字(不包括100,想包括100就在后面+1) int count = 5;//一共有5次机会 while (count)//机会用完跳出循环 { printf("您还有%d次机会 ", count); printf("请输入一个数字:>"); scanf("%d", &guess); if (guess == ret) { printf("恭喜您猜对了!!! "); break;//猜对了就可以跳出循环 } else if(guess < ret) { printf("猜小了! "); } else if (guess > ret) { printf("猜大了! "); } count--; } if (count == 0)//机会用完都没有猜出正确的数字 { printf("很遗憾,五次机会用完,挑战失败,答案是%d ",ret); } }
猜数游戏,好玩指数???