c语言修炼之猜数字游戏

news2024/11/27 16:50:18

前言

小伙伴们,今天来学习猜数字游戏叭!废话不多说,让我们一起开始学习叭!

思路:

一打开游戏就出现一个菜单然后可以让我们选择是进入游戏还是退出游戏!

#include<stdio.h>
void menu()
{
	printf("********************************\n");
	printf("****** 0.exit   1.play *********\n");
	printf("********************************\n");
}
int main()
{
	menu();

}

就像这样啦!就可以打印出菜单啦!此时我们要在创建一个变量input用来选择是进入游戏还是退出游戏,并且再提示一下玩家输入选择!

#include<stdio.h>
void menu()
{
	printf("********************************\n");
	printf("****** 0.exit   1.play *********\n");
	printf("********************************\n");
}
int main()
{
	int input = 0;
	menu();
	printf("请输入你的选择:>");
	scanf("%d", &input);
	
	return 0;

}

运行看看叭!

能够发现没有达到我们想要的效果哦!没有进入游戏也没有退出游戏的动作!这时我们应该用switch语句,酱酱们还记得switch语法形式吗?switch语句适用于多分支的情况,其语法形式如下:

switch (常量表达式)
{
case 常量项:
		语句项;
}

利用switch语句时,再来看看效果吧 

是达到了之前想要的效果,但是当我们觉得不过瘾想要再来一把时会发现游戏直接结束了,无法再开一把!这该怎么办呢?没错这里我们需要使用一个循环语句!循环语句有三种该选择哪一个呢?是while,for,还是do while呢?这里我们将选择do while语句还记得它与众不同的特点吗:先执行再判断!先玩一把结束之后再选择要不要继续!

#include<stdio.h>
void menu()
{
	printf("**********************\n");
	printf("**** 0.exit  .play ***\n");
	printf("**********************\n");
}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请输入你选择的值:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("进入游戏\n");
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误\n");
			break;
		}
	} while (input);
	return 0;
}

此时就能达到我们想要的效果啦!让给我们开始分装game函数叭就不再用printf了!game函数的话负责具体实现猜数字的内容!

第一步我们需要产生随机数,此处我们需要用到rand函数!不了解的小伙伴可以去cplusplus网站上去查看

左上角的function表示rand是一个函数,返回类型是int,参数为空,其范围为0到RAND_MAX,在使用rand函数时必须引用头文件stdlib.h画线的部分意思需要用deepl进行翻译

翻译的结果是使用rand之前要先调用srand函数,再来查一下srand函数叭 

 srand返回类型为空,其参数类型要为unsigned int,其主要作用是初始化随机数发生!其头文件为stdlib.h。接下来开始解决遇到的问题叭!我们要产生一个一到一百的数,该怎么得到呢?rand的值的范围是0到RAND_MAX,我们使得rand%100就能得到0到99的值再加上1就能得到1到100之间的数字啦,同时用一个变量接收这个值!一起来看看效果叭

#include<stdio.h>
#include<stdlib.h>
void menu()
{
	printf("**********************\n");
	printf("**** 0.exit  .play ***\n");
	printf("**********************\n");
}
void game()
{
	srand(1);
	int ret= rand() % 100 + 1;
	printf("%d\n", ret);
}
int main()
{
	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;
}

 貌似不对呀,为啥产生的数不是随机的·而是同一个呢?问题出在哪呢?rand没问题main函数没问题,那就只能是srand出问题了。上面用的是srand(1),那换成srand(2)试试?

 也是一样的欸,那是不是说明srand里需要一个会变化的参数!什么是一直变化的呢?没错就是时间!那么这里我们需要利用时间戳                                                                                                

 此时就要利用time函数,再上cplusplus查一查叭

 time函数返回类型是time_t,参数是指针类型,作用是获取当前时间,头文件是time.h!已经知道了这些我们再对代码进行修改叭

void game()
{
	srand((unsigned int)time(NULL));
	int ret= rand() % 100 + 1;
	printf("%d\n", ret);
}

 

 是产生值了,但是貌似不够随机!这又是因为什么呢?好叭,问题还是出现在srand函数上!在这里我们调用一次就行,不需要玩一次调用一次!直接放在main函数中即可,再来试试叭酱酱们

运行一下试试叭!

此时就能达到我们想要的结果啦!在进行下一步叭,输入我们猜的数字当猜的数字比产生的数大,大,打印猜大了;比产生的数小,提示猜小了,否则提示猜对了并退出。由于一次就猜对的可能性比较小,因此这里是一个循环!

