admin管理员组

文章数量:1794759

分支与循环(下)·猜数字

这篇为大家介绍循环之实现猜数字游戏

在实现一个游戏的时候,我们需要先知道它的游戏逻辑是什么:

 猜数字即是玩家输入一个数,电脑根据产生的随机数判断是否猜对

那么重点在于随机数的产生,那么这里先介绍几个函数

rand()函数

这个函数就是专门实现随机数的产生的,那么产生一个数就会有对应的范围,

在cplusplus中对rand()产生随机数范围的最大值是描述的RAND_MAX

看来没有给出一个具体的值,因为它的值是依赖于编译器的,大多数编译器上的最大值是32767,

并且在cplusplus的记载中可以看到使用rand()函数是要用到头文件<stdlib>的,那么现在使用一下这个函数。

好像看起来是实现了相关的随机数的实现,但是当你下去实际操作的时候你就会发现,所谓的随机数一直是这几个,那么这是为什么?

原因在于rand()生成的数其实是伪随机数,rand()函数生成数是基准于“种子”进行运算得来的,种子默认为1,那么我们只要让种子进行改变,生成的数才算得上随机数。

如何让“种子”改变呢? 这里就不得不介绍另一个函数了,srand()函数。


srand()函数

C语言中提供的srand()函数是为了初始化随机数的生成器的,如果去cplusplus的网站搜一下rand()函数,是可以看到文献前几段也说明了rand()功能的实现依赖于srand()函数的,即这两个是配套的。

但但但是,根据文献记载

最后一段明确指出,为了实现真正的随机数,需要借助于time()函数,毕竟时间是一直在变化的。

所以种子选取时间是再好不过的了。

补充:文献记载使用srand()函数也是要引用头文件<stdlib>的(怪不得说这两个配对呢)


time()函数

为了生成随机数,时刻在变化的时间无疑是首选,那么这里就看一下相关记载

这里就几段重要信息进行介绍。

第一,time函数的使用是需要引用头文件<time>的,根据Get current time(获取当前时间)的介绍,我们可以知道它的原理是用现在的时间减去1970年1月1日00:00得到差值,那么这个差值被称为时间戳。

第二,根据Parameter(参数)的介绍,我们知道time()函数的参数是timer类型的,但是我们不想用它的参数,所以我们在其放置参数的位置放上NULL,即是空指针的意思。

第三,根据Return Value(返回值)的介绍,可以看到time()函数的返回值是time_t类型的,但是它的本质是32位或者64位的整型类型,所以一会儿使用的时候我们要将其强制类型转换为unsigned int 类型的。


ok了,所用到的基本知识介绍完了,现在具体来实现一下该代码。

第一步,玩游戏嘛肯定需要打印菜单,所以打印最基本的框架。

(不要在意那么多的头文件,因为编者懒)

这样一个最基本的框架就形成了,用do-while循环来实现玩家选择游戏,因为menu是不需要返回值的,所以用void,简易的菜单就实现打印了。

在选择多样化的情况下,if可能显得冗长了,所以选择switch实现多分支情况。


第二步,实现随机数的生成

看吧,随机数就生成了,当然不可能让玩家在0-32767猜,那谁猜的了,所以我们将范围固定在1-100,使用的方法是取模,对100取模肯定不会超过100嘛,加个1,1-100的随机数就生成了。

注意!这里有个很容易犯的错误,就是把time函数放在game()里面,这样的结果就是

以上结果是编者在几秒中打印出来的,你可以看到随机数如此相近,这是因为把种子放在了game里面,即每次进入游戏种子都被更新一次,如果时间间隔比较近,就会出现随机数很相近的情况。

第三步,实现随机数与猜的数字的比较

那么整个代码就这样写完了。

整个代码如图

代码语言:javascript代码运行次数:0运行复制
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//打印菜单
void menu()
{
	printf("************************\n");
	printf("****1 play  0 exit******\n");
	printf("************************\n");
	printf("请选择:");
}
//实现游戏
void game()
{
	int ret = rand() % 100 + 1;
	int guess = 0;
	while (1)
	{
		scanf("%d", &guess);
		if (ret < guess)
		{
			printf("大大大\n");
		}
		else if (ret > guess)
		{
			printf("小小小\n");
		}
		else
		{
			printf("诶哟不错哦你小子\n");
			break;
		}
	}
}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;//玩家选择是否进行游戏
	do
	{
		menu();//打印菜单
		scanf("%d", &input);//玩家进行选择
		switch (input)//判断玩家的选择
		{
		case 1://进行游戏
			game();
			break;
		case 0://退出游戏
			printf("我溜走咯\n");
			break;
		default://选错了(故意的还是不小心的)
			printf("重新输入:\n");
			break;
		}
	} while (input);//除了0即便输入错误也有重新输入的机会
	return 0;
}

当然如果想要进行限制次数的话,也是可以的

这样就行了(看来我不是渣渣哈哈哈)

好了,猜数字游戏就介绍完了,感谢阅读!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-08-13,如有侵权请联系 cloudcommunity@tencent 删除编译器函数框架游戏time

本文标签: 分支与循环(下)猜数字