C语言梦开始的地方5:总结之猜数字

发布时间:2026/10/6 3:28:20

C语言梦开始的地方5:总结之猜数字 文章目录C语言梦开始的地方5总结之猜数字随机值与时间戳随机值生成时间戳猜数字代码实现随机数范围游戏菜单实现猜数字代码实现完整代码拓展游戏分享C语言梦开始的地方5总结之猜数字前四章我们了解了 C 语言的三大结构、关键字、操作符以及选择与循环语句。但单纯地学语法很难感受到这些知识点是如何配合使用的。本章我们就将前四章的知识点汇总起来实现一个简单的小游戏猜数字通过实际项目来检验前面的知识。游戏要求电脑自动生成1~100的随机数玩家猜数字猜数字的过程中根据猜测数据的大小给出大了或小了的反馈直到猜对游戏结束随机值与时间戳随机值生成猜数字我们首先让代码来生成一个随机数这样我们才能去猜而不是我们随便输入一个数来猜。C语言也给我们提供了一个函数rand这个函数是可以生成随机数的该函数的原型如下#include stdlib.h int rand(void);该函数生成的随机数是一个伪随机这个随机数的范围是0~RAND_MAX之间这个RAND_MAX的范围大小是根据编译器来定的大部分编译器上是32767。包含在stdlib.h这个头文件中。#includestdio.h#includestdlib.hintmain(){for(inti0;i5;i){printf(%d\n,rand());}return0;}但是运行该程序发现是生成了随机值但是连续运行我们发现随机值是一样的为什么会这样这是因为rand这俩次的随机种子都是一样的rand是确定性伪随机数生成器同样的种子 → 完全相同的完整序列并且你如果运行上述代码得出的结果是和我的大概率是一样的。因为rand的随机种子默认为1所以为了每次都不一样我们需要给rand每次重置它的随机种子同样C语言也提供了该函数srandsrand的函数原型如下void srand (unsigned int seed);它的作用就是每次运行去重置rand函数的随机种子程序中在调用 rand 函数之前先调用 srand 函数通过 srand 函数的参数seed来设置rand函数生成随机数的时候的种子只要种子在变化每次生成的随机数序列也就变化起来了。但是srand需要设置参数如果我们手动的去输入此时使不使用srand都没区别一样每次运行的值都是一样的。所以此时我们除了上述的rand和srand我们还需要一个函数time。时间戳那么我们想要每次都不一样我们就需要用到time函数time函数包含在time.h头文件中该函数的原型如下time_t time(time_t *timer)那么该函数是怎么做到的呢该函数是通过获取时间戳来实现的。timerNULL时得到当前日历时间从1970-01-01 00:00:00到现在的秒数timer时间数值时用于设置日历时间time_t是一个unsigned long类型。如果 timer不为空则返回值也存储在变量 timer中。时间戳是UNIX系统约定的从1970年的1月1日的0点0分0秒开始的时间。Linux和MaxOS就是继承该时间戳Windows内部使用的是从1601-01-01 作基准Win32 FILETIME只是 C 库帮你转换成 Unix 时间戳所以你在 time() 里看到的仍是 1970。配合上述的三个知识点我们去修改之前的代码#includestdio.h#includestdlib.h#includetime.hintmain(){// 因为这里time返回的参数是time_t的所以要强制转换成unsigned int类型srand((unsignedint)time(NULL));for(inti0;i5;i){printf(%d\n,rand());}return0;}猜数字代码实现我们通过上述函数得到了随机值后我们就可以开始来编写猜数字的代码了。首先我们要先分享该项目的代码要怎么来写猜数字的范围我们要在多少要怎么计算游戏开始菜单界面猜数字时给出提示分别是大了小了和找到了找到数字后是否继续游玩还是退出拓展是否需要提升难度比如要给次数如果在一定的次数内没有猜到给出惩罚。随机数范围生成0 ~ 99的随机数范围rand() % 100;生成1 ~ 100的随机范围rand() % 100 1;以此类推游戏菜单实现voidmenu(){printf(****************\n);printf( 1.开始游戏\n);printf( 0.退出游戏\n);printf(****************\n);printf(请选择:);}该代码我们发现不在main函数里面而是一个叫void menu()函数这是C语言的模块化设计也就是C语言的函数比如说该menu是专门负责界面的代码下面还有游戏实现的代码。void的意思就是无序返回值即不需要返回。主要是维护代码的可读性和可维护。后续我们会去系统的了解C语言函数这一章节。不写menu之间放在main函数里面也可以只是不好阅读代码这里我们可以使用goto来完成这种函数调用的方式但是不建议这样。goto在实际开发中使用的很少所以goto我们当时只作了解。这里提醒一点就是goto不能跨函数比如说我们在main函数里面写goto但是标签名在menu函数就会报错。猜数字代码实现主函数部分这里使用do······while是因为我们要去打开游戏才会选择到底玩不玩所以必须循环一次intmain(){intinput0;srand((unsignedint)time(NULL));do{menu();scanf(%d,input);switch(input){case1:game();break;case0:printf(退出游戏\n);break;default:printf(输入有误请重新选择\n);break;}}while(input);return0;}游戏部分voidgame(){intguess0;intret(rand()%100)1;while(1){printf(请输入你猜的数字(1~100):);scanf(%d,guess);if(guessret){printf(猜大了\n);}elseif(guessret){printf(猜小了\n);}else{printf(恭喜你猜对了答案是 %d\n,ret);break;}}}完整代码#includestdio.h#includestdlib.h#includetime.hvoidmenu(){printf(****************\n);printf( 1.开始游戏\n);printf( 0.退出游戏\n);printf(****************\n);printf(请选择:);}voidgame(){intguess0;intret(rand()%100)1;while(1){printf(请输入你猜的数字(1~100):);scanf(%d,guess);if(guessret){printf(猜大了\n);}elseif(guessret){printf(猜小了\n);}else{printf(恭喜你猜对了答案是 %d\n,ret);break;}}}intmain(){intinput0;srand((unsignedint)time(NULL));do{menu();scanf(%d,input);switch(input){case1:game();break;case0:printf(退出游戏\n);break;default:printf(输入有误请重新选择\n);break;}}while(input);return0;}拓展给游戏提高难度#includestdio.h#includestdlib.h#includetime.h#includewindows.hvoidmenu(){printf(****************\n);printf( 1.开始游戏\n);printf( 0.退出游戏\n);printf(****************\n);printf(请选择:);}voidgame(){intguess0;intret(rand()%100)1;intcnt5;while(cnt0){printf(请输入你猜的数字(1~100):);scanf(%d,guess);if(guessret){printf(猜大了\n);}elseif(guessret){printf(猜小了\n);}else{printf(恭喜你猜对了答案是 %d\n,ret);break;}cnt--;}if(cnt0){printf(你失败了正确值是:%d\n,ret);}}intmain(){SetConsoleOutputCP(65001);intinput0;srand((unsignedint)time(NULL));do{menu();scanf(%d,input);switch(input){case1:game();break;case0:printf(退出游戏\n);break;default:printf(输入有误请重新选择\n);break;}}while(input);return0;}这里也可以给一些惩罚比如调用Windows的关机命令或者其他命令或者其他惩罚都可以后续随着我们对C语言的了解深入还可以继续拓展该代码。游戏分享当我们写完该代码时我们想给其他人该怎么办有可能给的人没有C语言的编译环境那么他就无法运行并且我们还要给完整的源代码这和不方便那么有什么办法去解决呢如果你使用的是 Visual Studio切换成Release模式在Visual Studio顶部的工具栏中找到“解决方案配置”下拉菜单将Debug切换为Release。重新生成解决方案点击菜单栏的“生成” - “生成解决方案”。找到 .exe 文件打开你的项目文件夹进入 bin\Release 目录里面就是你需要的.exe文件。如果你使用的是 VSCode在VSCode中你需要通过命令行使用gcc编译器来生成.exe文件。打开终端在VSCode中点击“终端”(Terminal)菜单选择“新建终端”(New Terminal)。切换到代码目录在终端中使用cd命令切换到你的C语言源代码文件.c文件所在的目录。执行编译命令输入以下命令并回车gcc 你的源文件名.c-o你想要的名字.exe完
延伸阅读

