C语言实现猜数字游戏(有提示,限制次数版)

这次的猜数字游戏我添加了新的功能:为玩家添加了提示,以及输入数字的限制次数。

首先,我们的猜数字游戏需要一个菜单,来让玩家可以选择玩游戏还是退出游戏,所以我们需要开始就打印一个菜单:

int main()
{
	int input = 0;
	do
	{
		muen();//上来先打印一个菜单,让玩家选择
		printf("请选择:");
		scanf("%d", &input);
		while (getchar() != '\n')
		{
			;
		}//清空缓冲区
		switch (input)
		{
		case 1:
			//printf("开始游戏\n");
			play();
			break;
		case 0:
			printf("游戏结束\n");
			break;
		default:
			printf("重新选择\n");
			break;
		}
	} while (input);
}

上来就打印菜单,所以我们用 do while 函数。菜单我们用muen函数来封装。

void muen()
{
	printf("***********************\n");
	printf("****** 1 . play *******\n");
	printf("***********************\n");
	printf("****** 0 . exit *******\n");
	printf("***********************\n");
}

后面我们用 swtich 选择语句来接受玩家的输入,如果是 1 就进入play 函数,0 就退出游戏,选择其他的数字就叫玩家重新选择。而选择 0 也会退出循环。这就是 1  和 0 的巧妙。

现在我们来设计 play 函数的内容:

具体就是电脑随机在1 ---- 100 中产生一个数,让玩家来猜,猜大了,就说猜大了,猜小了,就说猜小了,我们的提示,在进入play函数的时候就问玩家是否要提示,如果选择了是,就提示玩家是否在 30 ---- 60 之间,如果没选择,就让玩家猜,玩家猜一次,次数就要减少一次,直到次数用尽或者玩家猜到了就结束循环,这就是我们的基本流程:

void play()
{
	//做一个1——100随机数字,需要函数,rand() srand(),头文件stdlib
	int num = rand() % 100 + 1;//没必要每次都调用srand 一次就行
	int mem = 0;
	for (int i = 0; i < NUM; i++)
	{
		char p = 0;
		if (flag == 0)
		{
			printf("还有一次提示,是否要使用?\n");
			printf("y / n :");
			scanf("%c", &p);
			if (p == 'y')
			{
				prompt(num);
			}
		}
		printf("输入你的数字:");
		scanf("%d", &mem);
		while (getchar() != '\n')
		{
			;
		}
		if (mem > num)
		{
			if ((NUM -1 -i) == 0)
			{
				printf("猜大了,机会用尽\n");
				break;
			}
			else
			{
				printf("猜大了,还有%d次机会\n", NUM - 1 - i);
			}
		}
		else if (mem < num)
		{
			if ((NUM - 1 - i) == 0)
			{
				printf("猜小了,机会用尽\n");
				break;
			}
			else
			{
				printf("猜小了,还有%d次机会\n", NUM - 1 - i);
			}
		}
		else
		{
			printf("猜对了\n");
			break;
		}
	}
}

我们也会发现实现的时候有些问题,所以我们的提示另写一个函数来封装:

int flag = 0;// 提示的标志

void prompt(int num)//提示
{
	if (num >= 30 && num <= 60)
	{
		printf("在 30 到 60 之间\n");
	}
	else
	{
		printf("不在30 到 60 之间\n");
	}
	flag = 1;
}

我们给一个全局变量 flag 如果玩家使用了提示,就让 flag 变成1 ,这样就可以区分玩家到底有没有用提示了。(在这个游戏代码中尽量 scanf 之后清空一下缓冲区,防止出现缓冲区有东西的问题。)我们的猜数字机会次数用  #define NUM 5    来定义,这样还可以方便我们修改。所以我们循环就可以用 for 循环来写。

这里的随机数字简单介绍一下: rand 函数  和  srand 函数。

他们都需要头文件<stdlib.h>,简单来说,rand 函数可以产生一个随机值,srand函数是随机数种子,只要让srand里的参数变动起来就可以实现我们需要的随机数了,这个时候我们就用 time 函数:

他返回的是一个时间戳,时间戳就是随时变化的,这样就解决了,他需要头文件<time.h>。

这里我给一个C语言函数查询网站:cplusplus.com - C++资源网络icon-default.png?t=N7T8https://legacy.cplusplus.com/

 最后附上源码:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
// 这次实现猜数字有5次机会次数,还可以提示,提示有一次机会,告诉是否在30 - 60 之间
#define NUM 5 // 方便修改

int flag = 0;// 提示的标志

void prompt(int num)//提示
{
	if (num >= 30 && num <= 60)
	{
		printf("在 30 到 60 之间\n");
	}
	else
	{
		printf("不在30 到 60 之间\n");
	}
	flag = 1;
}

