猜数字游戏代码

#include
#include   //rand和srand的库函数
#include     //时间戳的库函数

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          //rand和srand库函数

#include           //time函数的库函数

srand((unsigned int)time(NULL));  //先生成随机数种子

int  ret =rand();                //随机数赋值给变量ret

所以就生成了ret这个随机数

注:因为时间戳返回类型与srand并不相同,vs运行会报警告,所以用(unsigned int)强制转换一下类型即可

你可能感兴趣的:(游戏,c语言)