C语言第四十一弹---猜数字游戏

 ✨个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】

猜数字游戏

1、随机数生成

1.1、rand

1.2、srand

1.3、time

1.4、设置随机数的范围

2、猜数字游戏的分析和设计

2.1、猜数字游戏功能说明

2.2、猜数字游戏的结构分析

2.2.1、用户选择

2.2.2、生成随机数

2.2.3、游戏设计

3、猜数字游戏实现

总结


1、随机数生成


要想完成猜数字游戏,首先得产生随机数,那怎么产生随机数呢?


1.1、rand


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

int rand (void);

rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的大小是依赖编译器上实现的,但是大部分编译器上是32767
rand函数的使用需要包含⼀个头文件是:#include<stdlib.h>
那我们就测试⼀下rand函数,这里多调用几次,产生5个随机数:

 

#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;
}

我们先运行⼀次,看看结果,再运行⼀次再看看结果,多运行几次呢?


我们可以看到虽然⼀次运行中产生的5个数字是相对随机的,但是下⼀次运行程序生成的结果和上⼀次⼀模⼀样,这就说明有点问题。

如果再深入了解⼀下,我们就不难发现,其实rand函数生成的随机数是伪随机的,伪随机数不是真正的随机数,是通过某种算法生成的随机数。真正的随机数的是无法预测下⼀个值是多少的。而rand函数是对⼀个叫“种子”的基准值进行运算生成的随机数。


之所以前面每次运行程序产生的随机数序列是⼀样的,那是因为rand函数生成随机数的默认种子是1。如果要生成不同的随机数,就要让种子是变化的。


1.2、srand


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

void srand (unsigned int seed);

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


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函数的时候需要包含头文件:#include<time.h>

//VS2022 上time_t类型的说明
#ifndef _CRT_NO_TIME_T
#ifdef _USE_32BIT_TIME_T
typedef __time32_t time_t;
#else
typedef __time64_t time_t;
#endif
#endif
typedef long __time32_t;
typedef __int64 __time64_t;

如果只是让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.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)

2、猜数字游戏的分析和设计

2.1、猜数字游戏功能说明

写⼀个猜数字游戏
游戏要求:

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

游戏界面:

2.2、猜数字游戏的结构分析

2.2.1、用户选择

首先用户选择需要的功能,输入1则进入游戏,输入0则退出游戏,输入其他值则重新输入

从这可以知道此处为一个循环,而且一定会进入一次,符号do while的特性,因此使用do while循环,但是此处需要打印一个选项的界面,因此可以使用创建一个菜单。

代码实现:

#include<stdio.h>
void menu()
{printf("***********************\n");printf("****** 1. play ******\n");printf("****** 0. exit ******\n");printf("***********************\n");
}
int main()
{int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:break;case 0:printf("游戏结束\n");break;default:printf("选择错误,重新选择\n");break;}} while (input);return 0;
}

2.2.2、生成随机数

根据游戏的要求,第一步需要电脑自动生成1~100的随机数

根据前面生成随机数的讲解,我们可以直接使用rand()生成随机数。前面已经测试过,只要将头文件和srand种子设计好,就能生成真正的随机数。

2.2.3、游戏设计

根据游戏的要求,自己输入一个值,根据比较判断猜大了,猜小了,还是猜对了的情况,没有猜对则还可以继续猜,因此此处可以设计成一个循环,直到猜对才结束循环,那么循环结束的条件是什么呢?如果直接找条件似乎不太好下手,所以我们可以先设计一个死循环,如果猜对了则跳出循环即可。

void game()
{int r = rand() % 100 + 1;//生成1-100的随机数int guess = 0;while (1){printf("请猜数字>:");scanf("%d", &guess);if (guess < r){printf("猜小了\n");}else if (guess > r){printf("猜大了\n");}else{printf("恭喜你,猜对了\n");break;}}
}

3、猜数字游戏实现


参考代码:
 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void game()
{int r = rand() % 100 + 1;//生成1-100的随机数int guess = 0;while (1){printf("请猜数字>:");scanf("%d", &guess);if (guess < r){printf("猜小了\n");}else if (guess > r){printf("猜大了\n");}else{printf("恭喜你,猜对了\n");break;}}
}
void menu()
{printf("***********************\n");printf("****** 1. play ******\n");printf("****** 0. exit ******\n");printf("***********************\n");
}
int main()
{int input = 0;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");break;}} while (input);return 0;
}

