猜数字游戏

引言:相比大家从小都玩过猜数字游戏吧!那么小时候玩的游戏能不能用代码写出来呢?--答案是肯定的,今天我们就来讲解一下如何用代码写出猜数字游戏!

1.打印菜单

在我们日常玩的小游戏中,我们一进入游戏界面,有会跳出一个页面让我们选择游戏模式或者选择角色类似的等等,那猜数字游戏一样需要一个菜单,无论什么条件我们都先要打印一个菜单,而且玩完一把,可能还想要进行下一把或者想要退出游戏,这就可以通过我们的循环结构实现。

代码展示:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//猜数字游戏
int main()
{
	int num = 0;
	do
	{
		//无脑打印菜单
		printf("********** 菜单 ***********\n");
		printf("********* 1.play **********\n");
		printf("********* 0.exit **********\n");
		printf("请选择数字: ");
		scanf("%d", &num);//输入数字,进行选择
        switch (num)
        {
         case 1:
	        //game();
	        break;
         case 0:
	        printf("退出游戏:\n");
	        break;
         default:
	        printf("选择错误,请重新选择:\n");
	        break;
       }
	} while (num);//再次询问是否进行下一把游戏,选择0直接退出游戏
	return 0;
}

2.产生随机数

既然要猜数字,那么这个数字肯定是随机给我们咯!那么就有人预判我想说的,这个随机数该怎么产生?这个就要涉及到一个到函数rand,rand函数是专门用来产生随机数的,如果想要了解更多,可以去c plus plus官网查询。

 根据查询我们可以得知,rand函数生成的数是伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的大小是依赖编译器上实现的,但是大部分编译器上是32767。使用rand函数要包含它的头文件<stdlib.h>。

为什么说它生成的是伪随机数呢?在后面我们会提及并讲解。

知道了rand函数能够生成伪随机数,那如何使用它呢?它的基本结构如下:

int rand(void)

接下来看一个利用rand函数小代码生成随机数 

多测试几次

你会发现虽然是随机的,但它生成的数都是一样的。不少宝宝就会好奇了为什么我是用它生成随机数,它却给我生成一样的数?这就不得提及上述说的伪随机数,rand函 数是对⼀个叫“种⼦”的基准值进⾏运算⽣成的随机数,rand函数它默认种子是1-----这时候又有人说什么是种子?

简单来说相当于一个标准值,我们生成的随机数是需要依靠种子产生的,只有当种子发生变化,产生的随机值也就是随机变化的!!!

3.srand函数产生种子

为了让种子不断发生变化,这个时候我们又需要引入一个新的函数srand。

根据查询我们可以知晓,srand发挥的主要作用就是设置随机生成的种子,让我们编译器每次随机生成的数字都不一样。它的基本结构如下图:

void srand (unsigned int seed)

简单理解一下:就是srand函数它的返回值是空的,也就是没有返回值。同时它的参数---即种子的类型是无符号整型(unsigned int)。我们直接看代码的结果!

这时候你会发现生成的随机数不一样了,但是当我们多次运行时发现它产生的随机数依旧是这个,这是为什么呢?这是因为我们的种子没有随时发生变化,导致我们我们每一次运行产生的随机数都一样!那就说明只要我们的种子时刻发生变化,我们就能够解决这一问题!

但这个时候就有一个矛盾点,什么矛盾点呢?我们刚才说srand函数它的种子是随机产生的,那么这是不是要通过rand函数随机产生种子呢?那我产生随机数的前提要调用srand函数产生随机的种子,这不自相矛盾嘛!!!为了解决这一矛盾,我们引入一个新的知识!

4.time函数

在我们的意识中,对于随时变化的事务,我们会最先想到时间,因为时间是无时无刻不发生变化的!所以c++中为了能够表述这中随时变化,创建了一个新的函数就是time函数!

箭头所指就是time函数的基本结构(time_t  time(time_t* timer))。time函数返回的类型是time_t类型的,time_t类型本质上其实就是32位或者64位的整型类型。同时在返回值那一栏里,参数timer可以是NULL---即空指针,后面我会写到。如果是NULL,那么它返回时间差-----又称作时间戳。在使用time函数的时候我们要包含它的头文件<time.h>。

时间戳(Unix timestamp)转换工具 - 在线工具 (tool.lu)

接下来让我们通过代码来看看产生的效果吧!

运行几次发现生成的数都是随机的,这非常好的解决了我们随机数产生的问题。但是,你会发现这个猜的数字也忒大了吧!这要我猜到猴年马月啊!这时候为了约束我们我们随机数产生的范围,我们就又要用上rand函数同时还要用到取模(%)符号!

5.随机数生成范围约束

我们是通过rand函数来生成我们的随机数的,生成的随机数取模范围实在除数之间。举个简单例子

我们定义一个变量a,a%100它的余数范围肯定是1~99.同理如果a%10,它的余数范围就是1~9。

所以为了约束随机数生成的范围我们可以这样做:

生成的数在1~100之间,rand%100+1即可;

生成的随机数在100~200之间,rand%(100+1)+100即可;

如此我们可以发现它的规律生成数在a~b之间    rand % (b-a+1) + a;

上述知识我们都了解之后,直接敲代码吧!

6.代码实现

如果你想要增加难度,可以加一些次数,譬如: 

那么猜数字游戏到这里就结束了!下一期见咯!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值