c语言修炼之猜数字游戏

前言

小伙伴们,今天来学习猜数字游戏叭!废话不多说,让我们一起开始学习叭!

思路:

一打开游戏就出现一个菜单然后可以让我们选择是进入游戏还是退出游戏!

#include<stdio.h>
void menu()
{
	printf("********************************\n");
	printf("****** 0.exit   1.play *********\n");
	printf("********************************\n");
}
int main()
{
	menu();

}

就像这样啦!就可以打印出菜单啦!此时我们要在创建一个变量input用来选择是进入游戏还是退出游戏,并且再提示一下玩家输入选择!

#include<stdio.h>
void menu()
{
	printf("********************************\n");
	printf("****** 0.exit   1.play *********\n");
	printf("********************************\n");
}
int main()
{
	int input = 0;
	menu();
	printf("请输入你的选择:>");
	scanf("%d", &input);
	
	return 0;

}

运行看看叭!

能够发现没有达到我们想要的效果哦!没有进入游戏也没有退出游戏的动作!这时我们应该用switch语句,酱酱们还记得switch语法形式吗?switch语句适用于多分支的情况,其语法形式如下:

switch (常量表达式)
{
case 常量项:
		语句项;
}

利用switch语句时,再来看看效果吧 

是达到了之前想要的效果,但是当我们觉得不过瘾想要再来一把时会发现游戏直接结束了,无法再开一把!这该怎么办呢?没错这里我们需要使用一个循环语句!循环语句有三种该选择哪一个呢?是while,for,还是do while呢?这里我们将选择do while语句还记得它与众不同的特点吗:先执行再判断!先玩一把结束之后再选择要不要继续!

#include<stdio.h>
void menu()
{
	printf("**********************\n");
	printf("**** 0.exit  .play ***\n");
	printf("**********************\n");
}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请输入你选择的值:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("进入游戏\n");
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误\n");
			break;
		}
	} while (input);
	return 0;
}

此时就能达到我们想要的效果啦!让给我们开始分装game函数叭就不再用printf了!game函数的话负责具体实现猜数字的内容!

第一步我们需要产生随机数,此处我们需要用到rand函数!不了解的小伙伴可以去cplusplus网站上去查看

左上角的function表示rand是一个函数,返回类型是int,参数为空,其范围为0到RAND_MAX,在使用rand函数时必须引用头文件stdlib.h画线的部分意思需要用deepl进行翻译

翻译的结果是使用rand之前要先调用srand函数,再来查一下srand函数叭 

 srand返回类型为空,其参数类型要为unsigned int,其主要作用是初始化随机数发生!其头文件为stdlib.h。接下来开始解决遇到的问题叭!我们要产生一个一到一百的数,该怎么得到呢?rand的值的范围是0到RAND_MAX,我们使得rand%100就能得到0到99的值再加上1就能得到1到100之间的数字啦,同时用一个变量接收这个值!一起来看看效果叭

#include<stdio.h>
#include<stdlib.h>
void menu()
{
	printf("**********************\n");
	printf("**** 0.exit  .play ***\n");
	printf("**********************\n");
}
void game()
{
	srand(1);
	int ret= rand() % 100 + 1;
	printf("%d\n", ret);
}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请输入你选择的值:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误\n");
			break;
		}
	} while (input);
	return 0;
}

 貌似不对呀,为啥产生的数不是随机的·而是同一个呢?问题出在哪呢?rand没问题main函数没问题,那就只能是srand出问题了。上面用的是srand(1),那换成srand(2)试试?

 也是一样的欸,那是不是说明srand里需要一个会变化的参数!什么是一直变化的呢?没错就是时间!那么这里我们需要利用时间戳                                                                                                

 此时就要利用time函数,再上cplusplus查一查叭

 time函数返回类型是time_t,参数是指针类型,作用是获取当前时间,头文件是time.h!已经知道了这些我们再对代码进行修改叭

void game()
{
	srand((unsigned int)time(NULL));
	int ret= rand() % 100 + 1;
	printf("%d\n", ret);
}

 

 是产生值了,但是貌似不够随机!这又是因为什么呢?好叭,问题还是出现在srand函数上!在这里我们调用一次就行,不需要玩一次调用一次!直接放在main函数中即可,再来试试叭酱酱们

运行一下试试叭!

此时就能达到我们想要的结果啦!在进行下一步叭,输入我们猜的数字当猜的数字比产生的数大,大,打印猜大了;比产生的数小,提示猜小了,否则提示猜对了并退出。由于一次就猜对的可能性比较小,因此这里是一个循环!

void game()
{
	int ret= rand() % 100 + 1;
	int guess = 0;
	
	while (1)
	{
		printf("请输入你想猜的值:>");
		scanf("%d", &guess);
		if (guess > ret)
		{
			printf("猜大啦\n");
		}
		else if (guess < ret)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("猜对了\n");
			break;
		}
	}
}

game函数的分装就完成啦!运行一下看看叭

 欧克啦,这就是猜数字游戏得过程啦,上完整代码!

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("**********************\n");
	printf("**** 0.exit  1.play **\n");
	printf("**********************\n");
}
void game()
{
	int ret= rand() % 100 + 1;
	int guess = 0;
	
	while (1)
	{
		printf("请输入你想猜的值:>");
		scanf("%d", &guess);
		if (guess > ret)
		{
			printf("猜大啦\n");
		}
		else if (guess < ret)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("猜对了\n");
			break;
		}
	}
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请输入你选择的值:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误\n");
			break;
		}
	} while (input);
	return 0;
}

以上就是今天的学习啦 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/2301_77886098/article/details/131554750