还可以加上猜数字的次数限制,如果5次猜不出来,就算失败.我们前面使用的是死循环,猜对了才结束,如果次猜不出来就失败,那么我们只需要循环5次结束即可,可以创建一个控制数量的变量初始化为5,猜完一次之后--即可,此处也可以使用宏常量。(循环开始之前可以先提示还有几次猜的机会,如果5次都没有猜对则可以打印正确值)

void game()
{
int r = rand() % 100 + 1;
int guess = 0;
int count = 5;//猜5次不对则失败
while (count)
{
printf("\n你还有%d次机会\n", count);
printf("请猜数字>:");
scanf("%d", &guess);
if (guess < r)
{
printf("猜小了\n");
}
else if (guess > r)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
count--;//猜一次则--
}
if (count == 0)
{
printf("你失败了,正确值是:%d\n", r);
}
}

总结

本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!

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

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

相关文章

如何用Java后端处理JS.XHR请求

Touching searching engine destroies dream to utilize php in tomcat vector.The brave isn’t knocked down&#xff0c;turn its path to java back-end. Java Servlet Bible schematic of interaction between JS front-end and Java back-end Question 如何利用Java…

阿里巴巴Java开发MySQL 数据库 (整理版)

目录 前言 1.MySQL 数据库 1.1 建表规约 1.2 索引规约 1.3 SQL 语句 1.4 ORM 映射 前言 MySQL 数据库使用建议标识依次分为【重要】、【建议】、【参考】,有助于 MySQL 建表、索引、SQL 语句使用。 1.MySQL 数据库 1.1 建表规约 1.【重要】表达是与否概念的字段,必…

想创业在视频号开店,需要哪些条件,一篇详解!

大家好&#xff0c;我是电商糖果 视频号小店是2020年下半年才出现的平台&#xff0c;因为实在过于火爆&#xff0c;今年它就成了电商行业的黑马&#xff0c;吸引了不少商家入驻。 就是因为是新平台&#xff0c;网上关于它开店条件的说明并不多&#xff0c;官网上写的又太杂乱…

[C++][算法基础]最大异或对(Trie树)

在给定的 N 个整数 &#xff0c;...... 中选出两个进行 xor&#xff08;异或&#xff09;运算&#xff0c;得到的结果最大是多少&#xff1f; 输入格式 第一行输入一个整数 N。 第二行输入 N 个整数 ~ 。 输出格式 输出一个整数表示答案。 数据范围 1≤N≤, 0≤< 输…

【数据结构与算法】力扣 19. 删除链表的倒数第 N 个结点

题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a; head [1,2,3,4,5], n 2 输出&#xff1a; [1,2,3,5]示例 2&#xff1a; 输入&#xff1a; head [1], n 1 输出&#xff1a; []示例…

渗透测试漏洞之XSS漏洞

目录 1.1 XSS漏洞原理 1.2 XSS漏洞分类 1.3 XSS漏洞危害 1.4 XSS漏洞的防范 1.5 XSS各类别的区别 1.1 XSS漏洞原理 Cross-site Scripting&#xff0c;简称XSS 原理&#xff1a;就是程序对输入输出没有做合理的过滤限制&#xff0c;导致攻击者构造的字符输出到前端时被浏…

Mamba入局遥感图像分割 | Samba: 首个基于SSM的遥感高分图像语义分割框架

文章目录 1、导读 2、背景 3、动机 4、方法 5、实验 6、总结 标题&#xff1a;《Samba: Semantic Segmentation of Remotely Sensed Images with State Space Model》论文&#xff1a;https://arxiv.org/abs/2404.01705源码&#xff1a;https://github.com/zhuqinfeng1999…

在展会上如何介绍产品和公司,柯桥俄语培训

1.Приглашаем Вас… 邀请您…… 2. Позвольте пригласить Вас… 请允许邀请您…… 3.Имеем честь пригласить Вас … 诚挚邀请您…… 4. Посылаем Вам приглашение на… 给您&#xff0…

Vue - 你知道Vue中key的工作原理吗

