C语言实现猜数字游戏:代码详解与函数解析

简介: C语言实现猜数字游戏:代码详解与函数解析

引言

在本篇博客中,我们将通过一个简单的C语言程序实例来介绍如何实现猜数字游戏。这个程序利用了随机数生成器和用户输入来创造一个互动体验,其中包含三个关键函数:initRandomSeedgenerateRandomNumbermain 函数。下面是对每个函数的详细解释以及整个程序的Markdown格式描述。

程序头文件导入

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

这三个头文件分别用于标准输入输出操作(stdio.h)、获取当前时间(time.h)以及随机数生成(stdlib.h)。


随机数种子初始化优化

static _Bool isSrandIntialized = 0;

void initRandomSeed() {
    if (!isSrandIntialized) {
        srand((unsigned int) time(0));
        isSrandIntialized = 1;
    }
}

为了确保在整个程序生命周期内只初始化一次随机数种子,定义了一个静态布尔变量 isSrandIntializedinitRandomSeed 函数负责检查该变量状态,若尚未初始化,则调用 srand(time(0)) 来根据当前时间生成一个种子值,并将 isSrandIntialized 设置为 true,以防止重复初始化。

随机数生成函数

int generateRandomNumber(int min, int max) {
    initRandomSeed();
    return rand() % (max - min + 1) + min;
}

generateRandomNumber 函数接受两个整数参数,表示生成随机数的范围。它首先调用 initRandomSeed() 确保随机数种子已正确设置,然后使用 rand() 函数生成一个随机数,并通过取模运算保证生成的随机数位于指定区间 [min, max] 内。


主函数 main()

int main() {
    const int RANGE_MIN = 1;
    const int RANGE_MAX = 500;
    int computerNumber = generateRandomNumber(RANGE_MIN, RANGE_MAX);
    int userGuess;

    while (1) {
        printf("请输入一个%d-%d的数字:\n", RANGE_MIN, RANGE_MAX);
        scanf("%d", &userGuess);

        if (userGuess > computerNumber) {
            printf("猜大了\n");
        } else if (userGuess < computerNumber) {
            printf("猜小了\n");
        } else {
            printf("恭喜你,猜对了!\n");
            break;
        }
    }

    return 0;
}

在主函数 main() 中:

  • 定义常量 RANGE_MINRANGE_MAX 表示猜测数字的范围。
  • 使用 generateRandomNumber() 函数生成计算机选择的随机数 computerNumber
  • 启动无限循环,提示用户输入猜测的数字。
  • 判断用户输入的 userGuess 是否等于 computerNumber,并给出相应的提示信息。
  • 当用户猜中数字时,输出祝贺信息并使用 break 跳出循环。

完整代码

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

// 优化 srand 初始化,确保在整个程序生命周期内仅初始化一次随机数种子
static _Bool isSrandIntialized = 0;

void initRandomSeed() {
    if (!isSrandIntialized) {
        srand((unsigned int) time(0));
        isSrandIntialized = 1;
    }
}

int generateRandomNumber(int min, int max) {
    initRandomSeed();
    return rand() % (max - min + 1) + min;
}

int main() {
    const int RANGE_MIN = 1;
    const int RANGE_MAX = 500;
    int computerNumber = generateRandomNumber(RANGE_MIN, RANGE_MAX);
    int userGuess;

    while (1) {
        printf("请输入一个%d-%d的数字:\n", RANGE_MIN, RANGE_MAX);
        scanf("%d", &userGuess);

        if (userGuess > computerNumber) {
            printf("猜大了\n");
        } else if (userGuess < computerNumber) {
            printf("猜小了\n");
        } else {
            printf("恭喜你,猜对了!\n");
            break;
        }
    }

    return 0;
}


总结:以上C语言程序实现了经典的猜数字游戏,通过合理地组织函数,使得代码逻辑清晰,同时保证了随机数生成的一致性和有效性。

相关文章
|
8月前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
1475 0
|
10月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
456 15
|
机器学习/深度学习 算法 数据挖掘
解析静态代理IP改善游戏体验的原理
静态代理IP通过提高网络稳定性和降低延迟,优化游戏体验。具体表现在加快游戏网络速度、实时玩家数据分析、优化游戏设计、简化更新流程、维护网络稳定性、提高连接可靠性、支持地区特性及提升访问速度等方面,确保更流畅、高效的游戏体验。
358 22
解析静态代理IP改善游戏体验的原理
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
627 1
一文彻底搞清楚C语言的函数
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
696 3
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
864 2
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
894 140
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1402 29
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
562 4
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~