【C语言】猜数字小游戏(并讲解随机数相关知识)

前言

一、游戏菜单

二、游戏逻辑

1.用户选择

2.开始游戏

2.1 生成1~100的随机数

总结


前言

本文讲解使用C语言写一个猜数字小游戏(1~100),涉及到的语法为:循环、分支、随机数、函数


一、游戏菜单

一个游戏的最开始,往往是一个菜单,我们只需利用print函数,打印出一个简易菜单即可。

//游戏菜单
void menu()
{printf("******欢迎进入猜数字游戏******\n");printf("*********1、开始*************\n");printf("*********0、退出*************\n");printf("****************************\n");
}

二、游戏逻辑

1.用户选择

打印完菜单后,用户开始选择,在游戏逻辑中,无论是否开始游戏,都会运行一遍菜单,因此在这里使用do...while循环是最合适的。

int input = 0;
do
{menu(); //打印游戏菜单printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("无该选项\n");break;}
} while (input);

2.开始游戏

调用game()函数,在该函数可以分为两步:1、生成1~100的随机数;2、开始猜数字

2.1 生成1~100的随机数

生成随机数函数:rand();C语言规定,使用该函数需先定义一个随机数生成器:srand()

在MSDN上查找rand() 与 srand() 函数,看看它们的结构:

可以看到Remarks: The rand function returns a pseudorandom integer in the range 0 to RAND_MAX. Use the srand function to seed the pseudorandom-number generator before calling rand。意思为rand函数返回一个介于0到rand MAX范围内的伪随机整数。在调用rand之前,使用srand函数为伪随机数生成器提供种子。

rand()函数会生成0~rand_MAX之间的数,我们可以看看rand_MAX是什么:

RAND_MAX为32767的数,因此rand()会生成0~32767之间的数,我们再看看srand()函数:

该函数的参数,需要传递一个unsigned int 种子,这个种子需要是一个变化的值。我们来看看官方给的例子:

srand( (unsigned)time( NULL ) );

time()函数需要传递的参数为指针,返回值为一个time_t的指针,该指针为时间戳,下面我们看看时间戳的概念:

时间戳:当前时间点和计算机起始时间的一个差值,然后转换成秒

当然,使用这三个库函数也要包含对应的头文件:

stdlib.h --> rand、srand

time.h --> time

解释清楚后,我们该如何编写代码呢?

//游戏逻辑
void game()
{printf("游戏开始\n");//1、生成随机数//rand()函数(包含stdlib.h头文件) --> 生成随机数 --> 使用此函数需要先定义一个随机数生成器// srand(unsigned int 变化的数)int number = rand() % 100 + 1; //rand() % 某数 --> 0~某数-1 -->再进行+1 --> 1~某数int Num = 0;//2、猜数字while (1){printf("请输入:>");scanf("%d", &Num);if (Num > number){printf("猜大了!\n");}else if (Num < number){printf("猜小了!\n");}else{printf("恭喜你,猜对了!\n");break;}}
}

srand()函数生成一次就够了。当需要多次rand()时,不需要每一次都进行srand。如果每次rand都srand,则会导致生成的随机数不够随机,因此将srand定义在调用循环之前。

还有一点需要注意,关于生成1~100范围的随机数,对rand() % 最大范围 操作,可以生成0~最大范围-1 之间的数,再进行+1 则生成1~最大范围 的数。当需要自定义生成某一个范围之间的数时,可以这样做。

rand() % 100 +1

总结

