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

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.xdnf.cn/news/18057.html

相关文章:

  • 【图像算法 - 17】慧眼识“果”:基于深度学习与OpenCV的苹果智能检测系统(附完整代码)
  • 【Linux系统】进程间通信:System V IPC——消息队列和信号量
  • 「三维共振」:重构实体零售的破局模式
  • HTML应用指南:利用POST请求获取上海黄金交易所金价数据
  • 折扣大牌点餐api接口对接适合本地生活吗?
  • OVS:除了Geneve和VXLAN,还有哪些虚拟化网络协议?
  • OpenCV Python——Numpy基本操作(Numpy 矩阵操作、Numpy 矩阵的检索与赋值、Numpy 操作ROI)
  • 隐秘参数APP:全面了解手机硬件信息与优化性能
  • Redis——Redisson篇
  • Oracle algorithm的含义
  • 【Unity3D实例-功能-拔枪】角色拔枪(二)分割上身和下身
  • 【前端面试题】JavaScript核心面试题解析
  • 计算机网络---跳板机与堡垒机
  • Pytorch模型复现笔记-VGG讲解+架构搭建(可直接copy运行)+冒烟测试
  • 三维重建-动手学计算机视觉19(完结)
  • openEuler等Linux系统中如何复制移动硬盘的数据
  • 豆包 Java的23种设计模式
  • 力扣3:无重复字符的最长子串
  • 【LeetCode题解】LeetCode 33. 搜索旋转排序数组
  • Java研学-SpringCloud(二)
  • 从零到一:打包并发布你的第一个MCP AI工具服务
  • DNS总结
  • 从CVPR到NeurIPS,可变形卷积+可变形空间注意力如何斩获最佳论文
  • python+flask后端开发~项目实战 | 博客问答项目--模块化文件架构的基础搭建
  • 灰色预测模型
  • matlab tlc的文件、字符串操作
  • 【力扣热题100】双指针—— 接雨水
  • redis和cdn的相似性和区别
  • Android中切换语言的方法
  • Perf使用详解