用C语言编写猜数游戏#C语言

 展示程序与程序解析

 一、展示程序与效果

        程序如下:

# 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);
	}

}

猜数游戏,好玩指数???