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语言程序实现了经典的猜数字游戏,通过合理地组织函数,使得代码逻辑清晰,同时保证了随机数生成的一致性和有效性。

相关文章
|
2月前
|
算法 PyTorch 算法框架/工具
昇腾 msmodelslim w8a8量化代码解析
msmodelslim w8a8量化算法原理和代码解析
134 5
|
4月前
|
搜索推荐 UED Python
实现一个带有昼夜背景切换的动态时钟:从代码到功能解析
本文介绍了一个使用Python和Tkinter库实现的动态时钟程序,具有昼夜背景切换、指针颜色随机变化及整点和半点报时功能。通过设置不同的背景颜色和随机变换指针颜色,增强视觉吸引力;利用多线程技术确保音频播放不影响主程序运行。该程序结合了Tkinter、Pygame、Pytz等库,提供了一个美观且实用的时间显示工具。欢迎点赞、关注、转发、收藏!
186 94
|
3月前
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
47 1
一文彻底搞清楚C语言的函数
|
2月前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
109 5
|
3月前
|
人工智能 文字识别 自然语言处理
保单AI识别技术及代码示例解析
车险保单包含基础信息、车辆信息、人员信息、保险条款及特别约定等关键内容。AI识别技术通过OCR、文档结构化解析和数据校验,实现对保单信息的精准提取。然而,版式多样性、信息复杂性、图像质量和法律术语解析是主要挑战。Python代码示例展示了如何使用PaddleOCR进行保单信息抽取,并提出了定制化训练、版式分析等优化方向。典型应用场景包括智能录入、快速核保、理赔自动化等。未来将向多模态融合、自适应学习和跨区域兼容性发展。
|
4月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
220 16
|
4月前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
1117 11
|
4月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
117 3
|
4月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
98 2
|
2月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
241 29

推荐镜像

更多