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

C语言:猜数字游戏

C语言:猜数字游戏

  • 一.随机数的生成
    • 1.rand函数
    • 2.srand函数
    • 3.time函数
  • 二.随机数范围的设置
  • 三.实现猜数字游戏

游戏要求
1.电脑⾃动⽣成1~100的随机数
2.玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了或小了的反馈,直到猜对,游戏结束

一.随机数的生成

玩猜数字游戏首先得要程序生成一个随机数让我们去猜,那这个随机数又是从哪里来的呢?

1.rand函数

rand函数是可以⽣成随机数
rand函数的使⽤需要包含⼀个头⽂件<stdlib.h>

intrand(void);//函数原型

rand函数会返回一个伪随机数

在这里可以测试一下,如下:

#include<stdio.h>#include<stdlib.h>intmain(){printf("%d\n",rand());printf("%d\n",rand());printf("%d\n",rand());return0;}



在这里我们发现多次运行结果都一样,这是因为rand函数生成的随机数是伪随机数,伪随机数不是真正的随机数,而是对一个叫“种子”的基准值进⾏运算⽣成的随机数。
rand函数⽣成随机数的默认种⼦是1,如果要⽣成不同的随机数,就要让种⼦是变化,那又如何让让种子变化,生成随机种子呢?

2.srand函数

srand函数是⽤来初始化随机数的⽣成器

voidsrand(unsignedintseed);//函数原型

程序中在调⽤rand函数之前先调⽤srand函数,通过srand函数的参数seed来设置rand函数⽣成随机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了。

但如果如上述所说,生成一个随机数需要另一个随机数,这样会相互矛盾,那又该如何解决?

3.time函数

使⽤程序运⾏的时间作为种⼦,因为时间时刻在发⽣变化的。

time函数的使⽤需要包含⼀个头⽂件<time.h>

time_ttime(time_t*timer);//函数原型,获得时间

time函数的参数timer如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存
中带回去。
如果timer是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳(可以网上了解一下)

time函数返回时间戳:

time(NULL);//调⽤time函数返回时间戳,这⾥没有接收返回值

那接下来就可以结合rand、srand和time三个函数写生成随机数的代码,如下所示:

#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){//使⽤time函数的返回值设置种⼦//因为srand的参数是unsigned int类型,我们将time函数的返回值强制类型转换srand((unsignedint)time(NULL));printf("%d\n",rand());printf("%d\n",rand());printf("%d\n",rand());return0;}



我们可以看到多次运行后的随机数不同

二.随机数范围的设置

1.通过取的随机数rand()常量取模(%)再加上或减去差值即可设置随机数的范围(在这里我们以设置1~100为例)

rand()%100;//余数的范围是0~99
rand()%100+1;//%100的余数是0~99,0~99的数字+1,范围是1~100
100+rand()%(200-100+1);//余数的范围是0~100,加100后就是100~200
a+rand()%(b-a+1);//⽣成a~b的随机数

三.实现猜数字游戏

通过我们现在所学的randsrandtime三个函数以及之前学的分支与循环语句即可写出该游戏代码。

如下所示:

#include<stdio.h>#include<stdlib.h>#include<time.h>voidgame(){intr=rand()%100+1;intguess=0;while(1){printf("请猜数字>:");scanf("%d",&guess);if(guess<r){printf("猜小了\n");}elseif(guess>r){printf("猜大了\n");}else{printf("恭喜你,猜对了\n");break;}}}voidmenu(){printf("***********************\n");printf("****** 1. play ******\n");printf("****** 0. exit ******\n");printf("***********************\n");}intmain(){intinput=0;srand((unsignedint)time(NULL));do{menu();printf("请选择:>");scanf("%d",&input);switch(input){case1:game();break;case0:printf("游戏结束\n");break;default:printf("选择错误,重新选择\n");break;}}while(input);return0;}

