当前位置: 首页 > news >正文

C语言篇:猜数字游戏的实现教程

C语言篇:猜数字游戏的实现教程

  • C语言篇:猜数字游戏的实现教程
    • 一、随机数生成的核心函数
          • 1. rand函数:生成伪随机数
          • 2. srand函数:设置随机数种子
          • 3. time函数:获取动态种子
    • 二、设置随机数的范围
    • 三、猜数字游戏的完整实现
          • 完整代码
          • 代码解析

C语言篇:猜数字游戏的实现教程

在C语言的学习中,分支结构与循环语句是构建程序逻辑的基础。本文将通过一个经典的"猜数字游戏"案例,详细讲解随机数生成的原理与实现方法,帮助你掌握randsrandtime等函数的用法,以及如何通过分支和循环搭建完整的游戏逻辑。

一、随机数生成的核心函数

要实现猜数字游戏,首先需要让电脑生成一个随机数。C语言中提供了专门的函数来完成这项工作,其中最核心的就是randsrandtime函数。

1. rand函数:生成伪随机数

rand函数是C语言标准库中用于生成随机数的函数,其声明格式如下:

int rand(void);
  • 该函数不需要参数,返回一个范围在0~RAND_MAX之间的整数(RAND_MAX是标准库定义的常量,多数编译器中其值为32767)。
  • 使用前需包含头文件stdlib.h

示例代码

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

在这里插入图片描述
运行后会输出一组随机数,但多次运行程序会发现,每次生成的随机数序列完全相同(这里只运行了一次 可以多试几次)。这是因为rand函数生成的是"伪随机数"——它基于一个固定的"种子"值通过算法计算得出,默认种子为1,因此每次运行结果一致。

2. srand函数:设置随机数种子

为了解决随机数序列固定的问题,需要使用srand函数来设置种子值。其声明格式为:

void srand(unsigned int seed);
  • 参数seed为种子值,当种子不同时,rand函数生成的随机数序列也会不同。
  • 需在rand函数调用前使用,且整个程序中通常只需调用一次。

示例代码

#include <stdio.h>
#include <stdlib.h>
int main() {srand(100); // 设置种子为100printf("%d\n", rand());printf("%d\n", rand());srand(200); // 重新设置种子为200printf("%d\n", rand());return 0;
}

在这里插入图片描述
当种子值改变时,rand生成的序列也会随之改变。但如果每次都手动设置固定的种子,仍然无法实现真正的随机性。

3. time函数:获取动态种子

要让种子值时刻变化,最简便的方法是利用系统时间。time函数可以返回当前时间与"1970年1月1日0时0分0秒"的差值(单位:秒),这个值被称为"时间戳",且每秒都会变化,非常适合作为动态种子。

其声明格式为:

time_t time(time_t* timer);
  • 参数timer为指针,若传入NULL,则仅返回时间戳。
  • 返回值类型为time_t(本质是整型),使用前需包含头文件time.h

结合使用示例

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {// 将时间戳强制转换为unsigned int类型作为种子srand((unsigned int)time(NULL));printf("%d\n", rand());printf("%d\n", rand());return 0;
}

在这里插入图片描述
此时多次运行程序,会发现每次生成的随机数序列都不同,从而实现了真正的随机性。

二、设置随机数的范围

rand函数生成的随机数范围较大(032767),而实际游戏中通常需要限定在特定范围(如1100)。通过取余和偏移运算,可以轻松实现范围控制。

常见的范围设置公式:

  • 生成0~n-1的随机数:rand() % n
    (例如rand() % 100可生成0~99的数字)
  • 生成1~n的随机数:rand() % n + 1
    (例如rand() % 100 + 1可生成1~100的数字)
  • 生成a~b的随机数:a + rand() % (b - a + 1)
    (例如10 + rand() % (20 - 10 + 1)可生成10~20的数字)

三、猜数字游戏的完整实现

结合上述知识,我们可以设计一个猜数字游戏,具体需求如下:

  1. 电脑自动生成1~100的随机数。
  2. 玩家输入猜测的数字,电脑提示"猜大了"或"猜小了"。
  3. 直到玩家猜对数字,游戏结束。
