当前位置: 首页 > news >正文

【C语言小游戏--猜数字】

文章目录

  • 前言
  • 1.游戏描述
  • 2.代码实现
    • 2.1打印菜单
    • 2.2构建基础框架
    • 2.3玩游戏
      • 2.3.1生成随机数
        • 2.3.1.1rand()
        • 2.3.1.2srand()
        • 2.3.1.3time()
      • 2.3.2game()
    • 2.4自己设定猜的次数
  • 3.完整代码

前言

猜数字小游戏是我们大多数人学习C语言时都会了解到的一个有趣的C语言小游戏,下面我将详细介绍该游戏的实现和编程逻辑。玩小游戏的同时,也能对C语言控制语句有更好的认识。

在这里插入图片描述

1.游戏描述

电脑随机生成一个1-100的数字,玩家来猜。玩家可以根据自己需要,设置每次猜的次数。如果在设置的次数内猜对了,则提示你猜对了,否则提示猜错了。

2.代码实现

2.1打印菜单

我们在玩游戏前,都是先打印菜单,在进行选择。所以此处选择do-while循环

#include<stdio.h>
void menu()
{printf("***********************\n");printf("***  1.play  0.exit ***\n");printf("***********************\n");
}
int main()
{do{menu();} while (1);return 0;
}

效果展示:
在这里插入图片描述

2.2构建基础框架

选择1:玩游戏;
选择0:退出;
选择其它:重新选择

int main()
{int input = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:printf("玩游戏\n");break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择:\n");}} while (input);return 0;
}

效果展示:
在这里插入图片描述

2.3玩游戏

既然我们要玩猜数字游戏,那么我们选择1后,不能就打印一个玩游戏吧,因此下面来真正实现猜数字游戏。

2.3.1生成随机数

怎么才能生成随机数呢?
C语言提供了一个函数用来生成随机数

2.3.1.1rand()

在这里插入图片描述

查看文档我们发现:

  • rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的大小是 依赖编译器上实现的,但是⼤部分编译器上是32767。
  • 在调用rand之前,使用srand函数为伪随机数生成器提供种子。
  • rand函数的使用需要包含⼀个头文件是:stdlib.h

什么意思呢?我们不妨写代码测试一下:
运行一下发现,确实产生了随机数。但是当我运行第二次发现,产生的随机数和第一次的一样,那怎么能行,这不是BUG吗?

在这里插入图片描述
在这里插入图片描述

如果再深⼊了解⼀下,我们就不难发现,其实rand函数⽣成的随机数是伪随机的,伪随机数不是真的随机数,是通过某种算法⽣成的随机数。真正的随机数的是⽆法预测下⼀个值是多少的。⽽rand函数是对⼀个叫“种⼦”的基准值进⾏运算⽣成的随机数。
之所以前⾯每次运⾏程序产⽣的随机数序列是⼀样的,那是因为rand函数⽣成随机数的默认种⼦是1。 如果要⽣成不同的随机数,就要让种⼦是变化的。

种子要变化,我们再让种子是一个随机值不就行了嘛
NO,大漏特漏
如果这样的话,就死循环了

2.3.1.2srand()

刚才在文档中提到的一个srand是什么呢?
在这里插入图片描述

程序中在调⽤ rand 函数之前先调⽤ srand 函数,通过 srand 函数的参数seed来设置rand函数⽣成随机数的时候的种⼦,只要种⼦在变化,每次生成的随机数序列也就变化起来了。
那也就是说给srand的种⼦如果是随机的,rand就能⽣成随机数;在⽣成随机数的时候⼜需要⼀个随机数,这就又矛盾了

那电脑上什么东西是一直变化的呢?——时间

2.3.1.3time()

在这里插入图片描述

  • time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运行时间之间的差值,单位是秒。 如果
  • time()的参数timer是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳

如果是这样,我们就可以这样写代码:
在这里插入图片描述
在这里插入图片描述
这样我们发现数字就随机起来了,那我们的代码接下来可就好写咯。
我们需要的随机数是1-100之间的,所以我们可以这样写代码:
在这里插入图片描述

2.3.2game()

生成随机数

void game()
{srand((unsigned int)time(NULL));int random_number = rand() % 100 + 1;printf("%d\n", random_number);
}

效果如下:

在这里插入图片描述
但是如果你是老司机,手速比较快的话,生成的随机数会相同,如下:
在这里插入图片描述
这是为什么呢?
因为当我们运行一次game(),就会调用一次srand(),这样在较短时间内调用,就会产生相同的数字
因此,srand函数不需要频繁调用的,⼀次运⾏的程序中调用⼀次就够了。
所以,我们可以将其放在main()中

