猜数字游戏代码
#include<stdio.h>
#include<stdlib.h> //rand和srand的库函数
#include<time.h> //时间戳的库函数
void menu() //打印菜单面板
{
printf("************************\n");
printf("***** 1.play *****\n");
printf("***** 0.exit *****\n");
printf("************************\n");
}
void game() //猜数字游戏的函数
{
int guess = 0; //玩家猜的数字
int ret = rand()%100+1; //控制随机数的范围在1-100之内
while (1)
{
printf("请输入您想要猜的数字:\n");
scanf("%d", &guess); //玩家猜数字
if (guess > ret)
{
printf("猜大了\n");
}
else if (guess < ret)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜对了,数字是%d\n", ret);
break;
}
}
}
int main()
{
srand((unsigned int)time(NULL));//生成随机数rand的种子,使用时间戳来改变种子的值,同时强制转换为unsigned int类型(即无符号整数)
int input = 0;
do
{
menu(); //调用打印菜单函数
printf("请选择:\n");
scanf("%d", &input); //输入选择开始还是结束
switch(input)
{
case 1:
printf("游戏开始\n");
game(); //进入游戏的函数
break;
case 0:
printf("游戏结束\n");
break;
default: //既不是1也不是0
printf("选择错误,请重新选择\n");
break;
}
} while (input); //如果为0即跳出do while循环
return 0;
}
知识点:
c语言提供了一个生成随机数的函数——rand(void),返回值的类型为int;
但rand函数需要srand生成种子数(rand函数就仿佛像一颗大树,但一开始需要一颗种子才能让rand这颗大树生长),但srand默认的种子数为1,如果不改变种子数,那么rand生成的随机数每次都是那几个随机数,就不随机了(就好比拿两颗一模一样的种子,那么两个rand长成两颗大树,虽然与其他大树不一样,是随机生长的,但他们两个是用同样的种子发育而来,所以这两颗大树是一模一样的,所以哪怕下次又种一颗大树,但还是用之前同样的种子,那么不用等它长成大树,也已经知道它与前面那两颗大树一模一样,因此就不再随机了,就变成可预见的了)
所以我们就需要不停改变srand种子数,如果rand函数生成随机数需要srand函数,而srand函数又需要随机数改变种子数,那么就陷入了死循环。但其实srand不一定需要随机数,只是需要不同的种子数而已(比如有一个东西它是1,2,3……,98,99,100;它虽然是有规律,不是随机数,但它确实是不同的数字,那么就可以当作srand的种子数)
那么这个东西就是时间戳
time(NULL)
它会返回1970年1月1日0时0分0秒到现在此刻时间的差值,因为时间不能倒流,所以这个差值永远也不会重复,虽然有规律但是却永不重复,非常符合上面需要的要求。(time具体函数内容可以到cpulspuls使用手册上了解)
总结:
#include<stdlib.h>? ? ? ? ? //rand和srand库函数
#include<time.h>? ? ? ? ? ?//time函数的库函数
srand((unsigned int)time(NULL));? //先生成随机数种子
int? ret =rand();? ? ? ? ? ? ? ? //随机数赋值给变量ret
所以就生成了ret这个随机数
注:因为时间戳返回类型与srand并不相同,vs运行会报警告,所以用(unsigned int)强制转换一下类型即可
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!