C语言 猜数字游戏

news2024/9/24 5:31:01

目录

1. 随机数⽣成

1.1 rand

1.2 srand

1.3 time

1.4 设置随机数的范围

 2. 猜数字游戏实现


 

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

1. 随机数⽣成

要想完成猜数字游戏,⾸先得产⽣随机数,可以利用以下函数产生随机数

1.1 rand

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

 int rand (void);

rand函数会返回一个伪随机数,范围在0到RAND_MAX之间。RAND_MAX的大小取决于具体的编译器实现,但在大多数编译器上,它通常是32767。使用rand函数需要包含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` 函数每次产生的随机数序列都会相同。默认情况下,`rand` 函数的种子值是1,因此每次运行程序时,生成的随机数序列都是相同的。

为了生成每次运行时不同的随机数序列,需要改变种子值。通常可以使用当前时间作为种子值来实现这一点。这样,`rand` 函数在每次运行程序时都会使用不同的种子值,从而生成不同的随机数序列。

1.2 srand

C语⾔中⼜提供了⼀个函数叫 srand ,⽤来初始化随机数的⽣成器的,srand的原型如下
void srand (unsigned int seed);

在程序中,使用 `rand` 函数生成随机数之前,我们可以通过 `srand` 函数来设置种子值(`seed)。` `srand` 函数的参数 `seed` 用于初始化 `rand` 函数的伪随机数生成器。只要种子值每次都不同,`rand` 函数生成的随机数序列也会随之不同。

换句话说,只要 `srand` 设置的种子值是变化的,`rand` 函数生成的随机数序列就会是不同的。因此,我们需要用一个变化的种子值来使 `rand` 生成的随机数具有更多的随机性。通常,程序会使用当前时间作为种子值来保证每次运行时种子值的不同,从而生成不同的随机数序列。

这就解决了看似矛盾的问题:虽然我们希望生成随机数,但需要一个变化的种子值来确保生成的随机数序列是不同的。通过动态变化的种子值,我们可以使 `rand` 函数产生更多样化的随机数

1.3 time

在程序中我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的。
在C语⾔中有⼀个函数叫 time ,就可以获得这个时间,time函数原型如下:
 time_t time (time_t* timer);

`time` 函数用于获取当前的日历时间。实际上,它返回的是从1970年1月1日0时0分0秒(即UNIX纪元时间)到当前时间的秒数,这个值称为时间戳。`time` 函数的返回值类型是 `time_t`,本质上是一个32位或64位的整数。

如果 `time` 函数的参数 `timer` 是一个非 `NULL` 的指针,函数会将这个时间戳存储到 `timer` 指向的内存中。如果 `timer` 是 `NULL`,函数则只返回时间戳值

要使用 `time` 函数,需要包含头文件 `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
如果只是让time函数返回时间戳,我们就可以这样写:
time(NULL);//调⽤time函数返回时间戳,这⾥没有接收返回值
我们可以让⽣成随机数的代码改写成如下
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    // 使用 time 函数的返回值来设置随机数生成器的种子
    // time 函数返回的是从1970年1月1日0时0分0秒到现在的秒数
    // 我们将 time 函数的返回值强制转换为 unsigned int 类型,作为 srand 的种子
    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((unsigned int)time(NULL));:这行代码通过调用 time(NULL) 获取当前的时间戳(从1970年1月1日到现在的秒数),并将其作为种子值传递给 srand。这样可以确保每次程序运行时,rand 函数生成的随机数序列都是不同的。
  • rand():生成一个随机数并打印出来。
  •            

