C语言基础(五)【控制语句与循环综合应用篇猜数字游戏】

文章目录

  • 前言
  • 一、实现一个猜数字游戏
  • 二、游戏实现的步骤
    • 1. 随机数生成
      • 1.1 rand
      • 1.2 srand
      • 1.3 time
      • 1.4 设置随机数的范围
    • 2. 菜单函数的实现
    • 3. 游戏函数的实现
  • 二、猜数字游戏的实现
    • 1. 不限制次数
    • 2. 限制次数为 5
  • 总结


前言

学习过前面有关控制语句跟循环的相关知识,可以实现一个有趣的猜数字游戏。


一、实现一个猜数字游戏

要求:
1.电脑自动生成 1 ~ 100 的随机数。
2.玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了或小了的反馈,直
到猜对,游戏结束。
3.可增加难度: 玩家只有 5 次机会,如果 5 次都没有猜中,猜数字失败,游戏结束。


二、游戏实现的步骤

1. 随机数生成

1.1 rand

  1. C语言提供了一个函数叫 rand,这函数是可以生成随机数的,需要包含头文件

语法形式如下:

	int rand(void);                                          

示例:

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

输出结果:
1.
在这里插入图片描述


在这里插入图片描述


注意:
1.rand 函数返回的是伪随机数(不是真正的随机数),这个随机数的范围是在 0 ~ RAND_MAX 之间,这个RAND_MAX的大小通常是依赖编译器上实现的,但是大部分编译器上是32767。所以说程序两次运行的结果是一样的。


2.rand 函数是对一个叫“种子”的基准值进行运算生成的随机数。因为 rand 函数生成随机数的默认种子是1,所以前面每次运行程序产生的随机数序列是一样的。如果要生成不同的随机数,需要让种子是变化的


这段文字有蓝是的是的

1.2 srand

1.C语言中又提供了一个函数叫 srand,用来初始化随机数的生成器的。

语法形式如下 :

	void srand(unsigned int seed);

注意:
在程序中使用 rand 函数生成随机数之前,通常会先调用 srand 函数,并通过传递一个参数(种子)给 srand 来初始化随机数生成器。种子决定了 rand 函数生成随机数序列的起点。如果每次种子都不同,则每次生成的随机数序列也会不同。


1.3 time

1.在程序中一般是使用程序运行的时间作为种子,因为时间时刻在发生变化的。

C语言中有个函数叫 time ,就可以获得这个时间,要包含头文件:time.h

语法形式:

	time_t time(time_t* timer);
1.time 函数的作用是获取当前时间,并将其转换为从特定起点(1970年1月1日0时 0分0秒)到当前时刻的秒数差,这个秒数差称为时间戳。

2.time 函数的返回值是 time_t 类型,这是一个能够存储时间戳的类型。

3.如果 timer 是一个非空指针(即指向一个有效的内存地址)time 函数会将当前时间的时间戳返回给调用者。这个时间戳存储在 timer 指针指向的内存位置。

4.如果 timer 是 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());  return 0  
}

输出结果:
1.
在这里插入图片描述
2.在这里插入图片描述

注意:
上面程序两次运行的结果不一样,则这段代码能获得真正的随机数
srand 函数是不需要频繁调用的,一次运行的程序中调用一次就够了


1.4 设置随机数的范围

1.如果要生成 0 ~ 99 之间的随机数

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

2.如果要生成 1 ~ 100 之间的随机数

	rand() % 100 + 1; // 余数范围为 1 ~ 100  

3.如果要生成 100 ~ 200 的随机数

    // 余数范围 0 ~ 100,加上 100 后是 100 ~ 200  100 + rand() % (200 - 100 + 1);    

4.如果要生成 a ~ b 的随机数

	a + rand() % (b - a + 1);  

2. 菜单函数的实现

// 定义了一个名为 menu 的函数用来打印选项,void 表示没有返回值
void menu()
{printf("*******************************\n");printf("************ 1. play **********\n");printf("************ 0. exit **********\n");printf("*******************************\n");}