void game()
{
	int ret= rand() % 100 + 1;
	int guess = 0;
	
	while (1)
	{
		printf("请输入你想猜的值:>");
		scanf("%d", &guess);
		if (guess > ret)
		{
			printf("猜大啦\n");
		}
		else if (guess < ret)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("猜对了\n");
			break;
		}
	}
}

game函数的分装就完成啦!运行一下看看叭

 欧克啦,这就是猜数字游戏得过程啦,上完整代码!

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("**********************\n");
	printf("**** 0.exit  1.play **\n");
	printf("**********************\n");
}
void game()
{
	int ret= rand() % 100 + 1;
	int guess = 0;
	
	while (1)
	{
		printf("请输入你想猜的值:>");
		scanf("%d", &guess);
		if (guess > ret)
		{
			printf("猜大啦\n");
		}
		else if (guess < ret)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("猜对了\n");
			break;
		}
	}
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	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/720120.html

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

相关文章

详解高性能无锁队列的实现

一、无锁队列 1.1 什么是无锁队列 无锁队列&#xff08;Lock-Free Queue&#xff09;是一种并发数据结构&#xff0c;它允许多个线程在没有锁的情况下进行并发操作。 传统的队列通常通过互斥锁来实现线程安全的操作&#xff0c;但互斥锁在高并发情况下可能会造成竞争和性能瓶…

【后端面经-Java】AQS详解

【后端面经-Java】AQS详解 1. AQS是什么&#xff1f;2. AQS核心思想2.1 基本框架2.1.1 资源state2.1.2 CLH双向队列 2.2 AQS模板 3. 源码分析3.1 acquire(int)3.1.1 tryAcquire(int)3.1.2 addWaiter(Node.EXCLUSIVE)3.1.3 acquireQueued(Node node, int arg) 3.2 release(int)3…

校园水电节能管理解决方案

随着社会经济的不断发展&#xff0c;能源问题日益突出&#xff0c;节能减排成为了各级各类学校必须面对的问题。学校的水电能源消耗是其中的一个重要方面&#xff0c;因此&#xff0c;如何对校园水电进行节能管理成为了一个迫切的问题。本文将从以下几个方面介绍校园水电节能管…

在选择自动化测试工具时需要考虑哪些因素?

自动化测试工具是软件开发中不可或缺的一部分&#xff0c;它可以提高测试效率、减少人力成本、提升软件质量&#xff0c;那在选择自动化测试工具时需要考虑哪些因素&#xff1f; 测试需求&#xff1a;首先要明确自动化测试的需求是什么&#xff0c;不同的测试需求对应着不同的工…

电子电气架构相关安全体系介绍

摘要&#xff1a; 随着电子电气架构技术的不断升级&#xff0c;整车越来越多的系统和组件对功能安全产生影响&#xff0c;为此&#xff0c;功能安全也从部分关键系统开发&#xff0c;向整车各系统全面开发拓展。同时&#xff0c;由于域集中式、中央集中式等新架构形态的出现&a…

文档翻译免费怎么做?三分钟告诉你

小乐&#xff1a;嘿&#xff0c;小阳&#xff0c;你知道吗&#xff1f;我最近在学习文档翻译英文&#xff0c;真是太神奇了&#xff01; 小阳&#xff1a;哇&#xff0c;真的吗&#xff1f;那听起来很厉害啊&#xff01;文档翻译英文是怎么做的呢&#xff1f; 小乐&#xff1…

深入解析Java多态进阶学习

目录 1.动态绑定机制 实例A实例B实例C2.多态数组 3.多态数组的高阶用法 4.多态参数 5.多态参数的高阶用法 1.动态绑定机制 java的动态绑定机制非常重要 实例A 我们来看一个实例&#xff1a; 阅读上面的代码&#xff0c;请说明下面的程序将输出什么结果&#xff1a; 程序将会…

机器学习24:《数据准备和特征工程-II》收集数据

构建数据集常用的步骤如下所示&#xff1a; 收集原始数据。识别特征和标签来源。选择抽样策略。拆分数据。 这些步骤在很大程度上取决于你如何构建 ML 问题。本文主要介绍——数据收集-Collecting Data。 目录 1. 数据集的大小和质量 1.1 数据集的大小 1.2 数据集的质量 …