void game()
{int random_number = rand() % 100 + 1;int number = 0;while (1){printf("请猜数字:");scanf("%d", &number);if (number > random_number){printf("您猜大了\n");}else if (number < random_number){printf("您猜小了\n");}else{printf("恭喜你,猜对了!\n");break;}}
}

2.4自己设定猜的次数

用户自己输入次数,如果未在设置的次数中猜对,则提示失败
代码变动地方如下:

switch (input){case 1:printf("你感觉你几次就能猜对呢?\n");scanf("%d", &count);game(count);break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择:\n");}
void game(int count)
{int random_number = rand() % 100 + 1;int number = 0;while (count){printf("请猜数字:");scanf("%d", &number);if (number > random_number){printf("您猜大了\n");}else if (number < random_number){printf("您猜小了\n");}else{printf("恭喜你,猜对了!\n");break;}count--;}if (count == 0){printf("你未在规定的次数内猜对,有点高估自己了,还得练哦\n");}
}

效果如下:
在这里插入图片描述
在这里插入图片描述

3.完整代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{printf("***********************\n");printf("***  1.play  0.exit ***\n");printf("***********************\n");
}
void game(int count)
{int random_number = rand() % 100 + 1;int number = 0;while (count){printf("请猜数字:");scanf("%d", &number);if (number > random_number){printf("您猜大了\n");}else if (number < random_number){printf("您猜小了\n");}else{printf("恭喜你,猜对了!\n");break;}count--;}if (count == 0){printf("你未在规定的次数内猜对,有点高估自己了,还得练哦\n");}
}
int main()
{srand((unsigned int)time(NULL));int input = 0;int count = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:printf("你感觉你几次就能猜对呢?\n");scanf("%d", &count);game(count);break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择:\n");}} while (input);return 0;
}

本次分享就到这里啦,感谢您的观看
在这里插入图片描述

相关文章:

【C语言小游戏--猜数字】

文章目录 前言1.游戏描述2.代码实现2.1打印菜单2.2构建基础框架2.3玩游戏2.3.1生成随机数2.3.1.1rand()2.3.1.2srand()2.3.1.3time() 2.3.2game() 2.4自己设定猜的次数 3.完整代码 前言 猜数字小游戏是我们大多数人学习C语言时都会了解到的一个有趣的C语言小游戏&#xff0c;下…...

Vue计算属性computed和监听watch

1.计算属性 初衷&#xff1a;为了解决模块里面有太多的计算逻辑让模版难以维护。 计算属性可以依赖一个数据也可以依赖多个数据的变化 使用场景&#xff1a; 商品单价和数量改变时&#xff0c;商品总价更改。如果写在方法里面&#xff0c;那么每次修改商品单价和数量时都会…...

HTTP介绍 原理 消息结构 客户端请求 服务器响应 HTTP状态码

一、HTTP介绍二、HTTP工作原理HTTP三点注意事项 三、HTTP消息结构四、客户端请求消息五、服务器响应消息HTTP请求方法 七、HTTP响应头信息八、HTTP状态码&#xff08;HTTP Status Code&#xff09;下面是常见的HTTP状态码&#xff1a;HTTP状态码分类HTTP状态码列表 一、HTTP介绍…...

linux性能分析(五)如何学习linux性能优化

一 如何学习linux性能优化 强调&#xff1a; 由于知识记忆曲线以及某些知识点不常用,所以一定要注重复习思考&#xff1a; 如何进行能力转义以及能力嫁接? --> 真正站在巨人的肩膀上性能调优的目的&#xff1a; 不影响系统稳定性的资源最大利用化补充&#xff1a; 性能…...

1402. 做菜顺序 --力扣 --JAVA

题目 一个厨师收集了他 n 道菜的满意程度 satisfaction &#xff0c;这个厨师做出每道菜的时间都是 1 单位时间。 一道菜的 「 like-time 系数 」定义为烹饪这道菜结束的时间&#xff08;包含之前每道菜所花费的时间&#xff09;乘以这道菜的满意程度&#xff0c;也就是 time[i…...

Springboot踩坑-request body重复读问题

背景 在一次业务开发中&#xff0c;由于需要在拦截器中对一个http请求中request body内容做解析和判断&#xff0c;所以用了httpServletRequest的getInputStream解析了request body内容&#xff0c;之后导致了拦截器处理成功后&#xff0c;原来的业务接口处报request body not…...

C++ 类和对象(六)赋值运算符重载

1 运算符重载 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c; 也具有其返回值类型&#xff0c;函数名字以及参数列表&#xff0c;其返回值类型与参数列表与普通的函数类似。 函数名字为&#xff1a;关键字operator后面接需…...

rust学习-trait std::cmp::PartialEq、Eq、PartialOrd、Ord

PartialEq 介绍 pub trait PartialEq<Rhs = Self> whereRhs: ?Sized, {// Required method,后文有讲解这个注释fn eq(&self, other: &Rhs) -> bool;// Provided method,后文有讲解这个注释fn ne(&self, other: &Rhs) -> bool {... } }x.eq(y)…...

k8s pod根据指标自动扩缩容举例

目录 基于 内存 指标实现pod自动扩缩容 举例配置 基于 cpu 指标实现pod自动扩缩容 举例配置 基于请求数&#xff08;次/秒&#xff09; 指标实现pod自动扩缩容 举例配置 基于 http请求响应时间 (ms) 指标实现pod自动扩缩容 举例配置 基于 Java GC暂停时间 (ms) 指标实现…...

深、浅拷贝之间的关系

深、浅拷贝之间的关系 什么是赋值 赋值是将某一数值或对象赋给某个变量的过程&#xff0c;分为下面 2 部分 基本数据类型&#xff1a;赋值&#xff0c;赋值之后两个变量互不影响引用数据类型&#xff1a;赋址&#xff0c;两个变量具有相同的引用&#xff0c;指向同一个对象&…...

服务器数据恢复-某银行服务器硬盘数据恢复案例

服务器故障&分析&#xff1a; 某银行的某一业务模块崩溃&#xff0c;无法正常使用。排查服务器故障&#xff0c;发现运行该业务模块的服务器中多块硬盘离线&#xff0c;导致上层应用崩溃。 故障服务器内多块硬盘掉线&#xff0c;硬盘掉线数量超过服务器raid阵列冗余级别所允…...

仪器器材经营小程序商城的作用是什么

互联网发展下&#xff0c;数字化转型已经成为常态&#xff0c;仅依赖传统线下经营模式将很难再增长。 作为产品销售及客户维护度高的仪器器材行业&#xff0c;拥有自营商城平台是必要的&#xff0c;不仅可以解决以上难题&#xff0c;还利于打造自身品牌多渠道传播&#xff0c;…...

京东数据分析:2023年9月京东洗烘套装品牌销量排行榜!

鲸参谋监测的京东平台9月份洗烘套装市场销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;今年9月份&#xff0c;京东平台洗烘套装的销量为7100&#xff0c;环比下降约37%&#xff0c;同比增长约87%&#xff1b;销售额为6000万&#xff0c;环比下降约48%&#…...

论文阅读-多目标强化学习-envelope MOQ-learning

introduction 一种多目标强化学习算法&#xff0c;来自2019 Nips《A Generalized Algorithm for Multi-Objective Reinforcement Learning and Policy Adaptation》本文引用代码全部来源于论文中的链接。主要参考run_e3c_double.py文件 1 总体思想 1.将输入中加入多目标的偏…...

【原创】【考法总结】指针*与++结合的题目考法总结

代码均已调试出结果&#xff0c;放心食用&#xff0c;大致总共5种考法 【理论铺垫】①a[i]恒等价于(ai)即*(&a[0]i)&#xff1b;i类似偏移量&#xff08;别忘a代表数组首元素地址即&a[0]&#xff09; ②*(&a[i])恒等价于a[i]&#xff1a;&a[i]表示a[i]的地址&a…...

react dispatch不生效的坑

一、前言 最近写react antd项目&#xff0c;在A页面中使用了dispatch方法&#xff0c;然后B页面中嵌套A页面&#xff0c;没有问题&#xff1b; 但是在C页面中嵌套A页面的时候&#xff0c;就发现dispatch方法没有执行&#xff0c;也不报错&#xff0c;就很奇怪&#xff1b; 还…...

Mingw快捷安装教程 并完美解决出现的下载错误:The file has been downloaded incorrectly

安装c语言编译器的时候&#xff0c;老是出现The file has been downloaded incorrectly&#xff0c;真的让人 直接去官网拿压缩包&#xff1a;https://sourceforge.net/projects/mingw-w64/files/ &#xff08;往下拉找到那个x86_64-win32-seh的链接&#xff0c;点击后会自动…...

OpenGL —— 2.6、绘制一个正方体并贴图(附源码,glfw+glad)

源码效果 C源码 纹理图片 需下载stb_image.h这个解码图片的库&#xff0c;该库只有一个头文件。 具体代码&#xff1a; vertexShader.glsl #version 330 corelayout(location 0) in vec3 aPos; layout(location 1) in vec2 aUV;out vec2 outUV;uniform mat4 _viewMatrix; u…...

JavaWeb从入门到起飞笔记——导学课程

学完这一节&#xff0c;我不知道学Web开发究竟能干什么&#xff1f;你知道吗&#xff1f; 以下是黑马程序员Java从入门到起飞的笔记 一、学完Javaweb能干什么&#xff1f; 学完Java后我们可以独立开发一些后台管理系统&#xff0c;例如CRMER器&#xff0c;京东和淘宝&#x…...

【LeetCode:1402. 做菜顺序 | 动态规划 + 贪心】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…...

从《Allergy》到《Queencard》:解码K-POP背后的女性成长叙事

1. 从《Allergy》到《Queencard》&#xff1a;一场关于女性自我认同的视觉叙事 第一次听到《Queencard》那魔性的副歌时&#xff0c;我和大多数人一样&#xff0c;以为这不过是又一首典型的K-POP洗脑神曲。直到偶然点开弹幕里提到的"连续剧式MV"&#xff0c;才意识到…...

QT记事本进阶——巧用QMap构建编码映射,实现ComboBox与QTextStream的无缝对接

1. 为什么需要编码映射&#xff1f; 在开发一个支持多编码的文本编辑器时&#xff0c;最头疼的问题之一就是如何让用户选择的编码名称&#xff08;比如"UTF-8"、"GBK"&#xff09;能够正确转换为Qt内部的编码枚举值。这个问题在Qt 6.9之后变得更加突出&…...

Piston性能优化秘籍:10个技巧提升代码执行效率

Piston性能优化秘籍&#xff1a;10个技巧提升代码执行效率 【免费下载链接】piston A high performance general purpose code execution engine. 项目地址: https://gitcode.com/gh_mirrors/pis/piston Piston作为一款高性能通用代码执行引擎&#xff0c;能够安全高效地…...

Cellpose-SAM:AI细胞分割的“零参数“革命,生物医学图像分析的范式转变

Cellpose-SAM&#xff1a;AI细胞分割的"零参数"革命&#xff0c;生物医学图像分析的范式转变 【免费下载链接】cellpose a generalist algorithm for cellular segmentation with human-in-the-loop capabilities 项目地址: https://gitcode.com/gh_mirrors/ce/cel…...

NVIDIA Profile Inspector终极指南:解锁显卡隐藏性能的3个简单步骤

NVIDIA Profile Inspector终极指南&#xff1a;解锁显卡隐藏性能的3个简单步骤 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 你是否觉得NVIDIA官方控制面板的设置选项太过有限&#xff1f;是否想要为…...

如何用 Dask 替代 Pandas 实现高效 Excel 数据处理

本文详解如何将原有 pandas excel 处理流程迁移到 dask&#xff0c;重点解决大文件并行读取、惰性计算与内存优化问题&#xff0c;并提供可直接运行的改写示例及关键注意事项。 本文详解如何将原有 pandas excel 处理流程迁移到 dask&#xff0c;重点解决大文件并行读取、…...

谷歌为 Pixel 10 调制解调器嵌入 Rust 组件,破解内存安全难题

【导语&#xff1a;现代智能手机操作系统虽有众多安全机制&#xff0c;但调制解调器的安全问题仍不容忽视。谷歌 Project Zero 团队的研究促使谷歌重新评估调制解调器安全&#xff0c;决定将基于 Rust 的组件嵌入 Pixel 10 调制解调器。】调制解调器成攻击重灾区现代智能手机操…...

工业肌肉:03 变频器到底改变了什么?为什么它能让电机“听话”

03 变频器到底改变了什么?为什么它能让电机“听话” 变频器不是控制电机,而是控制电机背后的“电磁节奏”。 上次把伺服舞王拆得七零八落,今天终于轮到咱们车间里最亲民的“大管家”——变频器了。工厂里风机、水泵、传送带、搅拌机……哪台大电机旁边没挂个铁箱子?别看它其…...

SillyTavern角色系统深度解析:构建沉浸式AI交互体验的技术架构与实践

SillyTavern角色系统深度解析&#xff1a;构建沉浸式AI交互体验的技术架构与实践 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern SillyTavern作为面向高级用户的LLM前端工具&#xff0c;其…...

RT-DETR实战入门:从零搭建PyTorch训练环境与数据准备

1. RT-DETR简介与环境配置 RT-DETR是百度最新推出的实时目标检测模型&#xff0c;基于Transformer架构设计&#xff0c;在速度和精度上都有不错的表现。相比传统的YOLO系列&#xff0c;RT-DETR采用了更先进的注意力机制&#xff0c;能够更好地处理复杂场景中的目标检测任务。对…...