随机猜数字游戏(0~100)

广而告知: 博客写得好,Emoji要选好!!🎵 🎶 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢

写博客是知识是巩固和温习,所以在这个信息爆炸的时代,每个人每天都要接收很多讯息,你的记忆是有限的,知识也是有限的,时间也是有限的,既然如此,那是时候磨亮我的五十米大刀了。 你很强,上天揽月你不行,你很强,下海捞鱼总行吧!

💀☠💩🤡👹👺👻👽👾🤖 -->渴望知识!!!

今日主题:

1.写一个猜数字游戏

主题1:写一个猜数字游戏

游戏规则:

电脑自动生成0~100的随机数

玩家猜数字,猜数字 过程中,根据猜测数据的大小给出大了或者小了的反馈,直到猜对数据,游戏结束!

思路分析:

1).怎么猜数字?随机猜呗,既然是随机,那得有个函数可以生成这个随机数,是C语言自带的函数?

rand(void)  //C语言自带生成随机数的函数

2).随机数的大小是从0~32767(0x7FFF),库函数里面的一个宏定义

可以按下F12 转到定义 

// Maximum value that can be returned by the rand function:
#define RAND_MAX 0x7fff

_ACRTIMP void __cdecl srand(_In_ unsigned int _Seed);

_Check_return_ _ACRTIMP int __cdecl rand(void);

#if defined _CRT_RAND_S || defined _CRTBLD
    _ACRTIMP errno_t __cdecl rand_s(_Out_ unsigned int* _RandomValue);
#endif

们上代码吧!先初步看一下rand()是怎么生成随机数的

#include <stdio.h>
#include <stdlib.h>
int main()
{	
	printf("%d\n",rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	return 0;
}

按下Fn+F5(笔记本Windows系统)打印一下代码效果:

 

嗯!!!确实生成了随机数!

但是,我发现有个重大问题就是,每一次执行输出的数据都一样。

是不是生成随机数函数有bug?

继续往下看吧!

3).原来rand()函数生成的随机数是伪随机数的,并不是真正的随机数,是通过某种算法生成的特定的随机数,是可预测的。这是因为rand函数对一个“种子(seed)”的基准值通过计算生成的随机数。

这里广而告知一下:真正的随机数是无法预测下一个值的。

4).那我们就需要用来另一个函数srand(),让它来出初始化随机数,也叫做随机数生成器。其函数原型如下:

void srand(unsigned int seed);

这里也顺便解析一下,引入srand()是不是显得有点多余,而且看起来srand函数也是通过设置其参数seed来生成随机数的。

也就是说:设置的参数seed也是个随机数。

那么久好理解了,操作过程:调用rand()函数,实际上会先调用srand()函数,调用srand()函数,那么就需要给参数seed设置一个随机值,或者叫做随机种子。

5).那么,是怎么生成随机种子seed呢,我们刚好可以借助的是电脑的时间,因为时间是一直在变化的。

C语言有个时间函数,那么我们只要获取这个time就可以了,time函数的原型如下:

time_t time(time_t* time);  //time_t 是个long long int 整型

time函数的使用,需要包含<time.h>

6).给大家介绍一个工具:时间戳转换,链接附上了,各位大哥,觉得好用点个赞再走啊。

https://www.matools.com/timestamphttps://www.matools.com/timestamp

7).顺便科普一下,咱们的计算机开始时间是从1970年1月1日0分0秒的。

咱们上代码吧!先初步看一下rand()是怎么生成随机数的

#include <stdio.h>
#include <stdlib.h>
#include<time.h>
int main()
{	
	//RAND_MAX
	srand((unsigned int)(time(NULL)));// 由于srand是需要unsigned int 类型,所以将time进行强制类型转换
	printf("%d\n",rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	return 0;
}

 按下Fn+F5(笔记本Windows系统)打印一下代码效果:

 是不是两次的随机数都不是一样了。

8).需要的随机数范围是从0~100

由于rand产生的随机数是从0~32767

那么需要生成的随机数是0~100,那么就需要对100进行模操作,其模操作的余数就是0~99,然后再加1就是从0~100了。