.NET Core webapi 从零开始在IIS上面发布后端接口

文章目录 原因环境配置windows环境.NET Core安装开发端安装服务端安装 新建ASP.NET项目 原因 .NET core是以后.NET未来的趋势&#xff0c;虽然我感觉Java在web后端的主导地位10年内不会动摇&#xff0c;因为Java占据了先发优势。 不过C#的特点就是&#xff0c;简单&#xff0…

mysql三大日志之我对Binlog的理解

mysql 我们先来看一下MySQL的基本架构&#xff0c;从大的方面来讲&#xff0c;一个server层&#xff0c;一个引擎层。server层就像一个接口&#xff0c;可以对接任何符合规定的引擎。具体的细节可以参考我之前写过的文章mysql的这些坑你踩过吗&#xff1f;快来看看怎么优化mys…

Blazor 自定义可重用基础组件之 带标头排序的Table

实现点击标头按所在列值进行排序&#xff0c;是一个非常有用的功能&#xff0c;其他的UI一般搞得非常复杂&#xff0c;添加标志图标什么的&#xff0c;使得本就不宽裕的表格更加拥挤。我的思路是&#xff0c;点击所在列的标头部位&#xff0c;传递标头值&#xff0c;然后根据标…

裸机搭建k8s报错记录

安装教程参考 修复一、 cd /etc/kubernetes/manifests vim kube-scheduler.yaml注释掉 重启 systemctl restart kubelet.service问题二、 https://github.com/kubernetes/kubernetes/issues/70202 一直处于创建中状态 网络原因 cat << EOF > /run/flannel/subnet.…

golang 结构体struct转map实践

1、反射 type sign struct { Name string json:"name,omitempty" Age int json:"age,omitempty" } var s sign s.Name "csdn" s.Age 18 //方式1 反射 var data make(map[string]interface{}) t : reflect.TypeOf(s) v : …

第五步:STM32F4端口复用

什么是端口复用&#xff1f; STM32有很多的内置外设&#xff0c;这些外设的外部引脚都是与GPIO复用的。也就是说&#xff0c;一个GPIO如果可以复用为内置外设的功能引脚&#xff0c;那么当这个GPIO作为内置外设使用的时候&#xff0c;就叫做复用。 例如串口 1 的发送接收引脚…

【C++11】移动语义,完美转发

1.移动语义 1.为什么要有移动语义&#xff1f; C中有拷贝构造函数和拷贝复制运算符&#xff0c;但是这需要占用一定的空间 class MyClass { public:MyClass(const std::string& s): str{ s }{};MyClass(const MyClass& m){strm.str;}private:std::string str; };int …

NSS [NSSRound#7 Team]ec_RCE

NSS [NSSRound#7 Team]ec_RCE 源码如下&#xff1a; <?PHPif(!isset($_POST["action"]) && !isset($_POST["data"]))show_source(__FILE__);putenv(LANGzh_TW.utf8); $action $_POST["action"];$data "".$_POST["…

代理IP,如何助力大数据时代

代理IP&#xff0c;如何为大数据助力 华科云商助力大数据 近年来&#xff0c;我国互联网商业保持持续发展的状态。大环境的优化&#xff0c;各项相关政策的出台&#xff0c;也为互联网经济的发展&#xff0c;提供了强有力的支持。大大小小的企业都想乘风起势&#xff0c;大展宏…

Django核心

安装django pip install django # pip install django3.1.6创建django项目 在一个项目中可以包含多个应用程序。 django-admin startapp app_name #创建一个应用程序 django-admin startproject project_name #创建一个项目运行django项目 python manage.py runserver 80…

REST风格讲解

1.REST风格简介 优点&#xff1a;隐藏资源访问的行为&#xff0c;无法通过地址得知对资源的操作&#xff0c;并且简化了书写 rest风格大概将请求方式分成了Get Post Put Delete四种操作方法。上述行为是约定的方式并不是规范。 RequestMapping注解里面value值存储访问的路…

Docker 中的 .NET 异常了怎么抓 Dump (转载)

一、背景 1. 讲故事 有很多朋友跟我说&#xff0c;在 Windows 上看过你文章知道了怎么抓 Crash, CPU爆高&#xff0c;内存暴涨 等各种Dump&#xff0c;为什么你没有写在 Docker 中如何抓的相关文章呢&#xff1f;瞧不上吗&#xff1f; 哈哈&#xff0c;在DUMP的分析旅程中&a…