更多相关文章

2026/9/29 20:05:37

C++类语法深度解析:从编译器视角理解类设计核心机制

1. 项目概述:为什么我们需要深入理解C类语法? 在C的世界里,“类”这个概念,就像建筑师的蓝图,是构建复杂、健壮软件系统的基石。无论是刚入门的新手,还是工作多年的老手,对类语法的理解深度&…

2026/10/4 20:55:56

学生课程汇报PPT,哪个AI工具最好用?我实测了6款,结论有点意外

又到了期末汇报季,朋友圈里哀嚎一片——“PPT做到凌晨三点”“排版排到怀疑人生”“模板翻了两小时还没找到合适的”…… 这场景我太熟了。做课程汇报这件事,说难不难,说简单吧——翻模板、搭框架、填内容、调字体、对齐元素,一套…

2026/10/6 3:23:32

从请求报文到线上排障:HTTP协议系统性理解与实战指南

前两天帮同事排查一个线上接口问题,他把浏览器里复制出来的 curl 命令直接甩给我,附带一句“帮我看看为啥接口超时”。我问他“超时是连接超时还是读超时,TTFB 多少,看没看响应头的 Cache-Control”,他愣了一下&#x…

2026/10/6 3:23:32

std::list 底层探秘:双向链表、哨兵节点与实现细节