完整代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 游戏核心逻辑
void game() {// 生成1~100的随机数int target = rand() % 100 + 1;int guess = 0;// 循环猜数字,直到猜对while (1) {printf("请输入你猜的数字:");scanf("%d", &guess);if (guess < target) {printf("猜小了!再试试\n");} else if (guess > target) {printf("猜大了!再试试\n");} else {printf("恭喜你,猜对了!答案就是%d\n", target);break; // 猜对后退出循环}}
}
// 打印游戏菜单
void menu() {printf("*********************\n");printf("*****  1. 开始游戏  *****\n");printf("*****  0. 退出游戏  *****\n");printf("*********************\n");
}
int main() {int choice = 0;// 设置随机数种子(整个程序只需一次)srand((unsigned int)time(NULL));do {menu(); // 显示菜单printf("请选择:");scanf("%d", &choice);switch (choice) {case 1:game(); // 开始游戏break;case 0:printf("游戏结束,再见!\n");break;default:printf("输入错误,请重新选择!\n");break;}} while (choice != 0); // 当选择0时退出循环return 0;
}

在这里插入图片描述

代码解析
  • 菜单与分支结构:通过do-while循环和switch语句实现游戏的多次运行与退出控制,提升用户体验。
  • 循环猜数逻辑game函数中使用while(1)无限循环,配合if-else分支判断猜测结果,直到猜对才通过break退出。
  • 随机数生成:在main函数开头调用srand设置种子,确保每次运行游戏时目标数字都不同。

通过这个案例,我们不仅掌握了随机数生成的方法,更熟悉了分支(if-elseswitch)和循环(whiledo-while)语句的实际应用。你可以尝试扩展功能,比如增加猜数次数限制、显示猜中所用次数等,进一步巩固所学知识。

你好,我是意疏。我们一起进步。

在这里插入图片描述


意气风发,漫卷疏狂
学习是成长的阶梯,每一次的积累都将成为未来的助力。我希望通过持续的学习,不断汲取新知识,来改变自己的命运,并将成长的过程记录在我的博客中
如果我的博客能给您带来启发,如果您喜欢我的博客内容,请不吝点赞、评论和收藏,也欢迎您关注我的博客。
您的支持是我前行的动力。听说点赞会增加自己的运气,希望您每一天都能充满活力!

愿您每一天都快乐,也欢迎您常来我的博客。我叫意疏,希望我们一起成长,共同进步。
logo 我是意疏 下次见!

http://www.dtcms.com/a/336975.html

相关文章:

  • 20250818 割点 割边 点双总结
  • 一个基于纯前端技术实现的五子棋游戏,无需后端服务,直接在浏览器中运行。
  • 数据挖掘 3.5 支持向量机——边界和正则化
  • 二分查找例题
  • 从基础到架构的六层知识体系
  • 进阶向:人物关系三元组,解锁人物关系网络的钥匙
  • 如何新建一个自己的虚拟环境
  • 有向无环图(Directed Acyclic Graph, DAG)介绍(环检测、DFS法、Kahn算法、)
  • 【Langchain系列三】GraphGPT——LangChain+NebulaGraph+llm构建智能图数据库问答系统
  • 15.三数之和
  • InfluxDB 开发工具链:IDE 插件与调试技巧(二)
  • 01.Linux小技巧
  • 从 UI 角度剖析蔬菜批发小程序的设计之道——仙盟创梦IDE
  • STRIDE威胁模型
  • IDE开发系列(1)基于QT的简易IDE框架设计
  • 【P38 6】OpenCV Python——图片的运算(算术运算、逻辑运算)加法add、subtract减法、乘法multiply、除法divide
  • 实践笔记-VSCode与IDE同步问题解决指南;程序总是进入中断服务程序。
  • 面试 TOP101 二叉树专题题解汇总Java版(BM23 —— BM41)
  • 深入解析StatefulSet与K8s服务管理
  • 集成电路学习:什么是Face Detection人脸检测
  • 多线程初阶-线程安全 (面试和工作的重点!!!)
  • Vue2篇——第六章 Vue 路由(VueRouter)全解析
  • Linux系统网络排查工具总结
  • org.apache.kafka.clients 和 org.springframework.kafka 的区别
  • kafka 发送消息有哪些模式?各自的应用场景是什么?
  • Elasticsearch全文检索中文分词:IK分词器详解与Docker环境集成
  • AI编程工具对决:Kilo vs Augment 开发Flutter俄罗斯方块游戏实战对比
  • 【AI论文】UI-Venus技术报告:借助强化微调(RFT)打造高性能用户界面(UI)代理
  • 手写Spring容器核心原理
  • 加密资产投资的六种策略:稳定币合规后的 Web3 投资和 RWA