【C语言】猜数字游戏的实现

news2025/1/17 3:48:51

简单不先于复杂,而是在复杂之后。

89efcc89ac61428db4d5b6639b2bd948.jpeg

目录

1.思路(代码会附在最后面)

2.随机数函数rand


1.思路(代码会附在最后面)

首先实现一个猜数字游戏我们先要有一个思路:
1.产生一个随机数

2.猜数字

3.可能猜大了

4.可能猜小了

5.直到猜对了结束

2.随机数函数rand

想要生成一个随机数,就要用到 rand 函数。

d01ffbe5f7d34581ad175e244af627f8.png

 rand 会返回一个 0 到 RAND_MAX 的整型

我们需要知道RAND_MAX是个什么样的值

把RAND_MAX转到定义如下图

a5e33764d5a94bc78b2fa8a10262e81e.png

 0X开头的是十六进制的数字

把鼠标移到十六进制数上方换算出的结果是32767

所以我们生成随机数的范围是0~32767之间的一个值

 a88e06b4b0664193a77dc3e6ca344d04.png

以上是测试出生成的值

bd5ebdcceccb4ead943f74a8e5b015ec.png

当关闭程序再次运行,我们会发现生成的随机数和上一次一模一样。

这显然不是我们想要生成的随机数,因为它并不随机。

085ecd4ff16e4141b7fdf9128627d8d8.png

 在调用 rand 函数之前需要使用 srand 函数来设置我们的随机数生成器。

e09197156062428f91c2dd8dd6034bcd.png

srand 函数的是作用是设置一个随机数起点。


a98570d58f134133b00b3444a0c81301.png

 且需要一个无符号整形的一个数值。

fe29e15188434d90b70bfd7fcc5d38dd.png

 可是当我们用 srand 设置起点时,参数为100,生成的随机数的值全部都是 365。

这时我们发现,当 srand 中的参数变了,再次运行,生成的随机数也就改变了。

如果 srand 的参数是一个随机数,生成的数也就是随机的了。

我们为了生成一个随机数,需要一个随机数,很明显是不太现实的。

我们转换思路,参数只需要是时刻变化的数就可以,那么什么东西在时刻变化呢?

时间。

想要获取一个时间,就要引入时间戳的概念:

909ae5e2eb8e43b29fb9457078b34bdc.png

时间戳就是这个时间相对于计算机起始时间之间的一个差值。单位是秒。

时间在变,时间戳就在变。

使用 time 函数来获取时间戳。

time参数可以传一个空指针,time 的返回类型是 time_t, 但是 srand 参数需要一个无符号整型,所以就要强制类型转换。

2530b9542dfc49879944d21a4122c3aa.png

 转到定义看一下,空指针本质上就是0,表示我们不需要这个参数。

time 库函数需要的头文件是 #include<time.h>

srand 库函数需要的头文件是 #include<stdlib.h>

不是每一次生成随机数都要设置一个起点,所以 srand 函数就不必放在 game 函数中,在主函数中设置一次就可以了。

如果每次生成都设置,就会发现,如果开两次生成随机数时间过短,有可能生成的随机数相同。可以自己试一下。

59f4d668432e4b4faf362390f0de7dbb.png

 现在我们已经可以生成足够随机的数了,但是我们想让这个数的生成范围是1~100

因为 rand 函数的生成范围是0~32767,所以这样处理:

rand()%100+1

范围就在1~100之间了。

下附代码:

#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//电脑产生一个随机数(1 ~ 100)
//猜数字
//猜大了
//猜小了
//直到猜对了结束

void menu()
{
	printf("##########################\n");
	printf("########   1.play  #######\n");
	printf("##########################\n");
	printf("########   0.exit  #######\n");
	printf("##########################\n");
}

//生成的随机数范围  0 ~ RAND_MAX(32767)
void game()