3. 游戏函数的实现

// 定义一个名为 game 的函数(没有返回值),用于实现一个猜数字游戏               
void game()
{// r 为一个随机生成 1 ~ 100 的数字int r = rand() % 100 + 1;// 用于表示猜测的数字int guess = 0;while (1){printf("请猜数字:>");scanf("%d", &guess);if (guess > r){// 表示猜测的数字大了printf("猜大了\n");}else if (guess < r){// 表示猜测的数字小了printf("猜小了\n");}else{// 猜对数字,则跳出循环printf("猜对了\n");break;}}
}

二、猜数字游戏的实现

1. 不限制次数

1.完整代码

#include<stdio.h>
#include<stdlib.h>   // 包含标准库头文件,可使用 rand() 和 srand() 等函数
#include<time.h>     // 包含时间库头文件,可使用时间相关的函数,如 time()// 定义一个名为 game 的函数(没有返回值),用于实现一个猜数字游戏               
void game()
{// r 为一个随机生成 1 ~ 100 的数字int r = rand() % 100 + 1;// 用于表示猜测的数字int guess = 0;while (1){printf("请猜数字:>");scanf("%d", &guess);if (guess > r){// 表示猜测的数字大了printf("猜大了\n");}else if (guess < r){// 表示猜测的数字小了printf("猜小了\n");}else{// 猜对数字,则跳出循环printf("猜对了\n");break;}}
}// 定义了一个名为 menu 的函数用来打印选项,void 表示没有返回值
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 - while 循环,用于重复显示菜单并处理输入的值,直到选择退出(0)do {menu();printf("请选择:>");scanf("%d", &input);// 使用 switch 语句根据输入的值执行不同的操作switch (input){// 如果输入 1,则调用 game 函数开始游戏case 1:game();break;// 如果输入 0,打印 "游戏结束",然后跳出循环case 0:printf("游戏结束\n");break;// 如果输入的值既不是 1 也不是 0,打印错误信息,并重新选择default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}

示例:

在这里插入图片描述


2. 限制次数为 5

#include<stdio.h>
#include<stdlib.h>   // 包含标准库头文件,可使用 rand() 和 srand() 等函数
#include<time.h>     // 包含时间库头文件,可使用时间相关的函数,如 time()// 定义一个名为 game 的函数(没有返回值),用于实现一个猜数字游戏               
void game()
{// r 为一个随机生成 1 ~ 100 的数字int r = rand() % 100 + 1;// 用于表示猜测的数字int guess = 0;// 用于表示剩余的猜测次数,有 5 次机会int count = 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;}// 每次循环结束时,猜测次数减 1count--;}// 如果循环结束时 count 为 0,说明已经用完了所有猜测次数,打印失败信息和正确的数字if (count == 0){printf("你失败了,正确的值是:%d\n", r);}
}// 定义了一个名为 menu 的函数用来打印选项,void 表示没有返回值
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 - while 循环,用于重复显示菜单并处理输入的值,直到选择退出(0)do {menu();printf("请选择:>");scanf("%d", &input);// 使用 switch 语句根据输入的值执行不同的操作switch (input){// 如果输入 1,则调用 game 函数开始游戏case 1:game();break;// 如果输入 0,打印 "游戏结束",然后跳出循环case 0:printf("游戏结束\n");break;// 如果输入的值既不是 1 也不是 0,打印错误信息,并重新选择default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}

示例:

在这里插入图片描述


总结

本篇文章详细介绍了如何使用C语言实现一个简单的猜数字游戏,包括如何使用rand()、srand() 和 time() 函数来生成随机数,使用 do - while 循环跟 switch 语句来进行选择等。

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

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

相关文章

javac 编译java文件源码 怎么生成 ast语法树 步骤详解

在 javac 中&#xff0c;编译源代码并生成抽象语法树&#xff08;AST&#xff09;是一个多步骤的过程&#xff0c;涉及从源码解析到最终生成字节码。以下是详细步骤&#xff0c;描述了如何使用 javac 编译源码并生成 AST。 1. 准备源文件 javac 首先需要源文件。这些源文件是…

手游和应用出海资讯:怪物猎人AR手游累计总收入已超过2.5亿美元、SuperPlay获得迪士尼纸牌游戏发行许可

NetMarvel帮助游戏和应用广告主洞察全球市场、获取行业信息&#xff0c;以下为12月第一周资讯&#xff1a; ● 怪物猎人AR手游累计总收入已超过 2.5 亿美元 ● SuperPlay获得迪士尼纸牌游戏发行许可 ● 腾讯混元大模型上线文生视频能力 ● 网易天下事业部一拆三&#xff0c;蛋仔…

酷克数据携手江西移动入选“星河(Galaxy)”数据库潜力案例

2024 年 12 月 18 - 19 日&#xff0c;为推动打造行业交流平台&#xff0c;驱动产业创新共荣&#xff0c;大数据技术标准推进委员会以“数据重塑价值 智能链接未来”为主题&#xff0c;在北京召开为期两天的“2024 数据资产管理大会”。 在会上&#xff0c;第八届大数据“星河&…

Mysql语法之DQL查询的多行函数

Mysql的多行函数和分组 目录 Mysql的多行函数和分组多行函数概念常用的多行函数 数据分组概念语法where和having的区别 语句关键字及执行顺序语句关键字执行顺序 实际操作基本语句格式和多行操作筛选语句格式 多行函数 概念 不管函数处理多少条&#xff0c;只返回一条记录&…

Ubuntu22.04上安装esp-idf

一、安装准备# 建议使用Ubuntu 20.04 或 Ubuntu 22.04 操作系统 为了在 Ubuntu 22.04 中使用 esp-idf&#xff0c;需要安装一些依赖包 sudo apt-get install git wget flex bison gperf python3\python3-pip python3-venv cmake ninja-build ccache\libffi-dev libssl-dev dfu…

WPF 依赖属性和附加属性

除了普通的 CLR 属性&#xff0c; WPF 还有一套自己的属性系统。这个系统中的属性称为依赖属性。 1. 依赖属性 为啥叫依赖属性&#xff1f;不叫阿猫阿狗属性&#xff1f; 通常我们定义一个普通 CLR 属性&#xff0c;其实就是获取和设置一个私有字段的值。假设声明了 100 个 …

在linux系统的docker中安装GitLab

一、安装GitLab&#xff1a; 在安装了docker之后就是下载安装GitLab了&#xff0c;在linux系统中输入命令&#xff1a;docker search gitlab就可以看到很多项目&#xff0c;一般安装第一个&#xff0c;它是英文版的&#xff0c;如果英文不好可以安装twang2218/gitlab-ce-zh。 …

2024最新CF罗技鼠标宏

使用效果&#xff1a; 支持的功能 M4 7发一个点HK417 连点瞬狙炼狱加特林一个圈 下载链接 点击下载

JS CSS HTML 的代码如何快速封装

我们为什么要封装代码&#xff0c;是因为封装后的代码&#xff0c;会显得非常美观&#xff0c;减少代码的复用&#xff0c;方便我们更好的去维护代码&#xff0c;不用一个一个页面的去找去改&#xff0c;直接封装好的代码里面去改就可以了 目录 1.html代码封装 2.CSS代码封装…

使用docker拉取镜像很慢或者总是超时的问题

在拉取镜像的时候比如说mysql镜像&#xff0c;在拉取 时总是失败&#xff1a; 像这种就是网络的原因&#xff0c;因为你是连接到了外网去进行下载的&#xff0c;这个时候可以添加你的访问镜像源。也就是daemon.json文件&#xff0c;如果你没有这个文件可以输入 vim /etc/dock…

MySQL复制问题和解决

目录 环境介绍 一&#xff0c;主库执行delete&#xff0c;从库没有该数据 模拟故障 修复故障 二&#xff0c;主库执行insert&#xff0c;从库已存在该数据 模拟故障 故障恢复 三&#xff0c;主库执行update&#xff0c;从库没有该数据 模拟故障 故障恢复 四&#xf…

[RocketMQ] 发送重试机制与消费重试机制~

发送重试 RocketMQ 客户端发送消息时&#xff0c;由于网络故障等因素导致消息发送失败&#xff0c;这时客户端SDK会触发重试机制&#xff0c;尝试重新发送以达到调用成功的效果。 触发条件 客户端消息发送请求失败或超时。服务端节点处于重启或下线状态。服务端运行慢造成请…

mfc140u.dll是什么文件?如何解决mfc140u.dll丢失的相关问题

遇到“mfc140u.dll文件丢失”的错误通常影响应用程序的运行&#xff0c;这个问题主要出现在使用Microsoft Visual C环境开发的软件中。mfc140u.dll是一个重要的系统文件&#xff0c;如果它丢失或损坏&#xff0c;会导致相关程序无法启动。本文将简要介绍几种快速有效的方法来恢…

02-9.python入门基础一Python模块与包(一)

一、Python 模块的概念 &#xff08;一&#xff09;模块的基本定义 在 Python 中&#xff0c;模块&#xff08;Module&#xff09;是一种组织代码的基本单元&#xff0c;简单来说&#xff0c;一个以 .py 结尾的 Python 文件就是一个模块。例如&#xff0c;我们创建一个名为 ex…

当我用影刀AI Power做了一个旅游攻略小助手

在线体验地址&#xff1a;旅游攻略小助手https://power.yingdao.com/assistant/ca1dfe1c-9451-450e-a5f1-d270e938a3ad/share 运行效果图展示&#xff1a; 话不多说一起看下效果图&#xff1a; 智能体的截图&#xff1a; 工作流截图&#xff1a; 搭建逻辑&#xff1a; 其实这…

AI Agent与MEME:技术与文化融合驱动Web3创新

AI Agent如何引领Web3新时代&#xff1f; 随着Web3与区块链技术的迅速发展&#xff0c;AI Agent作为人工智能与区块链的交汇点&#xff0c;正在逐步成为推动去中心化生态的重要力量。同时&#xff0c;MEME文化凭借其强大的社区驱动力和文化渗透力&#xff0c;在链上生态中扮演着…

【STM32 Modbus编程】-作为主设备写入多个线圈和寄存器

作为主设备写入多个线圈和寄存器 文章目录 作为主设备写入多个线圈和寄存器1、硬件准备与连接1.1 RS485模块介绍1.2 硬件配置与接线1.3 软件准备2、写入多个线圈2.1 数据格式2.2 发送数据2.3 结果3、写入多个寄存器3.1 数据格式3.2 发送数据3.3 结果本文将实现STM32作为ModBus主…

Spring学习之——Sping-XML

一、Spring的概述 (一)什么是Spring? Spring是针对bean对象的生命周期进行管理的轻量级容器。提供了功能强大IOC、AOP及Web MVC等功能。Spring框架主要由七部分组成&#xff1a;分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 S…

电商商品详情API接口(item get)数据分析上货

电商商品详情API接口&#xff08;item get&#xff09;在数据分析与商品上货方面发挥着重要作用。以下是对这两个方面的详细探讨&#xff1a; 一、数据分析 数据源获取&#xff1a; 商品详情API接口提供了丰富的数据源&#xff0c;包括商品的标题、价格、库存、描述、图片、用…

EasyGBS国标GB28181平台P2P远程访问故障排查指南:客户端角度的排查思路

在现代视频监控系统中&#xff0c;P2P&#xff08;点对点&#xff09;技术因其便捷性和高效性而被广泛应用。然而&#xff0c;当用户在使用P2P远程访问时遇到设备不在线或无法访问的问题时&#xff0c;有效的排查方法显得尤为重要。本文将从客户端的角度出发&#xff0c;详细探…