好了,这就是用c语言简易版的猜数字小游戏,下面是完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>//游戏菜单
void menu()
{printf("******欢迎进入猜数字游戏******\n");printf("*********1、开始*************\n");printf("*********0、退出*************\n");printf("****************************\n");
}
//游戏逻辑
void game()
{printf("游戏开始\n");//1、生成随机数//rand()函数(包含stdlib.h头文件) --> 生成随机数 --> 使用此函数需要先定义一个随机数生成器// srand(unsigned int 变化的数)int number = rand() % 100 + 1; //rand() % 某数 --> 0~某数-1 -->再进行+1 --> 1~某数int Num = 0;//2、猜数字while (1){printf("请输入:>");scanf("%d", &Num);if (Num > number){printf("猜大了!\n");}else if (Num < number){printf("猜小了!\n");}else{printf("恭喜你,猜对了!\n");break;}}
}
//猜数字游戏
//范围1~100
int main()
{int input = 0;// srand往往只需调用一次,在一个程序调用多次会让随机数不够随机//包含stdlib.h头文件srand((unsigned int)time(NULL)); //time()-->包含time.h头文件函数会返回时间戳,是变化的do{menu(); //打印游戏菜单printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("无该选项\n");break;}} while (input);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/596895.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51单片机学习笔记14 LCD1602显示屏使用

51单片机学习笔记14 LCD1602显示屏使用 一、LCD1602介绍1. 简介2. 引脚定义3. DDRAM4. 字模5. 指令&#xff08;1&#xff09;清屏指令 0x01&#xff08;2&#xff09;光标归位指令 0x02&#xff08;3&#xff09;进入模式设置指令 0x06&#xff08;4&#xff09;显示开关控制指…

Springboot相关知识-图片描述(学习笔记)

学习java过程中的一些笔记&#xff0c;觉得比较重要就顺手记录下来了~ 目录 一、前后端请求1.前后端交互2.简单传参3.数组集合传参4.日期参数5.Json参数6.路径参数7.响应数据8.解析xml文件9.统一返回类10.三层架构11.分层解耦12.Bean的声明13.组件扫描14.自动注入 一、前后端请…

IPSEC VPN双机热备份的配置讲解一

IPSEC VPN双机热备份的配置讲解一 VPN 是一种专用网络&#xff0c;可使用公共网络连接两个或两个以上的远程站点。VPN 可使用通过公共网络路由&#xff08;以隧道方式发送&#xff09;的虚拟连接&#xff0c;而非网络之间的专用连接。IPsec VPN 是一项协议&#xff0c;由建立 …

数据结构--树和二叉树

树和二叉树 1.树概念及结构树的概念树的相关概念树的表示 2.二叉树概念及结构概念特殊的二叉树二叉树的性质 3.二叉树顺序结构及实现4.二叉树链式结构及实现二叉树的顺序结构二叉树的前&#xff0c;中&#xff0c;后序遍历层序遍历 1.树概念及结构 树的概念 树是一种非线性的…

数据库之DCL操作(用户、访问权限。)

DCL英文全称是Data control language(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访问权限。 1.管理用户 1.1查询用户 select * from mysql.user; 其中 Host代表当前用户访问的主机&#xff0c;如果为localhost&#xff0c;仅代表只能够在当前本机访问&…

算法——链表(1)

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享链表专题的第一部分 如果有不足的或者错误的请您指出! 1.链表常用技巧总结 1.1引入虚拟头结点 在力扣上,基本提供的链表题目都是"无头的",但是针对无头链表,我们最…

STM32CubeMX配置步骤详解六 —— 时钟及其它内部参数配置(1)

接前一篇文章&#xff1a;STM32CubeMX配置步骤详解五 —— 基础配置&#xff08;2&#xff09; 本文内容主要参考&#xff1a; STM32CUBEMX配置教程&#xff08;一&#xff09;基础配置-CSDN博客 野火STM32系列HAL库开发教程 —— 第12讲 STM32的复位和时钟控制&#xff08;第…

短毛猫也能吃得好!揭秘宠物店推荐猫粮的秘密!

短毛猫通常毛发短而浓密&#xff0c;性格温顺&#xff0c;容易打理。那么&#xff0c;对于我们这些爱护短毛猫的朋友们来说&#xff0c;选择一款合适的猫粮就显得尤为重要了。今天&#xff0c;我要向大家推荐一款我个人非常喜欢的猫粮——福派斯三文鱼益生菌猫粮。 &#x1f41…

通信光缆主要敷设方式有哪些

由于建设条件和建设要求不同&#xff0c;通信光缆在不同场景下会采取不同的敷设方式&#xff0c;常见敷设方式包括&#xff1a;直埋、架空、管道、水底及局内等。 1 直埋敷设 直埋&#xff0c;也就是直接埋设&#xff0c;是指把光缆直接埋设于地下土壤中的敷设方式。通常&…

考研高数(平面图形的面积,旋转体的体积)

1.平面图形的面积 纠正&#xff1a;参数方程求面积 2.旋转体的体积&#xff08;做题时&#xff0c;若以x为自变量不好计算&#xff0c;可以求反函数&#xff0c;y为自变量进行计算&#xff09;

【Linux】使用cloudreve搭建个人网盘并传输文件

Cloudreve 是一个开源的个人网盘系统&#xff0c;能够帮助用户搭建属于自己的私有云存储服务。它支持多种存储后端&#xff0c;包括本地存储、远程FTP/SFTP存储、以及云存储服务如阿里云OSS、腾讯云COS和Amazon S3等。Cloudreve具有友好的用户界面和丰富的功能&#xff0c;比如…

Leetcode 第 389 场周赛题解

Leetcode 第 389 场周赛题解 Leetcode 第 389 场周赛题解题目1&#xff1a;3083. 字符串及其反转中是否存在同一子字符串思路代码复杂度分析 题目2&#xff1a;3084. 统计以给定字符开头和结尾的子字符串总数思路代码复杂度分析 题目3&#xff1a;3085. 成为 K 特殊字符串需要删…