当前位置:网站首页>猜数字游戏,猜错10次关机(srand、rand、time)随机数生成三板斧(详细讲解!不懂问我!)
猜数字游戏,猜错10次关机(srand、rand、time)随机数生成三板斧(详细讲解!不懂问我!)
2022-08-02 14:02:00 【熬夜退役选手337】
游戏规则
电脑随机生成一个1~100的数字,用户输入数字,猜错10次就启动电脑关机程序60秒内关机,输入我是猪,则停止关机,回到猜数字游戏开始界面;
游戏设计思路
1.游戏交互界面
(1)游戏菜单
(2)游戏主体
2.猜数字游戏
(1)电脑生成随机数字
(2)玩家输入数字
(3)判断是否猜对
(4)猜错惩罚
完整代码
void guanji()//关机代码
{
system("color 0a");//代码变色
char intput2[20] = { 0 };
system("shutdown -s -t 60");//系统关机命令,定时60秒
while (1)
{
printf("请注意,你的电脑在60秒内关机,我是猪,就取消关机\n");
scanf("%s", intput2); //strcmp是判断字符串是否相等的函数,如果相等返回值为0
if (strcmp(intput2, "我是猪") == 0)//当strcmp返回值是零的时候说明输入的字符串和目标字符串一样
{
system("shutdown -a");//-a是取消关机
printf("关机取消\n");
break;
}
else
{
printf("你的输入有误,关机程序继续运行\n");
}
}
}
void menu()//游戏交互界面,给用户提供选择
{
printf("************猜数字游戏************\n");
printf("************* 1.play *************\n");
printf("**************2.exit ************\n");
printf("***********************************\n");
}
void game()//
{
int guess = 0;
int ret = rand()%100+1;//生成随机数
//猜数字
int a = 10;
while (1) //循环判断用户输入的数字是否正确
{
printf("请猜猜是什么数字(1~100)");
scanf("%d" ,& guess);//用户输入的数字传递给变量guess
if (guess < ret) //如果输入的数小于电脑随机生成数
{
a--; //猜错了机会减一
printf("猜小了,你还有%d次机会\n",a);
if (a < 1) //当机会数为0时
{
printf("你是猪吗?");
Sleep(1000); //输出你是猪后停顿一秒让用户看到
guanji(); //调到关机程序启动关机惩罚
break;
}
}
else if (guess > ret) //如果输入的数大于电脑随机生成数
{
a--; //机会减一
printf("猜大了.你还有%d次机会\n",a);
if (a < 1)
{
printf("你是猪吗?");
Sleep(1000);//输出你是猪后停顿一秒让用户看到
guanji(); //调到关机程序启动关机惩罚
break;
}
}
else {
printf("恭喜你,猜对了.\n");
break;
}
}
}
int main()
{
int intput;
srand((unsigned int)time(NULL));//用时间戳来设置随机数生成器
//时间是随机的
do
{
menu();
printf("请选择:> 1 或 2\n");
scanf("%d", &intput);
switch (intput)//选择分支,3种输入情况
{
case 1:
game();
break;
case 2:
printf("退出游戏!\n");
break;
default:
printf("输入错误请重新选择!!\n");
}
} while (intput);
return 0;
}
运行截图
游戏制作关键点:随机数生成
电脑随机数的生成需要使用到3个函数:rand()、srand()、time()
1.rand( )随机数生成器:
rand()函数的属性:int rand (void)——生成随机整数(0-32767)
rand()函数接受参数为空,返回一个int类型的随机整数。头文件-stdlib.h
通过测试发现,单独通过rand()生成的随机数是伪随机数,每次运行生成的随机数都是一样的。这是因为没有初始化随机数生成的起点,每一次生成随机数的点位都相同。
三次运行生成的随机数都是一样的。
那这样猜数字每次都是一个数肯定不行啦,很容易就被人家猜出来,而且每次都一样,所以这是不能达到要求的。这时我们就要用到srand()重新设置随机生成数的起点
2.srand()随机数生成器初始化函数
srand()函数属性:void srand (unsigned int seed)
srand函数接受一个unsigned int类型,返回空(不需要返回值->设置随机数生成起点),头文件-stdlib.h
我们在原来的代码rand()前加上srand()函数,初始化随机数生成器看看会有什么变化呢?
通过对比我们发现rand()生成随机数的值会随着我们srand()设置的初始化的值而改变。
那么我们怎么生成一个真的随机数呢?
因为rand()生成数的值是会随着srand()的改变而改变,那么我们只要给strand()传递一个随机值,那么rand()就会生成一个真正的随机数。
这时就要用到time()函数啦!时间是在不断改变的。
3.time()函数
time函数属性:time_t time (time_t* timer)
:time函数接收一个指针类型,返回time_t类型,头文件-time.h
三者结合便可生成我们的随机数啦!!!
因为调用一次函数就会设置一个随机数的生成器,不需要重复调用,所以可以放到循环的之外。
通过对比我们发现每次生成的数字都不一样,我们随机数生成器就完成啦!!!!
注意:
1.因为time()函数返回值类型是time-t类型,而strand()函数接受的类型是unsigned int(无符号整型)类型;所以在time前加上(unsigned int)强制转换类型;
2.time需要的参数是指针,我们传入一个空指针就可以啦!
把这个知识运用到游戏里面去:
注:rand()%100是设置生成数的范围,rand()原本的范围是(0~32767),除以100取余的范围就是(0~99),那么加上1范围就变成了(1~100);
判断用户输入是否正确代码
void game()//
{
int guess = 0;
int ret = rand()%100+1;//生成随机数
//猜数字
int a = 10;
while (1) //循环判断用户输入的数字是否正确
{
printf("请猜猜是什么数字(1~100)\n ");
scanf("%d" ,& guess);//用户输入的数字传递给变量guess
if (guess < ret) //如果输入的数小于电脑随机生成数
{
a--; //猜错了机会减一
printf("猜小了,你还有%d次机会\n",a);
if (a < 1) //当机会数为0时
{
printf("你是猪吗?");
Sleep(1000); //输出你是猪后停顿一秒让用户看到
guanji(); //调到关机程序启动关机惩罚
break;
}
}
else if (guess > ret) //如果输入的数大于电脑随机生成数
{
a--; //机会减一
printf("猜大了.你还有%d次机会\n",a);
if (a < 1)
{
printf("你是猪吗?");
Sleep(1000);//输出你是猪后停顿一秒让用户看到
guanji(); //调到关机程序启动关机惩罚
break;
}
}
else {
printf("恭喜你,猜对了.\n");
break;
}
}
}
惩罚关机代码
void guanji()
{
system("color 0a");//代码变色
char intput2[20] = { 0 };
system("shutdown -s -t 60");//系统关机命令,定时60秒
while (1)
{
printf("请注意,你的电脑在60秒内关机,我是猪,就取消关机\n");
scanf("%s", intput2); //strcmp是判断字符串是否相等的函数,如果相等返回值为0
if (strcmp(intput2, "我是猪") == 0)//当strcmp返回值是零的时候说明输入的字符串和目标字符串一样
{
system("shutdown -a");//-a是取消关机
printf("关机取消\n");
break;
}
else
{
printf("你的输入有误,关机程序继续运行\n");
}
}
}
菜单代码
void menu()//游戏交互界面,给用户提供选择
{
printf("************猜数字游戏************\n");
printf("************* 1.play *************\n");
printf("**************2.exit ************\n");
printf("***********************************\n");
}
游戏主体代码
int main()
{
int intput;
srand((unsigned int)time(NULL));//用时间戳来设置随机数生成器
//时间是随机的
do
{
menu();
printf("请选择:> 1 或 2\n");
scanf("%d", &intput);
switch (intput)//选择分支,3种输入情况
{
case 1:
game();
break;
case 2:
printf("退出游戏!\n");
break;
default:
printf("输入错误请重新选择!!\n");
}
} while (intput);
return 0;
}
制作不易,如有帮助请给博主一键三连,蟹蟹!!!
制作不易,如有帮助请给博主一键三连,蟹蟹!!!
制作不易,如有帮助请给博主一键三连,蟹蟹!!!
制作不易,如有帮助请给博主一键三连,蟹蟹!!!
边栏推荐
- Steps to connect the virtual machine with xshell_establish a network connection between the host and the vm virtual machine
- 瑞吉外卖笔记——第10讲Swagger
- How does Apache, the world's largest open source foundation, work?
- The bad policy has no long-term impact on the market, and the bull market will continue 2021-05-19
- 8583 顺序栈的基本操作
- [ROS] (06) ROS Communication - Topic Communication
- 跑yolov5又出啥问题了(1)p,r,map全部为0
- Sentinel源码(二)入口方法分析
- [ROS] (01) Create ROS workspace
- MySQL数据库设计规范
猜你喜欢
Unit 10 Continuous Tuning
How to solve 1045 cannot log in to mysql server
第十四单元 视图集及路由
【ROS】工控机的软件包不编译
yolov5,yolov4,yolov3 mess
[ROS] (05) ROS Communication - Node, Nodes & Master
yolov5,yolov4,yolov3乱七八糟的
The most complete ever!A collection of 47 common terms of "digital transformation", read it in seconds~
Raft协议图解,缺陷以及优化
paddleocr window10 first experience
随机推荐
Flask request application context source code analysis
Mysql's case the when you how to use
Error Correction Design Principle of Hamming Check Code
瑞吉外卖笔记——第10讲Swagger
logback源码阅读(一)获取ILoggerFactory、Logger
鼠标右键菜单栏太长如何减少
云片网案例
[ROS](05)ROS通信 —— 节点,Nodes & Master
drf routing component Routers
网络剪枝(1)
8581 线性链表逆置
yolov5,yolov4,yolov3 mess
yolov5改进(一) 添加注意力集中机制
Unit 8 Middleware
Unit 6 meet ORM
MySQL数据库语法格式
Unit 14 Viewsets and Routing
Unit 13 Mixing in View Base Classes
EasyExcel 的使用
verilog学习|《Verilog数字系统设计教程》夏宇闻 第三版思考题答案(第十二章)