广而告知: 博客写得好,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系统)打印一下代码,看效果:
测试的时候,竟然被我猜中了一次!!!
妙啊!
也有猜不对的时候!!
此题有一丢丢复杂,勤加练习就能写出来了。
最后,请各位发财的金手指,据说点赞的都找到女朋友了,帮忙点点赞和关注!
💁♂️💁♀️🙋🙋♂️🙋♀️🧏🧏♂️一赞三连🧏♀️🙇🙇♂️🙇♀️🤦🤦♂️🤦♀️🤷🤷♂️🤷♀️
💁♂️💁♀️🙋🙋♂️🙋♀️🧏🧏♂️一赞三连🧏♀️🙇🙇♂️🙇♀️🤦🤦♂️🤦♀️🤷🤷♂️🤷♀️
💁♂️💁♀️🙋🙋♂️🙋♀️🧏🧏♂️一赞三连🧏♀️🙇🙇♂️🙇♀️🤦🤦♂️🤦♀️🤷🤷♂️🤷♀️