printf("%d\n", rand() % 100 + 1);

 

那如果我想生成100~300之间呢!

printf("%d\n", 100+rand() % (300-100 + 1)); //生成100~300之间的随机数

那如果生成m~n的随机数,该怎么计算:

m +rand()%(n-m+1);

讲完了随机数的产生之后,我们进入如何实现猜数字游戏的主题!

9)肝了1小时,直接上代码了!

游戏中,增加了一个计算时间的功能,用了VS2022自带的库,clock_t 

由于篇幅已经很长了,在代码上面已经注释了实现功能的作用。

代码测试过的,可以运行,大家可以自行调试!

咱们上代码吧!可以开 玩游戏啦!

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

clock_t Start_time;   //使用自带时钟定义Start_time
clock_t End_time;     //使用自带时钟定义End_time
void menu()
{
	printf("****************************\n");
	printf("**********开始游戏**********\n");
	printf("**********退出游戏***********\n");
	printf("**********选择错误***********\n");
}
void game()
{
	int guess = 0;
	int time_1 = 0; //设置时间计数,初始化为0
	int count = 5; //游戏只能玩5次
	int guess_Number = rand() % 100 + 1; //生成0~100之间随机数

	while (count)
	{
		printf("开始游戏\n");
		printf("游戏剩余%d次数\n", count);
		scanf("%d", &guess);    //输入自己猜测的数据
		if (guess > guess_Number)
		{
			printf("猜大了!\n");
		}
		else if (guess < guess_Number)
		{
			printf("猜小了!\n");
		}
		else {
			printf("恭喜猜对了!\n");
			End_time = clock();//记录游戏结束时间
			time_1 = (End_time - Start_time) / CLOCKS_PER_SEC;  //计算游戏猜对之后的时间
			printf("游戏猜对时间%d秒\n", time_1);

			break;
		}
		count--;

	}
	if (count == 0)
	{
		printf("游戏结束,正确数值为%d\n", guess_Number);
		End_time = clock();//记录游戏结束时间
		time_1 = (End_time - Start_time) / CLOCKS_PER_SEC;
		printf("游戏没有猜对时间%d秒\n", time_1);

	}
}
int main()
{
	int input = 0;
	Start_time = clock();  //拓展,记录游戏开始的时间
	srand((unsigned int)(time(NULL)));//生成随机数,只在初始化的时候初始化一次即可
	do
	{
		menu();//游戏菜单,可以在菜单内备注需要
		printf("请开始游戏!");
		scanf("%d", &input);//输入1,游戏开始
		switch (input)
		{
		case 1:
			game();//进入玩游戏的模块
			break;
		case 0:
			printf("退出游戏!");//输入0,游戏推出
			break;
		default:
			printf("选择错误!");//输入其他,重新输入
			
		}
	} while (input);
}

看明白了吗?

 

 按下Fn+F5(笔记本Windows系统)打印一下代码效果:

测试的时候,竟然被我猜中了一次!!!

妙啊!

也有猜不对的时候!!

此题有一丢丢复杂,勤加练习就能写出来了。

 

最后,请各位发财的金手指,据说点赞的都找到女朋友了,帮忙点点赞和关注!

💁‍♂️💁‍♀️🙋🙋‍♂️🙋‍♀️🧏🧏‍♂️一赞三连🧏‍♀️🙇🙇‍♂️🙇‍♀️🤦🤦‍♂️🤦‍♀️🤷🤷‍♂️🤷‍♀️

💁‍♂️💁‍♀️🙋🙋‍♂️🙋‍♀️🧏🧏‍♂️一赞三连🧏‍♀️🙇🙇‍♂️🙇‍♀️🤦🤦‍♂️🤦‍♀️🤷🤷‍♂️🤷‍♀️

💁‍♂️💁‍♀️🙋🙋‍♂️🙋‍♀️🧏🧏‍♂️一赞三连🧏‍♀️🙇🙇‍♂️🙇‍♀️🤦🤦‍♂️🤦‍♀️🤷🤷‍♂️🤷‍♀️

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值