超好玩又简单-猜数字游戏(有手就行)

云边有个稻草人-CSDN博客

我的个人主页

目录

云边有个稻草人-CSDN博客

前言

猜数字游戏的游戏要求

1. 随机数的生成

1.1 rand

1.2 srand

1.3 time

1.4 设置随机数的范围

2. 猜数字游戏实现

2.1 游戏实现基本思路

2.2 代码实现

Relaxing Time!

——————————————《My type》——————————————


正文开始——

前言

前面我们学习了C语言常见概念数据类型和变量以及分支与循环,现在我们就可以整合这些知识写一个 interesting 的小游戏啦,此刻展现我们学习成果的时候到了!今天我们尝试猜数字游戏代码的编写。

猜数字游戏的游戏要求

  1. 电脑自动随机生成一个1~100的随机数
  2. 玩家猜数字,猜数字的过程,根据猜测数据的大小给出猜大了还是猜小了的反馈,直到猜对,游戏结束。

唉,有个疑问,想要完成猜数字游戏,第一步那肯定是先产生一个随机数,那么该如何产生一个随机数呢?

1. 随机数的生成

1.1 rand

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

int rand (void);

rand函数会返回一个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的大小是依赖编译器上实现的,但是大部分编译器上是32767;同时使用 rand函数 需要包含头文件,stdlib.h

那我们就来试用一下rand函数,多调用几次看看产生的随机数

#include<stdio.h>
#include<stdlib.h>int main()
{printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());return 0;
}

 我们对这个代码多次运行,发现前后几次产生的随机数都是相同的,这就说明这种产生随机数的方式有点问题,咋回事捏?

如果我们再深入了解一下,其实 rand函数 生成的随机数是伪随机的,伪随机数并不是真正的随机数,是通过某种算法生成的随机数。真正的随机数是无法预测下一个值是多少的。而 rand函数 是对一个叫“种子”的基准值进行运算生成的随机数。之所以前面每次运行程序产生的随机数序列是一样的,那是因为 rand函数 生成随机数的默认种子是1。如果要生成不同的随机数,就要让种子是变化的。

那如何让种子是变化的呢?那我们来学习srand就知道啦

1.2 srand

 C语言又提供了一个函数叫srand,用来初始化随机数的生成器的,srand的原型如下:

void srand (unsigned int seed);

程序中在调用 rand函数 之前先调用 srand函数,通过srand函数的参数seed来设置rand函数生成随机数时候的种子,只要种子在变化,每次生成的随机数序列也就变化起来了。BUT!想一想,此时我们还得给 srand 的参数传一个随机数,这,这,就,想想何必呢,本来一开始就是想要一个随机数,结果现在折腾半天还需要一个随机数才能产生另一个随机数,看来这种方法不可行呀,换一条路吧。(这让我想起了,“你已偏离路线,已为你重新规划路线,请在合适的地方掉头”) 

在程序中我们一般是使用程序运行的时间作为种子的,因为时间是时刻在发生变化。下面来学习time函数

1.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.h

如果只是让time函数返回时间戳,我们就可以这样写:

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

那么我们再尝试改写生成随机数的代码见下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>int main()
{//使用time函数的返回值来设置种子//因为srand的参数是unsigned int类型,我们将time函数的返回值强制类型转换一下srand((unsigned int)time(NULL));printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());return 0;
}

多运行几次,发现每次生成的随机数都不一样,哇偶,那就成功了!

srand函数是不需要频繁调用的,一次运行的程序中调用一次就够了。

根据游戏要求,我们要生成1~100之间的随机数,可是上面我们生成的数字是在0~32767之间的数字,那么我们该如何生成1~100之间的数字呢?

1.4 设置随机数的范围

如果我们要生成0~99之间的数字,方法见下:

rand () % 100;//余数的范围是0~99

如果我们要生成1~100之间的随机数,方法见下:

rand () % 100+1;//在原余数的基础上+1,那么余数范围就变成了1~100

如果要生成100~200之间的随机数,方法见下:

rand () % 101+100;

挺简单。这样就可以生成1~100之间的随机数了,见下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>int main()
{//使用time函数的返回值来设置种子//因为srand的参数是unsigned int类型,我们将time函数的返回值强制类型转换一下srand((unsigned int)time(NULL));printf("%d\n", rand() % 100 + 1);printf("%d\n", rand() % 100 + 1);printf("%d\n", rand() % 100 + 1);printf("%d\n", rand() % 100 + 1);printf("%d\n", rand() % 100 + 1);return 0;
}

2. 猜数字游戏实现

2.1 游戏实现基本思路