多运⾏⼏次看看,每次的运⾏就有差异了。

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

 一般化的公式,用于生成 ab 之间的随机数:

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

 解释:

  • rand() % (最大值 - 最小值 + 1) 生成的余数范围是0到 (最大值 - 最小值)
  • 加上 最小值 后,可以将生成的数值范围调整到 最小值最大值

 2. 猜数字游戏实现

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 猜数字游戏函数
void game()
{
    int r = rand() % 100 + 1; // 生成1到100之间的随机数
    int guess = 0;            // 存储用户猜测的数字
    int count = 5;            // 剩余的猜测次数

    while (count > 0)
    {
        printf("\n你还有%d次机会\n", count);
        printf("请猜数字>:");
        scanf("%d", &guess);

        if (guess < r)
        {
            printf("猜小了\n");
        }
        else if (guess > r)
        {
            printf("猜大了\n");
        }
        else
        {
            printf("恭喜你,猜对了\n");
            return; // 猜对了就结束函数
        }

        count--; // 减少剩余次数
    }

    // 当猜测次数用尽后输出正确的值
    printf("你失败了,正确值是: %d\n", r);
}

// 菜单函数
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 != 0); // 当选择为0时退出循环

    return 0;
}

 

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

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

相关文章

运行微信小程序报错:Bad attr data-event-opts with message

问题 使用uniapp 编译&#xff0c;运行微信小程序环境时&#xff0c;报错 Bad attr data-event-opts with message。&#xff08;这个错误报错原因很多&#xff0c;这里只解决一个&#xff09; 原因 原因是&#xff1a;代码中有&#xff1a; :key"swiperList i"…

猫头虎分享:Python库 Pip 的简介、安装、用法详解入门教程

猫头虎分享&#xff1a;Python库 Pip 的简介、安装、用法详解入门教程 &#x1f3af; 大家好&#xff01;今天猫头虎带您一起探索Python世界中的一个基础工具——Pip。作为一名Python开发者&#xff0c;掌握Pip的使用不仅能帮助你更有效地管理项目中的依赖&#xff0c;还能让你…

【Java】Spring Boot使用 Email 传邮件 (上手图解)

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容&#xff1a;三、问题描述四、解决方案&#xff1a;4.1 认识依赖4.2 发送邮件步骤4.2.1 先获取授权码4.2.1 邮件配置4.2.2 主体内容…

使用 jar-analyzer 和dbeaver 分析java

https://github.com/jar-analyzer/jar-analyzer 可以进行jar分析&#xff0c;包括method调用 分析完可以通过界面进行一些分析&#xff0c;如果复杂还可以用DbWeaver 打开数据库进行分析

Java SpringBoot+Vue实战教程:如何搭建高中素质评价档案系统?

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【通俗易懂】限流、降级、熔断有什么区别?

目录 一、限流 1.1 简介 1.2 限流算法 二、降级 2.1 简介 2.2 降级的方式 延迟服务 在粒度范围内关闭服务&#xff08;片段降级或服务功能降级&#xff09; 页面异步请求降级 写降级 读降级 2.3 降级的介入方式 自动开关降级 服务超时 失败次数 发生故障 限流…

Markdown 美化 Github 个人主页

注&#xff1a;本文参考这篇博客 http://t.csdnimg.cn/KXhSw 目录 1 效果展示2 创建仓库3 编写 Markdown3.1 动态波浪图3.2 打字机动图3.3 技术栈图标3.4 项目贡献统计3.5 连续贡献统计3.6 贡献统计图3.7 代码时长统计3.8 仓库代码占比 1 效果展示 先来看看效果&#xff1a; 动…

java整合DL645-2007与Dl645-1997

注意事项: 前导字节-一般在传输帧信息前,都要有0~4个FE不等,所以这里要注意,对于主站来说,直接发送4个FE作为前导字节即可。而从站回复,就不一定了,根据厂家不同而不同,有些没有FE的,也有4个FE的,所以对于接受程序,一定要慎重传输次序-所有的数据项都是先传低字节,…

【生日视频制作】云层直升机飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】

云层直升飞机生日视频制作教程AE模板修改文字特效软件生成器玩法素 怎么如何做的【生日视频制作】云层直升机飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频

web后端(javaEE)开发——servlet

目录 一、web后端开发概述 二、web后端开发环境搭建 1.安装服务器软件 2.安装JDK 三、创建web后端项目 1.创建项目 2.修改设置 3.*在IDEA中集成Tomcat* 四、Servlet创建和应用 1.概述 2.Servlet程序创建与配置 3.分析Servlet程序结构 一、web后端开发概述 web开发&a…