{
	int guess = 0;
	//time 函数返回 time_t(时间戳),用于获取系统时间。需要一个指针参数,如果不需要使用参数,传一个空指针。
	//time_t 为一个数据类型 - 整型

	//RAND_MAX;
	//在调用 rand 函数之前要使用 srand 来设置随机数生成器
	//srand : 设置一个随机的起点
	//1.生成随机数]
	//0~99 ----> 1~100
	int ret = rand() % 100 + 1;//生成随机数的函数,返回一个随机的整数
	//2.猜数字
	while (1)
	{
		printf("请猜数字:>");
		scanf("%d", &guess);
		if (guess < ret)
		{
			printf("猜小了\n");
		}
		else if (guess > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜对了!\n");
			break;
		}

	}


}


//指针
//int *p = NULL; - 初始化空指针,本质是0
int main()
{
	srand((unsigned int)time(NULL));
	//不是每次生成随机数时都要设置一个起点,设置一次就就可以
	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);
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java简单一写一个springboot入门案例

首先 我们先打开idea编辑器 然后 选择File New>Project… 项目的话 我们选择 Spring lnitializr 右边的路径要改一下 然后 选择好路径之后 一定要要在后面加上 \项目名 例如 我这里 选择了 D盘下的学习案例下的springbootDom 项目名叫 threshold 那就这样配置 java版本选…

探索【PhySO】

目录0、 初步报错情况1、230、 初步报错情况 根据原链接&#xff0c;已确定安装成功&#xff0c;运行demo时出现报错&#xff0c;不能正常运行 报错&#xff1a; .Dummy epoch time 238.366736 ms .Dummy epoch time (w duplicate elimination) 180.852427 ms (found 15/1…

【结构型模式】代理模式

文章目录优秀借鉴1、简介2、结构3、实现方式3.1、案例引入3.2、静态代理3.3、JDK动态代理3.4、CGLIB动态代理4、区别对比4.1、静态代理和动态代理4.2、JDK动态代理和CGLIB动态代理5、代理模式优缺点6、应用场景优秀借鉴 设计模式&#xff08;四&#xff09;——搞懂什么是代理…

线段树的懒标记

上次看的那个视频讲线段树的时候压根没讲懒标记&#xff0c;然后我今天去写题目直接被薄纱&#xff01;都是70分&#xff0c;剩下3个节点tml&#xff01;&#xff01;&#xff01; 懒标记 我们在修改一些区间的时候&#xff0c;按照我昨天来学的来修改要改到最下面的叶节点去…

Visual Studio如何将UTF-8字符串输出到控制台

解决c语言使用libcurl库时控制台输出中文出现乱码的问题。 字符编码问题一直以来都是Windows系统的诟病&#xff0c;而Visual Studio也是饱受此诟病。由于历史原因&#xff0c;Windows系统对各个不同的国家地区可能采用不同的code page。由于早先Unicode并未发展成熟&#xff0…

Java设计模式之工厂模式

什么是工厂模式 工厂模式就是将创建对象的具体过程和使用过程分开&#xff0c;这样能够使代码更加灵活。 工厂模式主要分为三类&#xff1a; 简单工厂模式工厂方法模式抽象工厂模式 比如在没有工厂的时候&#xff0c;用户需要一台奥迪车&#xff0c;那么就需要用户去创建一台…

【java 多线程】并发设计模式-两阶段终止模式(对interrupt的理解)

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

惊艳!阿里出品“Java全栈进阶宝典”,广度与深度齐头并进

前言 据有关数据统计&#xff0c;目前来看&#xff0c;大大小小的招聘网站上面&#xff0c;Java岗的招聘量仍然是最多的&#xff0c;基本是其他语言的3倍以上&#xff0c;由于目前Java所处的统治级地位&#xff0c;单就数量来看&#xff0c;Java语言实现的系统是海量的&#x…

linux安装MongoDB

环境说明 系统CentOS&#xff1a;CentOS7 mongodb版本 4.2.24 下载 官网下载地址 Download MongoDB Community Server | MongoDB 某云盘 链接&#xff1a;https://pan.baidu.com/s/1G4AC3h5rvz9WM3fx4gJzbA 提取码&#xff1a;ojkl 上传解压 在根目录下创建opt文件夹…

