随机数与分支循环的巧妙结合

欢迎来到白刘的领域   Miracle_86.-CSDN博客

系列专栏  C语言知识

先赞后看,已成习惯

   创作不易,多多支持!

 ————这里是白刘,好长一段时间没更新了,在思考人生,但是这两天看着源源不断的粉丝数上涨,重新点燃了我创作的热情,虽然可能是官方平台在鼓励新星作者,但是我会把每一位,虽然可能是机器人,但是我会用心地去写每一篇文章,坚持下去!————

目录

一、随机数的生成

1.rand

2.srand

3.time

4.随机数范围

二、猜数字游戏

1.主函数

2.menu函数

3.game函数

4.代码实现

5.拓展


上次我们浅谈了一下分支与循环,了解了C语言的几种基本结构。今天我们将聊到新的几个东西,然后搭配着上次学的结构,做一个小游戏——猜数字。这个游戏大家应该都玩过,有没玩过的也没关系,我简单介绍一下游戏规则:首先,我们会在一个范围里,取一个随机数,玩家猜数字,猜数字的过程中,根据猜测数据的⼤⼩给出⼤了或⼩了的反馈,直到猜对,游戏结束,你听懂了吗,管你听没听懂,看就完了~

一、随机数的生成

1.rand

C语言中有一个函数叫rand,这个函数就是我们用来随机数的根本。前面我们讲过printf和scanf,这俩函数需要被调用就要<stdio.h>这个头文件,rand也同理,它需要的是<stdlib.h>.

但是光光只有rand是不够的,因为它返回的是一个伪随机数,为什么这么说呢,因为它生成的随机数范围是0~RAND_MAX,这个RAND_MAX是由编译器决定的,大部分编译器上的RAND_MAX都是32767。

我们可以测试一下这个rand函数,看看它有什么效果。

但是我们多运行几次就发现问题了,我们发现结果都是一样的,这是为什么呢?刚刚我们说了,rand生成的是伪随机,伪随机数不是真正的随机数,是通过某种算法生成的随机数。真正的随机数是无法预测下一个值是多少的。rand函数是对一个叫“种子”的基准值进行运算生成的随机数。而之所以每次都一样,是因为rand函数默认种子为“1”,这个种子一直没变,所以随机出来一模一样。那该怎么办呢?于是我们想出来一个新的函数,srand。

2.srand

这个srand,是用来干什么的呢?刚刚我们说了,种子总是“1”,所以它是用来初始化种子的。

它的原型是这样的:

void srand(unsigned int seed)

我们要给它里面传一个无符号整形(确实可能现在各位不知道什么是无符号整形,这个怪我,我忘写数据类型和变量了,后续会补上的)的种子。

所以如果想实现随机数的话,我们只需要一个随机的种子即可,但,这不是自相矛盾嘛。所以聪明的人们想出来一个新的函数,time。

3.time

虽然我们现在还不知道随机数,但是我们在生活中可以找到跟随机数相似的一个东西——时间。

你若仔细想想,就会发现它们两个其实本质上都是在变化的,所以我们可以完美避开上述矛盾。

time函数原型是这样的:

time_t time(time_t timer);

time函数会返回当前日历时间,其实返回的是1970年1月1日0时0分0秒到现在的时间差值,以秒为单位。而这个time_t类型,实质上是以32或者64位的整形类型 。

time函数的参数 timer 如果是非NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。如果 timer 是NULL(空指针,以后我们也会谈到),就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。

代码如下:

#ifndef _CRT_NO_TIME_T
     #ifdef _USE_32BIT_TIME_T
         typedef __time32_t time_t;
     #else
         typedef __time64_t time_t;
     #endif
#endif


typedef long __time32_t;
typedef __int64 __time64_t;
上面扯了这么多一大堆,是不是感觉有点听不懂,没关系,上面这一堆只是给大家拓展一下相关概念,看不懂没关系,只需要记住接下来的就可以了。
time需要的头文件是<time.h>。怎么用呢?
#include<time.h>

time(NULL);

就这么用,直接写,其他不用考虑。

所以以上的所有一结合,我们可以得到真·随机数。

我们再来运行一次:

好的,现在我们已经得到了真·随机数,但是,我要是想猜那个数字,咱得有个范围吧。

每日一句“白话文”(b言b语):“猜数字要有范围,要有个边界,要有个标准,要有个度。做人亦是如此”。

4.随机数范围

首先我们要记住,虽然数是随机的,但是我们可以用式子来控制它,比如说我想要0到100的随机数,那我想到了用取余。