Netty代码阅读

阅读Netty官方文档的时候&#xff0c;提到了Netty主要有三大核心&#xff0c;分别是buffer、channel、Event Model&#xff0c;接下来我们就从阅读Netty代码来理解这三大核心。 示例程序 先给出示例程序&#xff0c;方便自己也方便读者进行debug调试。 Server端代码 # Serv…

mysql启动报错“本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止”

我删除&#xff08;手动删除&#xff09;完 binlog 文件后&#xff0c;重新启动mysql服务报错如下&#xff1a; 查看错误日志可以看到 某个 binlog 文件找不到 打开 binlog.index 可以看到里面引用的正是这个文件 解决方法&#xff1a; 要么手动修改 binlog.index 文件&#…

【C++ Primer Plus习题】4.6

问题: 解答: #include <iostream> using namespace std;typedef struct _CandyBar {string brand;float weight;int calorie; }CandyBar;int main() {CandyBar snack[3] { {"德芙",2.1,20},{"箭牌",2.2,16},{"阿尔卑斯",2.3,18}};for (i…

【GNSS接收机】开源导航接收机

Pocket SDR Pocket SDR是一款基于软件无线电&#xff08;SDR&#xff09;技术的开源GNSS&#xff08;全球导航卫星系统&#xff09;接收机。它由名为“Pocket SDR FE”的RF前端设备、设备的一些实用程序以及用Python、C和C编写的GNSS-SDR AP&#xff08;应用程序&#xff09;组…

linux死锁问题和cpu使用率过高问题排查

1、问题共同点 死锁问题和cpu使用率过高都是需要我们找出对应的问题线程。 死锁问题需要我们找出哪两个线程出现了死锁情况。 cpu使用率过高需要我们找出哪个或哪些线程占用了大量的cpu。 2、命令排查 2.1、查看机器上的Java进程 jcmd或 jps2.2、查看对应Java进程的线程级别…

全文发布|SmartX 金融行业跑批类业务场景探索与实践合集

经过多年在⾦融⾏业的积累和发展&#xff0c;SmartX 已经赢得了 300 多家⾦融⽤户的信任。覆盖了银⾏、保险、证券、基⾦、期货和信托等主要⾦融细分领域。在这个过程中&#xff0c;我们从最初的单⼀超融合⼚商&#xff08;⼩规模起步/快速交付/按需灵活扩容/降低总拥有成本&am…

【Hot100】LeetCode—236. 二叉树的最近公共祖先

目录 1- 思路递归 自底向上 2- 实现⭐236. 二叉树的最近公共祖先——题解思路 3- ACM 实现 题目连接&#xff1a;236. 二叉树的最近公共祖先 1- 思路 递归 自底向上 ① 自底向上的逻辑的话 需要采用后续遍历的方式&#xff0c;最后处理中间结点 ② 递归 2.1 参数和返回值…

Verilog刷题笔记60

题目&#xff1a; Exams/2013 q2bfsm Consider a finite state machine that is used to control some type of motor. The FSM has inputs x and y, which come from the motor, and produces outputs f and g, which control the motor. There is also a clock input called …

openGL文本渲染FreeType常见问题

这里写自定义目录标题 源码下载及编译编译生成的dll及lib使用FreeTypeinclude头文件加载附加包含目录 lib文件加载添加lib文件位置添加lib文件下的lib名 字体使用代码编写代码初始化中文字体输出简单封装 存在问题列表问题1&#xff1a;无法打开stddef.h其他问题后续更新 源码下…

[JAVA]初识线程池及其基本应用

并发是伴随着多核处理器的诞生而产生的&#xff0c;为了充分利用硬件资源&#xff0c;诞生了多线程技术。但是多线程又存在资源竞争的问题&#xff0c;引发了同步和互斥的问题&#xff0c;JDK1.5推出的java.util.concurrent(并发工具包来解决这些问题) 在Java并发包中一个最核心…