void muen()
{
	printf("***********************\n");
	printf("****** 1 . play *******\n");
	printf("***********************\n");
	printf("****** 0 . exit *******\n");
	printf("***********************\n");
}

void play()
{
	//做一个1——100随机数字,需要函数,rand() srand(),头文件stdlib
	int num = rand() % 100 + 1;//没必要每次都调用srand 一次就行
	int mem = 0;
	for (int i = 0; i < NUM; i++)
	{
		char p = 0;
		if (flag == 0)
		{
			printf("还有一次提示,是否要使用?\n");
			printf("y / n :");
			scanf("%c", &p);
			if (p == 'y')
			{
				prompt(num);
			}
		}
		printf("输入你的数字:");
		scanf("%d", &mem);
		while (getchar() != '\n')
		{
			;
		}
		if (mem > num)
		{
			if ((NUM -1 -i) == 0)
			{
				printf("猜大了,机会用尽\n");
				break;
			}
			else
			{
				printf("猜大了,还有%d次机会\n", NUM - 1 - i);
			}
		}
		else if (mem < num)
		{
			if ((NUM - 1 - i) == 0)
			{
				printf("猜小了,机会用尽\n");
				break;
			}
			else
			{
				printf("猜小了,还有%d次机会\n", NUM - 1 - i);
			}
		}
		else
		{
			printf("猜对了\n");
			break;
		}
	}
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//随机数种子生产器,给它一个变化的数即可,而time 可以返回一个时间戳就在时刻变化
	do
	{
		muen();//上来先打印一个菜单,让玩家选择
		printf("请选择:");
		scanf("%d", &input);
		while (getchar() != '\n')
		{
			;
		}
		switch (input)
		{
		case 1:
			//printf("开始游戏\n");
			play();
			break;
		case 0:
			printf("游戏结束\n");
			break;
		default:
			printf("重新选择\n");
			break;
		}
	} while (input);
}

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

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

相关文章

Linux之进程间通信

1.进程间通信的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了某种事件&#xff…

谷歌商店如何绑定银行卡!通过支付宝!

完整操作视频在B站&#xff1a; https://www.bilibili.com/video/BV1zt421g7pa/?spm_id_from333.337.search-card.all.click&vd_sourceb5a2563a2e562c5165936c011dcfd0a5 谷歌商店怎么支付&#xff01; 谷歌商店主要用来购买游戏和支付app的应用&#xff0c;由于都是采…

蓝桥杯省赛刷题——题目 2656:刷题统计

刷题统计OJ链接&#xff1a;蓝桥杯2022年第十三届省赛真题-刷题统计 - C语言网 (dotcpp.com) 题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目&#xff0c;周六和周日每天做 b 道题目。请你帮小明计算&#xff0c;按照计划他将在第几…

P6学习:Oracle Primavera P6 OBS/责任人解析

前言 Primavera P6 EPPM 责任人用于管理 P6 企业项目组合管理 (EPPM) 系统中的项目所有权和权限。 Primavera P6 EPPM 中的所有项目都至少围绕三个结构进行组织&#xff1a;称为企业项目结构 (EPS) 的用于组织项目的结构、称为工作分解结构 (WBS) 的用于组织项目内活动的结构…

一篇讲明白 Hadoop 生态的三大部件

文章目录 每日一句正能量前言01 HDFS02 Yarn03 Hive04 HBase05 Spark及Spark Streaming关于作者推荐理由后记赠书活动 每日一句正能量 黎明时怀着飞扬的心醒来&#xff0c;致谢爱的又一天&#xff0c;正午时沉醉于爱的狂喜中休憩&#xff0c;黄昏时带着感恩归家&#xff0c;然后…

ALPHA开发板上PHY网络芯片LAN8720:常用的几个寄存器功能

一. 简介 正点原子的开发板 ALPHA开发板&#xff0c;有线网络硬件方案所使用的也是最常用的一种方案&#xff0c;IMX6ULL芯片内部是自带 MAC网络芯片的&#xff0c;所以&#xff0c;也就是采用 "SOC内部集成网络MAC外设 PHY网络芯片方案"。 前面一篇文章简单了解了…

【python从入门到精通】-- 第三战:输入输出 运算符

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文…

Android动画(一):视图动画

文章概览 1 Android动画概述1.1 动画的分类1.2 视图动画与属性动画的区别 2 视图动画View Animation2.1 补间动画Tween Animation2.1.1 XML中用标签实现补间动画2.1.2 代码实现补间动画 2.2 逐帧动画Frame Animation2.2.1 XML实现逐帧动画2.2.2 代码实现逐帧动画 本系列将介绍以…