难度级别:中级及以上 提问概率:80% 在Vue项目开发中,并不推荐使用索引做为key,以为key必须是唯一的,可以使用服务端下发的唯一ID值,也不推荐使用随机值做为key,因为如果每次渲染都监听到不一样的key,那么节点将无法复用,这与Vue节省…

android gradle版本无法下载

android gradle版本无法下载问题解决方法 在引入一个新的android项目的时候&#xff0c;通常会因为无法下载gradle版本而一直卡在同步界面&#xff0c;类似于下面的情况。 这是因为gradle运行时首先会检查distributionUrlhttps://services.gradle.org/distributions/gradle-5.6…

JavaScript逆向爬虫——无限debugger的原理与绕过

debugger 是 JavaScript 中定义的一个专门用于断点调试的关键字&#xff0c;只要遇到它&#xff0c;JavaScript 的执行便会在此处中断&#xff0c;进入调试模式。 有了 debugger 这个关键字&#xff0c;就可以非常方便地对 JavaScript 代码进行调试&#xff0c;比如使用 JavaSc…

LeetCode-热题100:139. 单词拆分

题目描述 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 **注意&#xff1a;**不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s “leet…

从MySQL5.7平滑升级到MySQL8.0的最佳实践分享

一、前言 升级需求&#xff1a;将5.7.35升级到8.0.27, 升级方式 in-place升级【关闭现有版本MySQL&#xff0c;将二进制或包替换成新版本并在现有数据目录上启动MySQL并执行升级任务的方式&#xff0c;称为in-place升级】 原版本 5.7.35 CentOS Linux release 7.9.2009 新版本…

OpenHarmony实战开发-多设备自适应能力

介绍 本示例是《一次开发&#xff0c;多端部署》的配套示例代码&#xff0c;展示了页面开发的一多能力&#xff0c;包括自适应布局、响应式布局、典型布局场景以及资源文件使用。 说明&#xff1a; 自适应布局能力仅可以保证在外部容器大小在一定范围内变化时&#xff0c;容…

✌2024/4/3—力扣—整数转罗马数字

代码实现&#xff1a; 方法一&#xff1a;硬编码数字 const char *thousands[] {"", "M", "MM", "MMM"}; const char *hundreds[] {"", "C", "CC", "CCC", "CD", "D",…

STM32无刷电机全套开发资料(源码、原理图、PCB工程及说明文档)

目录 1、原理图、PCB、BOOM表 2、设计描述 2.1 前言 2.2 设计电路规范 3、代码 4、资料清单 资料下载地址&#xff1a;STM32无刷电机全套开发资料(源码、原理图、PCB工程及说明文档) 1、原理图、PCB、BOOM表 2、设计描述 2.1 前言 经过一个星期的画PCB&#xff0c;今…

C++模仿qq界面

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口的大小this->resize(645,497);//设置窗口名字this->setWindowTitle("QQ");//设置窗口图标this->setWindowIcon(QIcon("C:\\zhouzhouMyfile\\qt_proj…

ChatGPT助力学术成就:打造完美论文技巧

ChatGPT无限次数:点击直达 ChatGPT助力学术成就&#xff1a;打造完美论文技巧 在当今信息爆炸的时代&#xff0c;学术研究对于每个领域的进步和发展至关重要。而在学术研究中&#xff0c;撰写高质量的论文是展示研究成果和贡献的重要方式之一。然而&#xff0c;许多学者在论文…

如何使用Excel搭建一套低值易耗品管理系统

低值易耗品是企业日常运营中不可或缺的一部分&#xff0c;虽然其单个价值不高&#xff0c;但因其使用频繁且数量众多&#xff0c;对其的管理同样重要。利用Excel搭建一套低值易耗品管理系统&#xff0c;不仅成本低廉&#xff0c;而且易于操作和维护。本文将指导您如何使用Excel…

【编程】Boost::geometry Polygon 常用应用代码记录(C++)

简介 本文的代码部分都比较简单容易 Boost Geometry 是 Boost C 库集合的一部分&#xff0c;定义了用于解决几何问题的概念、工具和算法。这个库比较常用&#xff0c;很多现成的函数都很实用且简单&#xff0c;本文记录一些常用的函数和操作&#xff0c;重复的功能以后还会用到…