rand()%100;这个式子得出来的肯定是小于100的,也就是0到99,那要是想要0到100怎么办,%101就好了。这里还有个公式(自己可推),若要a~b的随机数,则a+rand()%(b-a+1)

二、猜数字游戏

万事俱备,我们可以开始操作了。

首先我们来构思一下这个游戏的部分,设计好之后,我们再上代码。

首先确定一个范围,然后生成一个随机数,然后开始猜数字,系统给出大了还是小了,然后把范围更新一下。

1.主函数

整个主体可以是个循环,根据玩家的选择,来选择是否进入游戏或者退出游戏。

#include<stdio.h>
int main()
{
	int input = 0;//玩家选择的选项
    srand((unsigned)time(NULL));
	do
	{
		scanf("%d", &input);
		switch(input)
		{
		case 1:
			//开始游戏
			break;
		case 2:
			//退出游戏
			input = 0;
			break;
		default:
			//玩家可能瞎输入,提示他好好输入。
			input = 1;
			break;
		}
	} while (input);
	return 0;
}

 整体我们采用了do while,然后让玩家输入1或者2,选择是否游戏,避免他1瞎输入,还可以提示一下。大家想想我们还缺点什么——菜单,不然玩家怎么知道1是什么2是什么,所以我们写一个菜单函数放在上面。

2.menu函数

void menu()
{
	printf("***************************\n");
	printf("****     1.开始游戏    ****\n");
	printf("****     2.退出游戏    ****\n");
	printf("***************************\n");
}

这里很简单就不再赘述了,就是要注意换行,void类型不需要返回任何值。

然后把menu加到循环里,再进一步完善:

3.game函数

接下来就是正题了,首先确定范围,这里我们拿1到100来举例,

void game()
{
 int r = rand()%100+1;
 int guess= 0;
 while(1)
 {
     printf("请猜数字>:");
     scanf("%d", &guess);
     if(guess < r)
      {
         printf("猜⼩了\n");
      }
     else if(guess > r)
      {
         printf("猜⼤了\n");
      }
     else
      {
         printf("恭喜你,猜对了\n");
         break;
      }
 } 
}

如果想增加游戏难度,我们这里还可以用for循环,给玩家规定多少次机会,比如,给玩家五次机会:

void game()
{
	int r = rand() % 100 + 1;
	int guess = 0;
	int i = 0, left = 1, right = 100;
	for ( i = 5; i > 0; i--)
	{
		printf("您还有%d次机会\n", i);
		printf("范围%d到%d\n", left, right);
		printf("请猜数字>:");
		scanf("%d", &guess);
		if (guess < r)
		{
			printf("猜小了\n");
			left = guess;
		}
		else if (guess > r)
		{
			printf("猜大了\n");
			right = guess;
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}
	if (i == 0)
	{
		printf("抱歉,游戏失败\n");
		printf("正确答案为%d\n", r);
	}
}

4.代码实现

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void menu()
{
	printf("***************************\n");
	printf("****     1.开始游戏    ****\n");
	printf("****     2.退出游戏    ****\n");
	printf("***************************\n");
}

void game()
{
	int r = rand() % 100 + 1;
	int guess = 0;
	int i = 0, left = 1, right = 100;
	for ( i = 5; i > 0; i--)
	{
		printf("您还有%d次机会\n", i);
		printf("范围%d到%d\n", left, right);
		printf("请猜数字>:");
		scanf("%d", &guess);
		if (guess < r)
		{
			printf("猜小了\n");
			left = guess;
		}
		else if (guess > r)
		{
			printf("猜大了\n");
			right = guess;
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}
	if (i == 0)
	{
		printf("抱歉,游戏失败\n");
		printf("正确答案为%d\n", r);
	}
}

int main()
{
	int input = 0;//玩家选择的选项
	srand((unsigned)time(NULL));
	do
	{
		menu();
		printf("请选择-->");
		scanf("%d", &input);
		switch(input)
		{
		case 1:
			game();
			break;
		case 2:
			printf("退出游戏\n");
			input = 0;
			break;
		default:
			//玩家可能瞎输入,提示他好好输入。
            printf("输入错误,请重新输入");
			input = 1;
			break;
		}
	} while (input);
	return 0;
}

5.拓展

虽然这个游戏很简单,但是可以玩出很多种花样,比如当回答错误,你可以让他做一个惩罚;亦或是你一直让随机数变,这哥们肯定始终猜不出来;或者你可以把范围故意搞反。总而言之,只有你想不到,没有你做不到,程序设计本身就是创新,白刘相信大家能玩出名堂,今天就先聊这么多吧,86.

  • 47
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Miracle_86.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值