很多人都在用std::list,可一旦被问到它底层到底怎么实现的,十有八九会卡壳。std::list底层是一个双向链表,节点在堆上独立分配,通过prev和next指针串起来,跟vector那种连续内存完全是两个世界。它解决的是序列容器里“…

2026/10/6 3:23:32

H.264分析工具实战:从NALU到宏块定位视频花屏与卡顿

简介:H.264分析工具是一套面向视频编码开发与调试的H.264/AVC码流解析资源,适合视频工程师、编解码学习者和内容创作者使用。包内共186个文件,以C/C源码(h与cpp文件)为主,同时包含可执行程序、示例H.264/H.…

2026/10/6 3:23:32

微信小程序商城毕设全解析:环境配置、避坑指南与二次开发

简介:这套毕业设计资源基于微信小程序打造完整商城项目,适合计算机相关专业学生完成毕业设计或课程设计,也适合刚入门小程序开发的新手对照学习。项目包含前端小程序页面与后端服务代码,覆盖商城、商品详情、发现、我的、支付、消…

2026/10/6 3:23:32

25个你一定要掌握的JavaScript技巧,是新手到高手的进阶秘籍!

JavaScript 一直在更新,变得越来越好用。从 ES6 开始,加入了很多新写法,能让你的代码更短、更清楚,也常常运行得更快。掌握这些技巧,不仅能让你写代码更快,还能让代码更容易让别人看懂和维护,代…

2026/10/6 3:18:31

旧电脑改造NAS全攻略:硬件选型到数据备份的实战指南

家里那台旧电脑吃灰半年后,我总算给它找了个正经归宿——自建一台家用NAS。折腾下来最大的感受是:网上教程多,但能一口气把事情讲透的太少。要么只给你甩几条命令,要么上来就推高价成品机,很少有人把“为什么要这样选”…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/4 0:01:02

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/5 17:38:27

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 0:03:23

MR25H40CDF+STM32F031C6工业级高可靠数据存储方案

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的 PLC 控制柜里、在风电变流器的散热片背面、在矿井监测终端的金属外壳下,你经常能看到一块指甲盖大小的黑色芯片——它既不是 Flash,也不是…

2026/10/6 0:03:23

MRAM+STM32工业断电数据保全实战指南

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的PLC柜里、在野外无人值守的环境监测终端里、在高速运转的包装机控制板上,你经常能看到一块指甲盖大小的黑色芯片,旁边贴着“MR25H40CDF”丝…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