【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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零开始实现一个RPC框架(一)

前言 在上一篇文章中我们先列举了大致的需求&#xff0c;定义了消息协议。这次我们着手搭建基本的RPC框架&#xff0c;首先实现基础的方法调用功能。 功能设计 RPC调用的第一步&#xff0c;就是在服务端定义要对外暴露的方法&#xff0c;在grpc或者是thrift中&#xff0c;这一…

如何删除 iPhone 上的 iCloud 激活锁

Apple 在 iPhone 上通过不同的安全屏障来保护您的数据。 iCloud 激活锁可阻止外部人员访问您的手机。您可以通过打开“查找我的 iPhone”功能来激活此锁。 使用安全协议似乎是无害的&#xff0c;直到你到达门的另一边。如果您购买了带有激活锁的二手 iPhone 或忘记了 iCloud 凭…

面试经典-Spring篇

1、解释Spring框架中bean的生命周期 2、单例Bean的优势

CEF的了解

(14 封私信 / 80 条消息) CEF和Electron的区别是什么&#xff1f; - 知乎 (zhihu.com) Electron面向的开发者&#xff1a;会用JavaScript,HTML,CSS&#xff0c;不会C CEF面向的开发者&#xff1a;会用JavaScript,HTML,CSS&#xff0c;会C (14 封私信 / 80 条消息) liulun - …

【文献分享】ALKEMIE:加速材料发现和设计的智能计算平台

题目&#xff1a;ALKEMIE: An intelligent computational platform for accelerating materials discovery and design 链接&#xff1a;DOI: 10.1016/j.commatsci.2020.110064 ALKEMIE&#xff1a;加速材料发现和设计的智能计算平台 摘要 通过传统的试错方式开发具有目标特性…

如何使用PL/SQL Developer工具导出clob字段的表?

1 准备测试数据 导出测试对象&#xff1a;表test_0102&#xff0c;others字段为clob类型 --创建中间表test_0101 create table test_0101( id number, name varchar2(20), others clob);--插入100条测试数据 beginfor i in 1..100 loopinsert into test_0101 values(i,i||_a,l…

利用免费的开源AI引擎:优化企业合规管理与合同审核

合同作为商业活动中的重要法律文件&#xff0c;其准确性、完整性和合规性对于保障企业利益至关重要。然而&#xff0c;传统的人工合同审核和管理过程耗时耗力&#xff0c;且容易出错。随着人工智能技术的发展&#xff0c;我们现在可以通过智能化的手段来优化合同审核和管理流程…

【MATLAB源码-第30期】基于matlab的内边界边缘检测算法。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 在计算机视觉领域&#xff0c;图像分割&#xff08;segmentation&#xff09;指的是将数字图像细分为多个图像子区域&#xff08;像素的集合&#xff09;&#xff08;也被称作超像素&#xff09;的过程。图像分割的目的是简化…

聚酰亚胺PI材料难于粘接,用什么胶水粘接?那么让我们先一步步的从认识它开始(十八): 聚酰亚胺PI泡沫有哪些应用领域

聚酰亚胺PI泡沫有哪些应用领域 聚酰亚胺&#xff08;PI&#xff09;泡沫由于其一系列优异的特性&#xff0c;在许多高性能应用领域中都有广泛的应用&#xff0c;包括但不限于&#xff1a; 航空航天领域&#xff1a;聚酰亚胺PI泡沫由于其出色的耐高温、隔热和阻燃性能&#xff0…

vue2中的局部组件和全局组件

注&#xff1a;vue2中使用组件远没有vue3中简单&#xff0c;具体可以看阿耿老师的lingshi小程序 如图所示&#xff1a;

包装类的理解

为什么需要包装类 Java提供了两个类型系统&#xff0c;基本数据类型与引用数据类型。使用基本数据类型在于效率&#xff0c;然而当要使用只针对对象设计的API或新特性&#xff08;例如泛型&#xff09;&#xff0c;怎么办呢&#xff1f;例如&#xff1a; //情况1&#xff1a;方…

Codeforces CodeTON Round 8(Div.1 + Div.2) A~E

A. Farmer John’s Challenge (模拟) 题意&#xff1a; 构造一个长度为 n n n的数组&#xff0c;将这些数组围成一个圈&#xff08;顺时针&#xff09;从任意一个位置打开&#xff0c;有且仅有 k k k个非降序排列的数组。 分析&#xff1a; k 1 k1 k1时&#xff0c;升序输…

网络原理 - HTTP / HTTPS(4)——构造http请求

目录 一、postman 的下载安装以及简单介绍 1、下载安装 2、postman的介绍 二、通过 Java socket 构造 HTTP 请求 构造http请求的方式有两种&#xff1a;&#xff08;1&#xff09;通过代码构造&#xff08;有一点难度&#xff09; &#xff08;2&#xff09;通过第三…

StarRocks使用Minio备份和还原

1.安装minio Centos7安装minio-CSDN博客 minio api端口&#xff1a;9090 下文用到这个端口 必须提前创建好桶: packfdv5 名称自定义和后面对上就可以 2.创建备份仓库 格式&#xff1a; CREATE REPOSITORY <repository_name> WITH BROKER ON LOCATION "s3a:/…

Java设计模式:外观模式之优雅门面(九)

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在软件工程中&#xff0c;设计模式是解决常见设计问题的经验总结&#xff0c;它为开发者提供了一种通用的、可复用的解决方案。外…

Jettison 1.8.7直装版 外部磁盘辅助弹出

Jettison 是一款适用于 macOS 的实用工具&#xff0c;旨在简化外部驱动器的管理。它可以自动卸载和重新挂载外部驱动器&#xff0c;帮助您更方便地使用和保护您的存储设备。 软件下载&#xff1a;Jettison 1.8.7直装版下载 自动卸载和重新挂载&#xff1a;Jettison 可以在您离开…

QT----YOLOv5检测平台

目录 1 opencv环境安装1.1 报错Could NOT find CUDNN (missing: CUDNN_LIBRARY CUDNN_INCLUDE_DIR) (Required is at least version "7.5")1.2 使用camkevs编译opencv4.8.01.3 报错operator !":重载函数具有类似的转换(编译源文件 H:\opencv-4.8.0\opencv-4.8.0…

【C++】类和对象(中篇)

目录 1、类中的6个默认成员函数 2、构造函数 2.1 概念 2.2 特性 3、析构函数 3.1 概念 3.2 特性 4、拷贝构造函数 4.1 概念 4.2 特征 5、赋值运算符重载 5.1 运算符重载 5.1.1 全局的operator ​编辑 5.1.2 成员函数的operator 5.2 赋值运算符重载 6、创建Date类…

移动端基础

移动端基础 一.了解二.视口1.视口形式2.视口标签3.viewport设置 三.二倍图1.像素比2.多倍图3.背景缩放及使用&#xff08;background-size&#xff09;4.多倍图切图 四.移动端开发选择1.单独制作2.响应式3.总结 五.移动端技术解决方案1.初始化2.盒子模型3.特殊样式 六.常见布局…

Linux| Awk 中“next”命令奇用

简介 本文[1]介绍了在Linux中使用Awk的next命令来跳过剩余的模式和表达式&#xff0c;读取下一行输入的方法。 next命令 在 Awk 系列教程中&#xff0c;本文要讲解如何使用 next 命令。这个命令能让 Awk 跳过所有你已经设置的其他模式和表达式&#xff0c;直接读取下一行数据。…