【C语言】猜数字游戏(凸(艹皿艹 )超级超级详解)!!!

前言

猜数字在C语言的学习中是非常经典的一道题目,这道题目对以后我们写更大的项目是有好处的在这里插入图片描述

游戏规则

猜数字游戏

  1. 电脑随机生成一个数字(1~100)
  2. 玩家猜数字
    玩家猜小了,就告知猜小了
    玩家猜大了,就告知猜大了
    直到猜对为止
  3. 游戏可以一直玩 在这里插入图片描述

思路整理

看到规则我们应该知道,肯定是需要用到循环,而生成随机数是一个难点,
这里咱们先暂时放着。按道理我们应该有一个菜单,让玩家选择玩与不玩

菜单打印

#include<stdio.h>
void menu()
{
	printf("*******************\n");
	printf("*0.EXIT *** 1.PLAY*\n");
	printf("*******************\n");
	printf("*******************\n");

}
int main()
{
	menu();
	return 0;
}

这就是菜单的打印方式,然后咱们来实现整体结构,为什么要这么快就全盘脱出而不多加一点引导呢?因为没有必要,因为你只是没有见到怎么使用,所以你看一遍基本上下次就知道要怎么写。

整体大概结构

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void menu()
{
	printf("*******************\n");
	printf("*0.EXIT *** 1.PLAY*\n");
	printf("*******************\n");
	printf("*******************\n");

}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择->");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("退出游戏\n");
			break;
		case 1:
				break;
		default :
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	

	return 0;
}

可以看到我们利用Switch 和 do-while实现了,选什么就干什么的一个基本逻辑,接下来就是在case1 中添加game()程序。

游戏程序

现在实现游戏最困难的地方就是生成随机数,希望大家不要因为它是一个新的知识点就害怕它,每天学一点新知识我们才能成长。在这里插入图片描述

其实,C语言提供给我们了一个生成随机数的函数就rand,咱们先来学习一下它

rand函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我把中英文版本都放在这里,我们只需要知道函数参数,返回值,头文件就行了,
返回值介于0-RAND_MAX就是介于0-32767。也就是它的返回的随机数的范围也是0-32767,那我们可不可以就直接用rand来生成随机数呢? 在这里插入图片描述

我们实践一下

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
void menu()
{
	printf("*******************\n");
	printf("*0.EXIT *** 1.PLAY*\n");
	printf("*******************\n");
	printf("*******************\n");

}
void game()
{
	int ret = rand();
	printf("%d\n", ret);

}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择->");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("退出游戏\n");
			break;
		case 1:
			printf("猜数字游戏\n");
			game();
				break;
		default :
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	

	return 0;
}

下面是ret 打印的结果
在这里插入图片描述 在这里插入图片描述
可以看到两次打印结果居然都是呈现同样的数,这样的游戏合理吗?在这里插入图片描述

当然不,所以我们还要深化学习

srand函数

在这里插入图片描述
在这里插入图片描述

上面的图片看完大家也可能还是不是很懂怎么使用,那么我讲解一下,一般rand函数与srand是要一起使用的,用srand这个函数,在调用rand之前设置随机数的生成器。,来咱们看看咱们使用。当然这两个函数的头文件是一样的,都是stdlib.h

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
void menu()
{
	printf("*******************\n");
	printf("*0.EXIT *** 1.PLAY*\n");
	printf("*******************\n");
	printf("*******************\n");

}
void game()
{
	srand(100); //我们人为的加了个100;看看打印会是什么样子
	int ret = rand();
	printf("%d\n", ret);

}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择->");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("退出游戏\n");
			break;
		case 1:
			printf("猜数字游戏\n");
			game();
				break;
		default :
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	

	return 0;
}

在这里插入图片描述

无论我们打印多少次结果都是365,但是一但srand里面的值改变,打印的结果也就改变。
在这里插入图片描述

在这里插入图片描述

我们发挥合理的想象,只要srand的值能够不断的变化,那么我们就会真正得到随机值,那这就难办了,本来我就是要一个随机数,结果你要我在srand里放一个随机数,这到底怎么搞呢?其实我们再在srand里放一个一直在变化的值就可以了,那么什么是一直变化的呢?对了,TIME ,time一直在变化。
接下来我们引出最后的函数 time在这里插入图片描述

time 函数

在了解time函数之前,我们要了解一个概念叫时间戳
下面看一下我在网上找到的一个时间戳转换工具
在这里插入图片描述
原来时间戳可以转变为北京时间,是另类的计时方法,但是这个是我们生活时间的时间戳,电脑上的时间戳就不一样了。我们看下面的图片就能理解
在这里插入图片描
接下来看看time函数有关内容

在这里插入图片描述
在这里插入图片描述

这个函数还是比较复杂的,通俗易懂的讲,如果你往括号里面放NULL,就是返回一个时间戳,如果你放time * 类型的参数则把时间戳放在这个指针所指的那块空间里面。time_t就是一种整型,也就是返回的值就是整型。
补充一点这个函数头文件就与前面两个不一样了,是time.h

time函数与srand函数

那我们现在就能大概知道srand和time怎么搭配使用了,我们将两个函数对比一下。

在这里插入图片描述
在这里插入图片描述

因为time_t与unsigned int 类型不符,我们要用到强制类型转换,而time我们只需要加入NULL参数让它返回时间戳就行。在这里插入图片描述

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

}

这就是两者结合的正确写法

让我们来尝试运行一下程序

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("*******************\n");
	printf("*0.EXIT *** 1.PLAY*\n");
	printf("*******************\n");
	printf("*******************\n");

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

}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择->");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("退出游戏\n");
			break;
		case 1:
			printf("猜数字游戏\n");
			game();
				break;
		default :
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	

	return 0;
}

在这里插入图片描述

这里居然又出错了,居然又有细节吗?在这里插入图片描述
没错,我们不应该把srand和time函数放在game里,这样好像就像是没次玩游戏时都要重新计算时间戳,所以我们要放在主函数里。
在这里插入图片描述
这样就对了,但是也还有个细节,还记得我们的游戏规则吗?在这里插入图片描述
一定要在1-100之间的数。所以我们添加最后一个目录给出最后的究极代码在这里插入图片描述

究极的最后的代码

在这里插入图片描述

我们如何实现让结果全在1-100区间呢?只需要对rand()%100 +1就行,
任何数%100就是0-99,0-99 都+1 就是1-100。这个大家可以理解理解

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

}

然后我们就来实现猜数字。

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("*******************\n");
	printf("*0.EXIT *** 1.PLAY*\n");
	printf("*******************\n");
	printf("*******************\n");

}
void game()
{
	
	int ret = rand()%100+1;
	int guess = 0;
	while (1)
  {
		printf("猜数字:>\n");
		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 0:
			printf("退出游戏\n");
			break;
		case 1:
			printf("猜数字游戏\n");
			game();
				break;
		default :
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	

	return 0;
}

终于介绍完了,大家看完可以自己写一下在这里插入图片描述
,这篇文章就到这里了,作者能力有限,如果有帮到你,那就点个赞吧,这对我真的很重要。
在这里插入图片描述

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

He XIAO xia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值