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

C——猜数字游戏

前面我们已经学习了C语言常见概念,数据类型和变量以及分置于循环的内容,现在我们可以将这些内容结合起来写一个有趣的小游戏。下面正式开始我们今天的主题——猜数字游戏的实现。

猜数字游戏的要求:

1.电脑自动生成1~100的随机数。

2.玩家猜数字,猜数字的过程中,根据猜测的数据大小给出大了或小了的反馈,知道猜对,游戏结束。

看到这两个要求,我们首先想到的就是,随机数如何产生?

一、随机数的生成

1.rand

C语言提供了一个函数叫rand,这个函数可以生成随机数,函数原型如下:

int rand (void);

rand函数会返回⼀个伪随机数,这个随机数的范围是在0~ RAND_MAX 之间,这个RAND_MAX的⼤⼩是依赖编译器上实现的,但是⼤部分编译器上是32767。
rand函数的使用需要包含一个头文件<stdlib.h>。
我们先来测试一下rand函数,调用多几次,生成5个随机数。
我们先运⾏⼀次,看看结果,再运⾏⼀次再看看结果,多运⾏⼏次呢?
可以看出这两次生成的随机数是一样的,这就说明有问题了。
如果再深⼊了解⼀下,我们就不难发现,其实 rand 函数⽣成的随机数是伪随机的,伪随机数不是真正的随机数,是通过某种算法⽣成的随机数。真正的随机数的是⽆法预测下⼀个值是多少的。⽽ rand 函 数是对⼀个叫“种⼦”的基准值进⾏运算⽣成的随机数。
之所以前⾯每次运⾏程序产⽣的随机数序列是⼀样的,那是因为rand函数⽣成随机数的默认种⼦是1。如果要⽣成不同的随机数,就要让种⼦是变化的。
2.srand
C语⾔中⼜提供了⼀个函数叫 srand,⽤来初始化随机数的⽣成器的,srand的原型如下:
void srand (unsigned int seed);
程序中在调⽤ rand 函数之前先调⽤ srand 函数,通过 srand 函数的参数seed来设置rand函数⽣成随机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了。
那也就是说给srand的种⼦是如果是随机的,rand就能⽣成随机数;在⽣成随机数的时候⼜需要⼀个随机数,这就⽭盾了。
3.time
在程序中我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的。
在C语⾔中有⼀个函数叫 time ,就可以获得这个时间,time函数原型如下:
time_t time (time_t* timer);
time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型。
time函数的参数 timer 如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。
如果 timer 是 NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。
time函数的时候需要包含头⽂件:time.h
如果只是让time函数返回时间戳,我们就可以这样写:
time(NULL);//调⽤time函数返回时间戳,这⾥没有接收返回值
根据上面所述,我们可以将代码改进如下:
现在运行几次看看结果如何。
可以很明显的看出两次结果不相同。
srand函数是不需要频繁调⽤的,⼀次运⾏的程序中调⽤⼀次就够了。
根据游戏要求,我们要生成1~100之间的随机数,可是上面我们生成的数字是在0~32767之间的数字,那么我们该如何生成1~100之间的数字呢?
4.设置随机数的范围
如果我们要⽣成0~99之间的随机数,⽅法如下:
rand() % 100;//余数的范围是0~99
如果要⽣成1~100之间的随机数,⽅法如下:
rand() % 100 + 1;//%100的余数是0~99,0~99的数字+1,范围是1~100
如果要⽣成100~200的随机数,⽅法如下:
100 + rand() % (200 - 100 + 1)
//余数的范围是0~100,加100后就是100~200
所以如果要⽣成a~b的随机数,⽅法如下:
a + rand() % (b - a + 1)
很简单易懂吧,这样就可以生成1~100的随机数了,如下:
二、猜数字游戏的实现
1.基本思路
基本使用while、switch、case循环结合使用。首先,上来就打印菜单,显得逻辑清晰;然后根据我们的选择,选择进入游戏,就需要产生一个随机数,意不要把产生随机数的环节加入到while循环里面,不然每次猜都会生成一个随机数那那估计永远都猜不到,因为rand函数的种子是以time函数的返回值为参数的,时间戳在随时变化,那么如果放到循环里面每次判断一轮产生的rand的返回值都不一样随机数也就在变化,除非你运气好的爆炸,能够一次就猜中;再接着我们就可以开始猜数字了,判断我们猜大了还是猜小了直到猜对为止,或者我们可以限制猜的次数,正如下面代码实现的那样。
2.代码实现
3.如果想要增加难度,加上次数限制,代码如下:
新手入门的小游戏,应该算是比较简单的吧,希望能对大家有帮助。

相关文章:

  • RuoYi-v4.7.8 jar/war部署
  • n8n中订阅MQTT数据
  • 什么是硬件中断请求号?什么是中断向量号?
  • C++语法基础(上)
  • 基于单片机的电子法频率计
  • .Net HttpClient 处理响应数据
  • BGP实验练习1
  • 基于Docker的Bitwarden的私有本地部署
  • 在 Windows 系统上选择与部署 DICOM 医学影像开发工具与库
  • 【计算机视觉】基于深度学习的实时情绪检测系统:emotion-detection项目深度解析
  • C语言文件读写函数详解与示例(fread、fgets、fgetc、fscanf、fwrite、fputs 和 fputc比较)
  • Java学习手册:服务注册与发现
  • Mask-aware Pixel-Shuffle Down-Sampling (MPD) 下采样
  • Java对象的内存分布(二)
  • 数组的常用方法
  • TikTok 互动运营干货:AI 助力提升粘性
  • 理解CNN模型:从原理到应用
  • 程序中的内存从哪里来?
  • 【第三十五周】Janus-pro 技术报告阅读笔记
  • VSCode连接Overleaf失败解决办法
  • 央行等印发《关于金融支持广州南沙深化面向世界的粤港澳全面合作的意见》
  • OpenAI与微软正谈判修改合作条款,以推进未来IPO
  • “应急侠”上线,应急管理部正式发布应急科普IP形象
  • A股三大股指集体高开
  • 让胖东来“自闭”的玉石生意,究竟水有多深?
  • 巴西总统卢拉抵达北京