基本的外部框架借助 do-while循环 来实现,实现循环的条件还挺妙的我赶脚,下一次进入循环可以借助上一次的选择,仔细品一品。首先上来就先打印菜单,我们可以把菜单(以及后面的游戏逻辑)封装成一个函数,没有冗杂的函数这样main函数里面更显逻辑清晰,然后根据我们的选择展开后续;如果我们选择进入游戏,需要先产生一个随机数,注意不要把产生随机数的环节加入到while循环里面,不然每次猜都会生成一个随机数可能永远都猜不到,因为rand函数的种子是以time函数的返回值为参数的,时间戳在随时变化,那么如果放到循环里面每次判断一轮产生的rand的返回值都不一样随机数也就在变化,除非你好运爆棚一次就中,记得买个彩票哦;再接着我们就可以猜数字了,判断我们猜大了还是猜小了直到猜对为止,或者我们可以限制猜的次数,正如下面代码实现的那样,然后就没有然后了......快试一试吧

2.2 代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>void menu()
{printf("********************\n");printf("****** 1.play ******\n");printf("****** 0.exit ******\n");printf("********************\n");
}void game()
{int count = 5;//产生一个1~100之间的随机数int r = rand() % 100 + 1;int guess = 0;while (count){printf("请猜数字>: ");scanf("%d", &guess);if (guess > r){printf("猜大了\n");}else if (guess < r){printf("猜小了\n");}else{printf("恭喜你,猜对了\n");break;}count--;printf("还剩余%d次机会\n", count);}//跳出while循环有2种可能,一种是猜对了,一种是count==0结束循环printf("很遗憾,没有机会了,正确的数字是 %d ,再接再厉\n", r);}int main()
{//设立一个变量存放菜单选择int input = 0;//用time函数的返回值来设置种子,注意要进行强制类型转换srand((unsigned int)time(NULL));do{//上来先打印菜单menu();printf("请选择: ");scanf("%d", &input);//根据你的菜单选择进行不同的游戏状态switch (input){case 1:game();break;case 0:printf("游戏结束\n");break;default :printf("输入错误,请重新选择\n\n");break;}} while (input);return 0;
}

新手入门必学的猜数字游戏,还挺简单的吧,后面我还会继续出各种有趣小游戏的实现,一起加油!


Relaxing Time!

《My type》

【My Type_The Chainsmokers、Emily Warren_高音质在线试听_My Type歌词|歌曲下载_酷狗音乐】

云边有个稻草人

期待与你的下一次相遇!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Qt的多线程并行和循序运行实验Demo

致谢&#xff08;Acknowledgement&#xff09;&#xff1a; 感谢Youtube博主Qt With Ketan与KDAB精心录制的Qt多线程处理应用教程&#xff0c;感谢Bilibili博主爱编程的大丙对Qt多线程与线程池内容深入浅出的讲解。 一、计算机线程相关概念 线程概念[1]&#xff1a; 在计算机科…

2024年9月电子学会青少年软件编程Python等级考试(三级)真题试卷

2024年9月青少年软件编程Python等级考试&#xff08;三级&#xff09;真题试卷 选择题 第 1 题 单选题 以下python表达式的值为True的是&#xff1f;&#xff08; &#xff09; A.all( ,1,2,3) B.any([]) C.bool(abc) D.divmod(6,0) 第 2 题 单选题 下列python代码的…

smuge error

0 Preface/Foreword 1 解决方法 第一步&#xff1a;跳过大文件下载&#xff0c;到时候统一使用快速批处理fast batch git lfs install --skip-smudge 故意敲错指令&#xff0c;会出现git lfs install 的usage&#xff1a; 第二步&#xff1a;clone仓库 下载结果&#xff1a;…

如何用猿大师办公助手实现OA系统中Word公文/合同在线编辑及流转?

在OA系统或者合同管理系统中&#xff0c;我们会经常遇到网页在线编辑Word文档形式的公文及合同的情况&#xff0c;并且需要上级对下级的公文进行批注等操作&#xff0c;或者不同部门的人需要签字审核&#xff0c;这就需要用到文档流转功能&#xff0c;如何用猿大师办公助手实现…

HTB:Analytics[WriteUP]

目录 连接至HTB服务器并启动靶机 1.How many open TCP ports are listening on Analytics? 2.What subdomain is configured to provide a different application on the target web server? 3.What application is running on data.analytical.htb? 4.What version of…

计算机网络IP地址分类,子网掩码,子网划分复习资料

IP 地址的概念 IP 地址是独立于硬件地址的逻辑地址&#xff0c;它是由软件提供的地址。 IP 地址是网络层地址。 IP 编址方案和分类 IP 地址由 32 位二进制数构成&#xff0c;分为前缀(网络地址)和后缀(主机地址) 同一网段中每台计算机的 IP 地址是唯一的网络地址的分配全球…

stm32入门教程--DMA 超详细!!!

目录 简介 工作模式 1、数据转运DMA 2、ADC扫描模式DMA 简介 工作模式 1、数据转运DMA 这个例子的任务是将SRAM的数组DataA&#xff0c;转运到另一个数组DataB中&#xff0c;这个基本结构里的各个参数应该如何配置呢&#xff1f; 首先是外设站点和存储器站点的起始地址、…

宇音天下最新力作 | VTX356语音识别合成芯片问世

北京宇音天下科技有限公司&#xff0c;依托在语音技术领域的丰富经验和技术积累&#xff0c;成功推出了一款具有里程碑意义的语音识别合成芯片——VTX356。这款芯片的问世&#xff0c;不仅彰显了公司在智能语音处理领域的专业实力&#xff0c;也预示着智能家居、车载电子、智能…

STM32F1+HAL库+FreeTOTS学习21——内存管理

STM32F1HAL库FreeTOTS学习21——内存管理 1. 内存管理简介2. 内存管理相关的API函数3. 内存管理算法4. 内存管理实验4.1. 实验内容4.2 代码实现4.3 运行结果 5. 总结 上一期我们学习了FreeRTOS中的低功耗Tickless模式&#xff0c;这一期我们学习最后一个章节&#xff1a;内存管…

Linux高手进阶

查看系统资源占用&#xff1a; top&#xff1a;查看CPU、内存使用情况&#xff0c;类似 windows 的任务管理器 默认 5秒刷新一次语法&#xff1a; 直接输入 top按 q 或 ctrl c 退出内容详解&#xff1a; 第一行&#xff1a; top&#xff1a;命令名称 -系统时间up 23:57 min &…

vue3学习记录-单文件组件 CSS 功能

vue3学习记录-单文件组件 CSS 功能 1.组件作用域 CSS1.1为什么要用到样式穿透&#xff08;&#xff1a;deep&#xff08;&#xff09;&#xff09;1.2 插槽选择器:slotted(div)1.3 全局选择器:global 2.CSS Modules2.1 基本用法2.2 自定义注入名称2.3 与组合式 API 一同使用 3.…

postman如何安装旧版本不升级(以9.31和11.10版本为例)

postman版本超过10.x&#xff08;包含10.x)&#xff0c;有个大的麻烦&#xff0c;就是需要登录账号&#xff0c;如果网络不佳&#xff08;其实是外网受限&#xff09;,那就很难受了 功能页面都进不去了&#xff01;而8.x /9.x等以下版本就不需要登录了。 比如9.31.30这个版本就…

Cesium基础-(Entity)-(Corridor 走廊)

里边包含Vue、React框架代码详细步骤、以及代码详细解释 4、Corridor 走廊 以下是 CorridorGeometry 类的属性、方法和静态方法,以表格形式展示: 属性 属性名类型默认值描述positionsArray.定义走廊中心的坐标点数组。widthnumber走廊

PHP程序开发基础

PHP简介及其开发环境与工具一、PHP简介 PHP是一种流行的服务器端脚本语言&#xff0c;最初由拉斯姆斯勒多父于1994年创建&#xff0c;旨在通过C语言编写小程序以统计网站的访问流量。自那时以来&#xff0c;PHP已经经历了多个版本的迭代&#xff0c;功能不断增强&#xff0c;应…

使用Canvas绘制地图

既然是通过canvas来绘制地图&#xff0c;那肯定是需要地图的数据信息的。接下来跟着我的脚步去实现这些细节。 地图数据 地图数据怎么来呢&#xff1f;当然是怎么简单怎么来 npm i surbowl/world-geo-json-zh 这个第三方包是简体中文 Geo JSON 世界地图&#xff0c;带有国家…

丁子晴作品《指尖的爱的温度》荣获“金犊奖”全球最佳新锐奖

第33届时报金犊奖颁奖盛典于10月18日在中国成都西部智谷数字体验中心隆重举行。丁子晴的作品《指尖的爱的温度》在激烈的竞争中脱颖而出,荣获了第33届“金犊奖”全球最佳新锐奖。享有盛誉的“金犊奖”是一个全球性的奖项,以其专业严谨、创意水平高的特点,被业界誉为“青年创意的…

Opensearch集群部署【docker、服务器、Helm多种部署方式】

操作系统兼容性 我们建议在 Red Hat Enterprise Linux (RHEL) 或使用systemd的基于 Debian 的 Linux 发行版上安装 OpenSearch &#xff0c;例如 CentOS、Amazon Linux 2 和 Ubuntu Long-Term Support (LTS)。OpenSearch 应该适用于大多数 Linux 发行版&#xff0c;但我们只测…

高级java每日一道面试题-2024年10月22日-JVM篇-JVM堆栈概念,何时销毁对象?

如果有遗漏,评论区告诉我进行补充 面试官: JVM堆栈概念,何时销毁对象? 我回答: JVM堆栈概念 栈&#xff08;Stack&#xff09;&#xff1a; 定义&#xff1a;栈是Java虚拟机为每个线程分配的内存区域&#xff0c;用于存储线程执行时的局部变量、操作数栈、动态链接和方法返…

串口调试工具

https://download.csdn.net/download/jinhuding/89933087?spm1001.2014.3001.5501