但是我们在运行的时候会发现这代码会一直运行下去,直到你才对为止。
由此我们可以对代码进一步改进,设置计数器count=sum,猜错一次,count–,用if语句判断当count==0时,跳出循环,游戏结束。

根据上述逻辑,该代码可以改成如下所示:

#include<stdio.h>#include<stdlib.h>#include<time.h>voidgame(){intr=rand()%100+1;intguess=0;intcount=5;while(count){printf("还有%d次机会",count);printf("请猜数字>:");scanf("%d",&guess);if(guess<r){printf("猜小了\n");}elseif(guess>r){printf("猜大了\n");}else{printf("恭喜你,猜对了\n");break;}count--;if(count==0){printf("次数用完,游戏结束");break;}}}voidmenu(){printf("***********************\n");printf("****** 1. play ******\n");printf("****** 0. exit ******\n");printf("***********************\n");}intmain(){intinput=0;srand((unsignedint)time(NULL));do{menu();printf("请选择:>");scanf("%d",&input);switch(input){case1:game();break;case0:printf("游戏结束\n");break;default:printf("选择错误,重新选择\n");break;}}while(input);return0;}

纸上得来终觉浅,绝知此事要躬行。

http://www.jsqmd.com/news/610728/

相关文章:

  • 袁永福 电子病历,医疗信息化蕴
  • 华三网络设备的静态、默认、RIP、OSPF路由配置
  • 告别论文格式内耗!Paperxie AI 排版:3 分钟搞定,导师看了都夸规范
  • HC-SR04中断驱动:消除delay阻塞的超声波测距方案
  • Claude Code源码分析-- Kairos自动助手和OpenClaw Heartbeat与普通 Proactive 区别
  • 句子嵌入(Sentence Embeddings)检索增强生成(RAG)已成为构建生成式 AI 应用的主流架构
  • 2026年质量好的超滤商用净水器/无桶商用净水器主流厂家对比评测 - 行业平台推荐
  • MindSpore 环境配置完全指南侍
  • 华三网络设备的路由重定向配置
  • 矿山三防灯配件如何选?彩光照明科技给出答案
  • ACL 2026 | 清华提出 TemplateRL:用结构化思维模板重塑大模型的强化学习推理范式
  • OpenClaw自动化测试:Qwen3-14b_int4_awq驱动Selenium完成Web交互验证
  • 知识蒸馏实战:如何用TinyBERT将BERT模型压缩到1/7大小(附代码)
  • Pixel Aurora Engine参数详解:CFG与Steps维度调控面板实操手册
  • 满足Pieper准则的6轴机械臂逆运动学解析解推导与实践
  • C语言:函数
  • 2026年热门测量显微镜品牌厂家推荐:工业质检选购避坑指南
  • 别再单机跑ETL了!手把手教你用Kettle 9.2.0搭建跨平台(Win+Linux)集群,处理海量数据
  • 为什么92%的Mojo开发者卡在插件安装环节?深度解析conda/pip/mojopm三工具兼容性冲突与降级方案
  • 再次革新 .NET 的构建和发布方式(一)日
  • 手把手教你用C#和VISA库控制Keysight 34461A万用表(VS2022环境)
  • 拆穿名词诈骗!用大白话理解晦涩难懂的AI概念媳
  • 【声纳与人工智能融合——从理论前沿到自主系统实战(进阶篇)】第十七章 声学情报(ACINT)的大语言模型(LLM)增强解析
  • 工业双氧水的危害及注意事项
  • OpenClaw技能扩展:安装Qwen3.5-9B专用代码审查模块
  • DejaVuSansMono嵌入式位图字体库深度解析
  • 为 Go 语言中的 sync.WaitGroup 添加超时等待机制
  • SAP MM模块预留功能实战:从创建到发料的完整流程解析
  • 再次革新 .NET 的构建和发布方式(一)窘
  • 别再手动折腾了!用Docker在Linux上5分钟搞定Terraria TShock服务器(含国内镜像加速)