MySQL 之 数据库操作 及 表操作

&#x1f389;欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ &#x1f389;感谢各位读者在百忙之中抽出时间来垂阅我的文章&#xff0c;我会尽我所能向的大家分享我的知识和经验&#x1f4d6; &#x1f389;希望我们在一篇篇的文章中能够共同进步&#xff01;&#xff01;&…

(一)kafka实战——kafka源码编译启动

前言 本节内容是关于kafka消息中间键的源码编译&#xff0c;并通过idea工具实现kafka服务器的启动&#xff0c;使用的kafka源码版本是3.6.1&#xff0c;由于kafka源码是通过gradle编译的&#xff0c;以及服务器是通过scala语言实现&#xff0c;我们要预先安装好gradle编译工具…

了解XSS和CSRF攻击与防御

什么是XSS攻击 XSS&#xff08;Cross-Site Scripting&#xff0c;跨站脚本攻击&#xff09;是一种常见的网络安全漏洞&#xff0c;它允许攻击者在受害者的浏览器上执行恶意脚本。这种攻击通常发生在 web 应用程序中&#xff0c;攻击者通过注入恶意脚本来利用用户对网站的信任&…

springboot论坛管理系统

论坛管理系统 摘要&#xff1a; 在社会快速发展的影响下&#xff0c;论坛管理系统继续发展&#xff0c;使论坛管理系统的管理和运营比过去十年更加信息化。依照这一现实为基础&#xff0c;设计一个快捷而又方便的网上论坛管理系统是一项十分重要并且有价值的事情。对于传统的论…

Linux简单命令

Linux简单命令 本文是自己学习过程中的一些记录&#xff0c;对于熟悉的部分并未全部列出&#xff0c;仅供参考 内核架构图 一切皆是文件 常用的linux命令 用户的管理 修改密码&#xff1a;passwd 创建一个新用户&#xff1a;useradd 用户名给新用户设置密码&#xff1a;…

【Linux】详解文件系统以及周边知识

一、磁盘的基本知识 磁盘中可以被划分成一个一个的环&#xff0c;每个环都是一个磁道。每个磁道又可以被均分成一个一个的扇区&#xff0c;扇区是磁盘IO的基本单位&#xff08;想要修改扇区中的一个比特位就必须把该扇区的全部比特位都加载到内存中&#xff09;。磁盘中的盘面&…

C++入门(函数重载、缺省参数、引用)

目录 函数重载函数重载的概念函数重载的原理----名字的修饰 缺省参数缺省参数的分类 引用引用的特征使用场景 函数重载 函数重载的概念 在自然语言中&#xff0c;相同的一个词可能有多重含义&#xff0c;人们可以通过上下文来判断这个词的具体意思&#xff0c;在C中也存在这种…

虚函数和纯虚函数

虚函数 被virtual修饰的成员函数称为虚函数 定义一个函数为虚函数&#xff0c;是为了使用基类指针调用子类函数。虚函数&#xff0c;不代表函数不被实现。只有纯虚函数才不被实现&#xff0c;纯虚函数定义了一个接口&#xff0c;起到规范的作用。 #include <iostream>…

快讯!TiDB v8 发版!超硬核 v8 引擎!

TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库&#xff0c;是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式数据库产品。 具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数…

初识C++ · 入门(2)

目录 1 引用 1.1引用的概念 1.2 引用的特性 2 传值&#xff0c;传引用的效率 3 引用和指针的区别 4 内联函数 4.1 内联函数的定义 4. 2 内联函数的特性 5 关键字auto 5.1关于命名的思考 5.2 关于auto的发展 5.3 auto使用规则 6 范围for的使用 7 空指针 1 引用 …

瑞吉外卖实战学习--9、mybatisPlus公共字段自动填充

mybatisPlus公共字段自动填充 前言实现步骤实体类添加注解按照框架要求编写元数据对象处理器&#xff0c;在此类中统一为公共字段赋值&#xff0c;此类需要实现MetaObjectHandler接口1、在创建和更新的时候修改创建和更新的时候自动填充时间2、如何获取到当前的id 测试结果 前言…

【MySQL】内外连接——内连接、外连接、左外连接、右外连接、内外连接的区别、左外连接和右外连接的区别

文章目录 MySQLMySQL表的内连接和外连接1. 内连接2. 外连接2.1 左外连接2.2 右外连接 3. 内外连接的区别4. 左外连接和右外连接的区别 MySQL MySQL表的内连接和外连接 MySQL 中的内连接&#xff08;INNER JOIN&#xff09;和外连接&#xff08;包括左外连接 LEFT JOIN 和右外连…