【数据分析之道-基础知识(九)】推导式

文章目录专栏导读1、前言2、列表推导式3、集合推导式4、字典推导式5、元组推导式专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN Python领域新星创作者&#xff0c;专注于分享python领域知识。 ✍ 本文录入于《数据分析之道》&#xff0c;本专栏针对大学生、初级数据分…

C语言学习1--------Visual Studio集成开发环境的搭建

C语言学习1--------Visual Studio集成开发环境的搭建适合初学者适用集成开发环境下载 Visual Studio 2019安装 Visual Studio 2019安装工作负载为C自定义安装位置激活 Visual Studio适合初学者适用集成开发环境 建议初学者适用最新的——Visual Studio 2019为集成开发环境。 部…

【数据库原理 • 五】数据库安全性与完整性

前言 数据库技术是计算机科学技术中发展最快&#xff0c;应用最广的技术之一&#xff0c;它是专门研究如何科学的组织和存储数据&#xff0c;如何高效地获取和处理数据的技术。它已成为各行各业存储数据、管理信息、共享资源和决策支持的最先进&#xff0c;最常用的技术。 当前…

【C++11那些事儿(一)】

文章目录一、C11简介二、列表初始化2.1 C98中{}的初始化问题2.2 C11中的列表初始化三、各种小语法3.1 auto3.2 decltype3.3 nullptr3.4 范围for四、STL中的一些变化五、左/右值引用和移动语义&#xff08;本篇重点&#xff09;5.1 做值引用和右值引用5.2 左值引用与右值引用比较…

【快乐手撕LeetCode题解系列】—— 复制带随机指针的链表

【快乐手撕LeetCode题解系列】—— 复制带随机指针的链表&#x1f60e;前言&#x1f64c;复制带随机指针的链表&#x1f64c;画图分析&#xff1a;&#x1f60d;思路分析&#xff1a;&#x1f60d;源代码分享&#xff1a;&#x1f60d;总结撒花&#x1f49e;&#x1f60e;博客昵…

shell结构化命令中for命令

shell脚本编程系列 for var in list docommands done读取列表中的值 每次遍历值列表时&#xff0c;for命令会将列表中的下一个值赋值给变量 #!/bin/bash# basic for commandfor test in Alabama Alaska Arizona Arkansas California Coloradodoecho The next state is $testdo…

第07章_面向对象编程(进阶)

第07章_面向对象编程(进阶) 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 1. 关键字&#xff1a;this 1.1 this是什么&#xff1f; 在Java中&#xff0c;this关键字不算难理解…

关于图像分割的预处理 transform

目录 1. 介绍 2. 关于分割中的 resize 问题 3. 分割的 transform 3.1 随机缩放 RandomResize 3.2 随机水平翻转 RandomHorizontalFlip 3.3 随机竖直翻转 RandomVerticalFlip 3.4 中心裁剪 RandomCrop 3.5 ToTensor 3.6 normalization 3.7 Compose 4. 预处理结果可视…

WPF mvvm框架Stylet使用教程-基础用法

Stylet框架基础用法 安装Nuget包 在“管理Nuget程序包”中搜索Stylet&#xff0c;查看Stylet包支持的net版本&#xff0c;然后选择第二个Stylet.Start包进行安装&#xff0c;该包会自动安装stylet并且生成基本的配置 注意事项&#xff1a;安装时要把需要安装的程序设为启动项…

第06章_面向对象编程(基础)

第06章_面向对象编程&#xff08;基础&#xff09; 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 学习面向对象内容的三条主线 Java类及类的成员&#xff1a;&#xff08;重点&…

《QT+CGAL网格处理——网格重建》

QT+CGAL网格处理——网格重建 一、重建效果二、代码分析显示代码格式转换彩色网格显示三、后续一、重建效果 二、代码分析 显示 1、依旧采取VTK显示,参照《QT+PCL》; 2、点数据、网格数据依旧采用pcl数据结构,cgal处理完成后转换格式即可 界面参照: