编写一个猜数字游戏程序。

2023-10-29

猜数字游戏的实现内容:
1. 电脑随机生成一个数字(1—100)
2. 玩家猜数字
  如果玩家猜小了,就提示猜小了。
  如果玩家猜大了,就告提示大了。
  如果玩家猜对了,就提示猜对了。
3. 游戏每局结束后,可以选择是否继续玩或者退出。
我们开始先做一个游戏主页菜单,菜单的选择有玩游戏或者退出游戏,代码如下:
void menu()  // 这里我们定义一个不要返回值的 menu 函数来实现菜单的功能
{
        printf("***********************\n");
        printf("********1.Play*********\n");  //  选择 1 玩游戏;
        printf("********0.Exit*********\n");  //  选择 0 退出游戏
        printf("***********************\n");
}

游戏菜单做好后,我们需要进行选择玩游戏或者退出游戏,并且实现游戏猜数字的部分,代码如下:

void game()  // 定义 game函数 实现游戏部分
{    
        int ret = rand(); // 调用 rand 函数来随机生成一个伪随机数
        printf("%d\n", ret);
         /*int guess = 0;  // 先注释掉这句跟 while循环部分,暂且先不猜只随机生成数字
        while (1)
        {
               printf("猜数字:\n");
               scanf("%d", &guess);
               if (guess < ret)
               {
                      printf("猜小了,请重新猜\n");
               }
               else if (guess > ret)
               {
                      printf("猜大了,请重新猜\n");
               }
               else
               {
                      printf("恭喜你,猜对了\n");
                      break;
               }
        }*/
}

int main()
{
        int input = 0; // 定义一个整型变量来接收我们从键盘输入的选择
        do
        {
               menu();     // 菜单的实现
               printf("请选择:");
               scanf("%d", &input); // 输入数字选择(1/0) 1—玩游戏;0—退出游戏
               switch (input)
               {
               case 1:
                      game(); // 选择 1 玩游戏定义 game函数
                      break;
               case 0:
                      printf("退出游戏\n");
                      break;
               default:
                      printf("选择错误,重新选择!\n"); // 输入非选项数字
                      break;
               }
        } while (input); // ()里面输入 0 为假退出游戏不在继续选择, 输入非 0 为真进入循环继续选择
        return 0;
}

写好代码之后,那开始玩。( 那为什么每局随机生成的数字一样呢?)

在我们仔细阅读 rand 函数之后会发现,rand 函数可以随机生成一个伪随机数。
rand 生成伪随机数的范围是 0 — RAND_MAX,但 rand 函数有一个缺陷,每局生成的伪随机数是一样的,那我们玩一局结束后把随机生成出来的数都记下来,那游戏还有什么意思?
所以这里需要调用了一个 srand 函数,srand 函数需要在调用 rand 函数之前被调用。

 那 srand 函数作用是什么呢?

那如图我们传给它一个整型参数:
(这里需要注意 srand函数的位置是在 game函数里面)
输出结果如下:

 

我们发现随机生成的数字都一样,那我们改一下 srand 函数里面的参数会是怎么样?
我们改变里面的整型参数,重新给一个整型参数,生成的随机数还是一样。感兴趣的可以试一下,我就不放结果了。
那是不是每次给 srand 一个一直变化的整数我们就可以生成一个随机数?
这里就要引用一个时间戳,时间是一直变化的,而把它给 srand 每次生成的数字就随机了。
那时间戳是什么?
时间戳就是自己现在的时间相较于计算机起始时间之间的差值(秒) (计算机起始时间是 1970.01.01)
所以我们可以把时间戳传给 srand函数,C语言也提供了这样的函数 —— time ,它会返回一个时间戳。
下面就是 time函数的介绍:
如果我们不想用参数,不把时间戳存起来,我们可以给它传空指针(NULL)
还有一种办法是 time 会返回时间戳,我们只要接收这个返回值就可以了。
根据 srand 函数的定义,我们可以把 time 传给 srand,代码如下:
(这里注意 srand函数的位置发生了变化,放在了主函数里面)
那为什么这次放在了主函数里?
因为当我们开始游戏之后,快速的获取随机数的时候会发现生成的随机数有一样的数(输出结果省略,有兴趣或者疑问可以尝试自己做一下看是否一样)
如果放在 game 里面我们每次程序运行起来获取随机数,相当于调用设置起点,重新起始开始算起。
所以调用 rand 之前要调用 srand ,但是不能被频繁调用,只需在程序运行起来调用一次就可以。
所以 srand 不能放在 game 里,应该放在主函数里面。
最后完整正确代码如下:
#include <stdio.h>
#include <stdlib.h> // srand 头文件
#include <time.h>   // time 头文件
 void menu()    // menu — 游戏菜单
 {
     printf("***********************\n");
     printf("********1.Play*********\n");
     printf("********0.Exit*********\n");
     printf("***********************\n");
 }
 void game()   // 猜数字的实现
 {
     int ret = rand() % 100 + 1; //给生成的随机数 %100+1,任何数 %100 结果为 0-99,再 +1 就是 1-100
     int guess = 0;
     while (1)  // 猜错可以一直猜,直到猜对 break 跳出死循环
     {
         printf("猜数字:\n");
         scanf("%d", &guess);
         if (guess < ret)  // 猜的数字与随机生成的数字相比较
         {
             printf("猜小了,请重新猜\n");
         }
         else if (guess > ret)
         {
             printf("猜大了,请重新猜\n");
         }
         else
         {
             printf("恭喜你,猜对了\n");
             break;
         }
     }
 }
 int main()
 {
     int input = 0;
     srand((unsigned int)time(NULL)); // srand 函数放在主函数只需调用一次
     do
     {
         menu();
         printf("请选择:");
         scanf("%d", &input); // 输入选择:玩游戏 or 退出游戏
         switch (input)
         {
         case 1:
             game();
             break;
         case 0:
             printf("退出游戏\n");
             break;
         default:
             printf("选择错误,重新选择!\n");
             break;
         }
     } while (input);
     return 0;
 }

以上就是猜数字游戏需要注意的地方,以及一些讲解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写一个猜数字游戏程序。 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • js为浏览器URL追加参数

    setTimeout gt let newurl updateQueryStringParameter window location href id 123456 向当前url添加参数 没有历史记录 window history repl
  • SpringBoot笔记:SpringBoot启动参数配置

    文章目录 目的 测试代码 配置文件配置 获取自定义参数 项目打包发布 修改启动配置 方式一 系统变量 方式二 命令行参数 springboot启动参数解释 目的 1 熟悉springboot多环境配置 2 熟悉springboot使用jar
  • Webpack源码分析-打包后的文件分析

    Webpack源码解析 使用webpack版本 html webpack plugin 4 5 0 webpack 4 44 2 webpack cli 3 3 12 打包后文件分析 webpack code dist bundle js
  • UTM安全功能部署场景——web过滤原理、url过滤

    目录 web过滤原理 网络过滤检查模式 代理模式 流模式 DNS模式 应用场景 一 组网需求 二 组网拓扑 三 配置要点 四 配置步骤 五 配置步骤 web过滤原理 网络过滤检查模式 代理模式 基于代理的检查包括流量缓冲和在决定一个行动之前
  • CSS里的style标签内为什么要加html注释符

    今天俺终于搞懂了 CSS里的style标签内为什么要加html注释符 说来惭愧啊 搞开发也有那么点时间了吧 经常看在style标签里含有这个html的注释符号 想去搞懂原因 还真没找着 上网没找到原因 可能是自己查找的方式不对吧 下面步入正
  • 【202211】国内镜像源地址

    Ubuntu Python Nodejs MySQL Git Chromium Docker Homebrew 等一系列的常用最推荐的镜像源 清华源镜像清华大学开源软件镜像站 Tsinghua Open Source Mirror 可能是最
  • anguar12里面FormControl学习

    在Angular 12中 要动态修改FormGroup 你可以使用patchValue 方法或setValue 方法 使用patchValue 方法 import Component OnInit from angular core imp
  • java内部类的作用分析

    提起Java内部类 Inner Class 可能很多人不太熟悉 实际上类似的概念在C 里也有 那就是嵌套类 Nested Class 关于这两者的区别与联系 在下文中会有对比 内部类从表面上看 就是在类中又定义了一个类 下文会看到 内部类可
  • solidity数据位置

    代码在执行前 一般会编译成指令 指令就是一个个逻辑 逻辑操作的是数据 代码 或者说业务 操作的其实是数据 非区块链中 代码操作的数据 一般会存到数据库中 在区块链里 区块链本身就是一个数据库 如果你使用区块链标记物产的所有权 归属信息将会被
  • flutter 路由配置多种跳转与传参

    main dart文件 1 引入路由跳转的页面 import package app ftr pages Page1 dart import package app ftr pages Page2 dart void main gt run
  • 常见HTTP状态码

    HTTP状态码 当浏览者访问一个网页时 浏览器会向网页所在服务器发出请求 当浏览器接收并显示网页前 此网页所在的服务器会返回一个包含HTTP状态码的信息头 server header 用以响应浏览器的请求 HTTP状态码分类 HTTP状态码
  • 【react】组件创建和交互步骤和实例

    例子来自尚硅谷react视频 相当于笔记整理 link https www bilibili com video av51174155 from search seid 11218837597275325699 要做的功能 在输入框内输入内
  • Ubuntu系统中多个版本的程序指定默认版本

    最近在编译clickhouse的过程中 遇到了操作系统默认安装了一个clang 10的版本 但编译clickhouse需要安装11版本以上的clang程序 所以就通过命令 bash c wget O https apt llvm org l
  • 3D游戏编程 homework 2

    简答题 游戏对象运动的本质是什么 在游戏中一个对象的运动都是相对于某一个坐标系的运动 实质上就是坐标的改变 通过坐标改变的速度以及方法实现各种运动 请用三种方法以上方法 实现物体的抛物线运动 方法一 使用向量计算出每个时刻球应该在的位置 再
  • 1034 有理数四则运算

    1034 有理数四则运算 20 分 本题要求编写程序 计算 2 个有理数的和 差 积 商 输入格式 输入在一行中按照 a1 b1 a2 b2 的格式给出两个分数形式的有理数 其中分子和分母全是整型范围内的整数 负号只可能出现在分子前 分母不
  • 图像直方图均衡化算法理解

    一 直方图均衡化的图像原理 直方图均衡就是让照片的灰度分布拉宽 然后图像对比度变大则变的清晰 方图均衡化方法的基本思想是对在图像中像素个数多的灰度级进行展宽 而对像素个数少的灰度级进行缩减 从而达到清晰图像的目的 直方图 png 二 直方图
  • 6个位运算使用

    6个位运算使用 1 乘以2 2 快速计算2的n次幂 3 校验奇数还是偶数 4 交换两个变量 5 找出只出现一次的数 6 对数字加密 1 乘以2 int num 10 lt lt 1 System out println num 2 快速计算
  • Java基础七(重写与重载)

    Java基础七 重写与重载 1 重写 Override 存在于继承体系中 指子类实现了一个与父类在方法声明上完全相同的一个方法 为了满足里式替换原则 重写有以下三个限制 子类方法的访问权限必须大于等于父类方法 子类方法的返回类型必须是父类方
  • 前端技能三要素

    HTML CSS js是构建网页的三种主要技术 也被称为前端技能三要素 1 HTML 超文本标记语言 是一种使用标签 标记 描述网页的语言 结构层 是一种标记语言 2 CSS 层叠样式表 主要用于美化web页面外观 表现层 样式层 样式表语
  • 编写一个猜数字游戏程序。

    猜数字游戏的实现内容 1 电脑随机生成一个数字 1 100 2 玩家猜数字 如果玩家猜小了 就提示猜小了 如果玩家猜大了 就告提示大了 如果玩家猜对了 就提示猜对了 3 游戏每局结束后 可以选择是否继续玩或者退出 我们开始先做一个游戏主页菜