C语言--从零开始的扫雷游戏

C语言--从零开始的扫雷游戏

  • 1. 游戏说明
  • 2. 总体代码
  • 3. 详细讲解
    • 3.1 菜单部分
    • 3.2 游戏主体部分
      • 3.2.1 总体分析
      • 3.2.2 棋盘初始化
      • 3.2.3 棋盘展示
      • 3.2.4 设置地雷
      • 3.2.5 扫雷阶段
      • 3.2.6 统计雷个数的代码
      • 3.2.7 使用迭代的方式进行展开:
      • 3.2.8 扫雷部分主体代码
  • 4. 总结

1. 游戏说明

扫雷游戏的功能说明:

• 使⽤控制台实现经典的扫雷游戏

• 游戏可以通过菜单实现继续玩或者退出游戏

• 扫雷的棋盘是9*9的格⼦

• 默认随机布置10个雷

• 可以排查雷

◦ 如果位置不是雷,就显⽰周围有⼏个雷

◦ 如果位置是雷,就炸死游戏结束

◦ 把除10个雷之外的所有雷都找出来,排雷成功,游戏结束
在这里插入图片描述
在这里插入图片描述

2. 总体代码

//头文件部分
#define  _CRT_SECURE_NO_WARNINGS
#pragma once

#include  <stdio.h>
#include  <time.h>
#include  <stdlib.h>


//棋盘长宽
#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

#define EASY_COUNT 10 //地雷个数


//初始化棋盘
void InitBoard(char arr[ROWS][COLS], int rows, int cols,char ch);

//打印棋盘
void PrintBoard(char arr[ROWS][COLS], int row, int col);

//设置地雷
void MineSet(char mine[ROWS][COLS], int row, int col);

//找雷
void FindMine(char show[ROWS][COLS], char mine[ROWS][COLS],int row,int col);

               //以上为头文件部分
//测试部分
#define  _CRT_SECURE_NO_WARNINGS

#include "game.h"

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

void game()
{
	char show[ROWS][COLS];//  '*'
	char mine[ROWS][COLS];//  '数字'
	//初始化
	InitBoard(show, ROWS, COLS, '*');
	InitBoard(mine, ROWS, COLS, '0');
	//打印棋盘
	//PrintBoard(mine, ROW, COL);
	PrintBoard (show, ROW, COL);
	//设置地雷
	MineSet (mine, ROW, COL);
	//PrintBoard (mine, ROW, COL);
	//找地雷
	FindMine(mine,show, ROW, COL);
	
}

int main()
{
	int input=0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请输入你的选择:> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("< 请注意,本轮一共有%d颗雷 >\n", EASY_COUNT);
			game();
			break;
		case 0:
			printf("游戏结束\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (input);
	
	return 0;
}
                       //以上为测试部分
//主体游戏部分
#define  _CRT_SECURE_NO_WARNINGS

#include "game.h"

void InitBoard(char arr[ROWS][COLS], int rows, int cols, char ch)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < ROWS; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			arr[i][j] = ch;
		}
	}
}

void PrintBoard(char arr[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("********************\n");
	for (i = 0; i <= row; i++)
	{
		printf("%d_", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d|", i );
		for (j = 1; j <= col; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
	printf("********************\n");
}

//设置地雷
void MineSet(char mine[ROWS][COLS], int row, int col)
{
	int count = 0;
	while (count < EASY_COUNT)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count++;
		}
	}
}


//统计该点附近雷的个数
int MineCount(char mine[ROWS][COLS],int x,int y )
{
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = x - 1; i <= x + 1; i++)
	{
		for (j = y - 1; j <= y + 1; j++)
		{
			count =count + (mine[i][j] - '0');
		}
	}
	return count;
}

//如果附近没有雷,直接展开
void BlankExpansion(char mine[ROWS][COLS],char show[ROWS][COLS],int x,int y)
{
	int i = 0;
	int j = 0;
	int count = MineCount(mine, x, y);
	if (count == 0)
	{
		show[x][y] = ' ';
		for (i = x - 1; i <= x + 1; i++)
		{
			for (j = y - 1; j <= y + 1; j++)
			{
				if (show[i][j] == '*')
				{
					BlankExpansion(mine, show, i, j);
				}
			}
		}
	}
	else
	{
		show[x][y] = count + '0';
	}

}

//统计剩余‘*’的个数
int LeftCount(char show[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = 1; i <= row; i++)
	{
		for (j = 1; j <= col; j++)
		{
			if (show[i][j] == '*')
				count++;
		}
	}
	return count;
}

//扫雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{
	int count = row * col;
	int x = 0;
	int y = 0;
	while (count > EASY_COUNT)
	{	
		printf("请输入坐标:> ");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("好可惜,你被雷炸死了\n");
				PrintBoard(mine, ROW, COL);
				break;
			}
			else
			{
				BlankExpansion(mine, show, x, y);
				count = LeftCount(show, ROW, COL);
				PrintBoard(show, ROW, COL);
				printf("剩余未知点数: %d\n", count);
			}
		}
		else
		{
			printf("输入坐标错误,请重新输入\n");
		}
	}

	if (count == EASY_COUNT)
	{
		printf("恭喜你,你赢了!\n");
	}
	
}
                      //主体游戏部分

3. 详细讲解

3.1 菜单部分

打开游戏程序,第一步是展示菜单,提醒玩家进行选择,菜单与代码如下:
在这里插入图片描述


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

根据玩家的选择,进入不同的程序当中,当玩家选择 1 的时候,进入游戏程序,当玩家选择 0 的时候,结束游戏。考虑到玩家玩游戏不可能只是玩一次,因而需要在开头加入一个循环部分。代码实现如下:


int main()
{
	srand((unsigned int)time(NULL));//生成随机数
	int input=0;
	do
	{
		menu();
		printf("请输入你的选择:> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("< 请注意,本轮一共有%d颗雷 >\n", EASY_COUNT);
			game();
			break;
		case 0:
			printf("游戏结束\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (input);
	
	return 0;
}

3.2 游戏主体部分

3.2.1 总体分析

扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要⼀定的数据结构来存储这些信息。
因为我们需要在 9 * 9 的棋盘上布置雷的信息和排查雷,我们⾸先想到的就是创建⼀个 9 * 9 的数组来存放信息。

在这里插入图片描述
那如果这个位置布置雷,我们就存放1,没有布置雷就存放0.

在这里插入图片描述
假设我们排查 ( 2 , 5 ) 这个坐标时,我们访问周围的⼀圈 8 个⻩⾊位置,统计周围雷的个数是 1.
假设我们排查 ( 8 , 6 ) 这个坐标时,我们访问周围的⼀圈 8 个⻩⾊位置,统计周围雷的个数时,最下⾯的三个坐标就会越界,为了防⽌越界,我们在设计的时候,给数组扩⼤⼀圈,雷还是布置在中间的 9 * 9的坐标上,周围⼀圈不去布置雷就⾏,这样就解决了越界的问题。所以我们将存放数据的数组创建成 11 * 11 是⽐较合适。
在这里插入图片描述
在这里插入图片描述

我们在棋盘上布置了雷,棋盘上雷的信息(1)和⾮雷的信息(0),假设我们排查了某⼀个位置后,这个坐标处不是雷,这个坐标的周围有1个雷,那我们需要将排查出的雷的数量信息记录存储,并打印出来,作为排雷的重要参考信息的。那这个雷的个数信息存放在哪⾥呢?如果存放在布置雷的数组中,这样雷的信息和雷的个数信息就可能或产⽣混淆和打印上的困难。
这⾥我们肯定有办法解决,⽐如:雷和⾮雷的信息不要使⽤数字,使⽤某些字符就⾏,这样就避免冲突了,但是这样做棋盘上有雷和⾮雷的信息,还有排查出的雷的个数信息,就⽐较混杂,不够⽅便。
这⾥我们采⽤另外⼀种⽅案,我们专⻔给⼀个棋盘(对应⼀个数组mine)存放布置好的雷的信息,再给另外⼀个棋盘(对应另外⼀个数组show)存放排查出的雷的信息。这样就互不⼲扰了,把雷布置到
mine数组,在mine数组中排查雷,排查出的数据存放在show数组,并且打印show数组的信息给后期排查参考。
同时为了保持神秘,show数组开始时初始化为字符’*‘,为了保持两个数组的类型⼀致,可以使⽤同⼀套函数处理,mine数组最开始也初始化为字符’0’,布置雷改成’1’。如下如:

在这里插入图片描述
mine数组布置雷后的状态

在这里插入图片描述
show输出初始化的状态

对应的数组应该是:

char mine[11][11] = {0};//⽤来存放布置好的雷的信息 

char show[11][11] = {0};//⽤来存放排查出的雷的个数信息 

为方便代码管理,将文件内容分为以下三个方面

test.c //⽂件中写游戏的测试逻辑  
game.c //⽂件中写游戏中函数的实现等 
game.h //⽂件中写游戏需要的数据类型和函数声明等 

为了方便后期对难易程度的修正,可以将行和列的信息用宏的方式进行修正,如下所示:

//棋盘长宽
#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

//地雷个数
#define EASY_COUNT 10
 
//修改后的数组
char show[ROWS][COLS];//  '*'
char mine[ROWS][COLS];//  '数字'

3.2.2 棋盘初始化

在布雷之前,需要将两个棋盘进行初始化。为了后面再计数的时候不影响判断,此时应该将 ROWS 与 COLS 传入函数当中。为了使初始化函数的能对两个数组都起作用,因而还要将要初始化的字符传进去。代码如下:


void InitBoard(char arr[ROWS][COLS], int rows, int cols, char ch)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < ROWS; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			arr[i][j] = ch;
		}
	}
}

3.2.3 棋盘展示

初始化之后,需要写一个棋盘显示函数来显示棋盘的初始化结果以及后面不同结果的展示,代码如下:


void PrintBoard(char arr[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("********************\n");
	for (i = 0; i <= row; i++)
	{
		printf("%d_", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d|", i );
		for (j = 1; j <= col; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
	printf("********************\n");
}

此处需要注意,传入数组的时候,要把整体 11 * 11 的数一起传进去,目的使方便后面对整体把控,但是在进行显示的时候,只需要显示 9 * 9 的范围即可,第一行和最后一行只是我们为了方便之后对地雷的统计而加进去的,给玩家展时的界面里面不应该存在第一行与最后一行的内容

3.2.4 设置地雷

在 mine 数组里面随机放置预选设置EASY_COUBT好的地雷数目,即EASY_COUBT代表的数。使用随机数生成函数生成随机坐标,mine 数组里面这个坐标的符号如果是 ’ 0 ’ ,则将 ’ 1 ’ 放入里面,用 count 进行计数,使布置的地雷数小于EASY_COUBT代表的数。代码如下:

void MineSet(char mine[ROWS][COLS], int row, int col)
{
	int count = 0;
	while (count < EASY_COUNT)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count++;
		}
	}
}

在这里应该注意,布置地雷的时候,数组同样是将全部传递过来,但是进行布雷操作的时候,只对 1 ~ 9 行数组进行操作,对剩下的两组不做任何操作。此外,因为 rand() % row 的结果是 0 ~ 8 之间的数,需要在此基础上加一,才能保证其只对 1 ~ 9 进行操作。

3.2.5 扫雷阶段

玩家随意输入一个坐标,先进行判断其是否在棋盘之内,如果不是,则提醒其重新输入,如果是,则要判断该点是否的是雷,如果是,则直接结束游戏,如果不是,则要将其附近的雷的个数统计出来。

3.2.6 统计雷个数的代码

int MineCount(char mine[ROWS][COLS],int x,int y )
{
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = x - 1; i <= x + 1; i++)
	{
		for (j = y - 1; j <= y + 1; j++)
		{
			count =count + (mine[i][j] - '0');
		}
	}
	return count;
}

如果统计的个数为非零,则直接在 show 数组相应的坐标上直接显示附近雷的个数,如下图:
在这里插入图片描述
如果为零,则要对其附近的点进行架空处理,即在 show 数组上把其附近全部为零的坐标全部变为空格,直至附近的数全部显示为非零值,如下图:
在这里插入图片描述

3.2.7 使用迭代的方式进行展开:

当玩家输入的坐标附近的雷统计数为零的时候,对该坐标附近的八个坐标都要进行判断其附近是否为零,如果不为零,直接显示其附近雷的个数,如果为零,又要调用该函数对其附近的八个坐标进行判断,一直往复循环,直至附近的坐标全部为非零数。代码如下:

void BlankExpansion(char mine[ROWS][COLS],char show[ROWS][COLS],int x,int y)
{
	int i = 0;
	int j = 0;
	int count = MineCount(mine, x, y);
	if (count == 0)
	{
		show[x][y] = ' ';
		for (i = x - 1; i <= x + 1; i++)
		{
			for (j = y - 1; j <= y + 1; j++)
			{
				if (show[i][j] == '*')
				{
					BlankExpansion(mine, show, i, j);
				}
			}
		}
	}
	else
	{
		show[x][y] = count + '0';
	}

}

3.2.8 扫雷部分主体代码

void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{
	int count = row * col;
	int x = 0;
	int y = 0;
	while (count > EASY_COUNT)
	{	
		printf("请输入坐标:> ");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("好可惜,你被雷炸死了\n");
				PrintBoard(mine, ROW, COL);
				break;
			}
			else
			{
				BlankExpansion(mine, show, x, y);
				count = LeftCount(show, ROW, COL);
				PrintBoard(show, ROW, COL);
				printf("剩余未知点数: %d\n", count);
			}
		}
		else
		{
			printf("输入坐标错误,请重新输入\n");
		}
	}

	if (count == EASY_COUNT)
	{
		printf("恭喜你,你赢了!\n");
	}
	
}

4. 总结

在进行传参数的时候,一定要紧记,传数组时,要将整个数组全部传过去,但是对数组进行操作的时候,只对 1 ~ 9 行进行操作,因为玩家所能看到的展示界面只有 1 ~ 9 行,唯独初始化的时候是要对整个数组进行操作。

以上就是小编要分享的内容,如果有不对的地方,欢迎大家在留言区讨论。

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

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

相关文章

SpringBoot(源码解析 + 实现底层机制)

文章目录 1.搭建SpringBoot底层机制开发环境1.创建maven项目2.使用Git管理项目&#xff08;可以略过&#xff09;1.创建一个github存储库2.克隆到本地&#xff0c;复制文件夹的内容3.粘贴到idea项目文件夹&#xff0c;将其作为本地仓库与远程仓库关联 3.pom.xml 引入父工程和场…

【算法积累】辗转相除法

【算法积累】辗转相除法&#xff0c;python实现两种 辗转相除法&#xff08;又称欧几里得算法&#xff09;减法&#xff08;不常用&#xff09;代码实现执行结果 辗转相除法代码实现执行结果 辗转相除法&#xff08;又称欧几里得算法&#xff09; 又称欧几里得算法&#xff0c…

使用Python将多个pdf指定页整合到一个pdf文件中

在工作的一些场景中&#xff0c;有时需要我们将多个pdf文件中的内容提取出来&#xff0c;比如有10个pdf文件&#xff0c;我们要统一打印pdf文件的第一页或者最后一页… 需求分析 我们需要批量提取PDF文件中的任意一页&#xff0c;可以是第一页也可以是中间某一页&#xff0c;…

【C++算法模板】图的存储-邻接矩阵

文章目录 邻接矩阵洛谷3643 图的存储 邻接矩阵 邻接矩阵相比于上一篇博客邻接表的讲解要简单得多 数据结构&#xff0c;如果将二维数组 g g g 定义为全局变量&#xff0c;那默认初始化应该为 0 0 0 &#xff0c;如果题目中存在自环&#xff0c;可以做特判&#xff0c; m e …

微信小程序云开发教程——墨刀原型工具入门(常用组件)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

docker+elasticsearch

一&#xff0c;环境准备&#xff1a;安装docker&#xff08;往期文章&#xff09; 二&#xff0c;elasticsearch简介&#xff1a; 用于储存数据 三&#xff0c;部署&#xff1a; 1&#xff09;&#xff0c;拉取镜像 使用本作者提供的java17镜像 2&#xff09;&#xff0c;…

基于大模型的Agent进行测试评估的3种方案

本文首发于博客 基于大模型的Agent进行测试评估的3种方案 我们都知道当前基于大模型构建的 Agent 能力极不稳定&#xff0c;而今年我司产品又在规划接入 Agent 能力&#xff0c;所以在引入之前&#xff0c;需要先设计一套测试框架&#xff0c;来看看各种场景下容错率是否能达…

Linux 基本命令

文章目录 1.echo2.cd3.find4.mkdir5.cp6.rm7.wc8.tar9.tail10.vim11.grep12.sed13 touch14 ls15 快捷键16 ln17 mv18 useradd19 usermod20 su 每天一个Linux命令 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 1.echo 中文 (Chinese): “回声” 或 “输…

分布式链路追踪(一)SkyWalking(2)使用

一、使用方法 1、简介 agent探针可以让我们不修改代码的情况下&#xff0c;对Java应用上使用到的组件进行动态监控&#xff0c;获取运行数据发送到OAP上进行统计和存储。agent探针在Java使用中是使用Java agent技术实现。不需要更改任何代码&#xff0c;Java agent会通过虚拟…

Linux虚拟机安装Qt步骤记录

(一&#xff09;安装命令&#xff0c;按照网上的教程&#xff0c;亲测可行 在终端中依次输入以下命令&#xff0c; 1.更新软件源列表&#xff1a; sudo apt-get update 2.安装Qt开发工具包,windows上我用的是Qt6,根据网上也是初次在Linux上安装Qt,安装版本5应该问题不大&…

智慧农业新篇章:DSSAT模型、APSIM模型、WOFOST与PCSE模型综合应用,引领作物生长模拟与产量预测新潮流

目录 ★WOFOST模型与PCSE模型应用 ★基于R语言APSIM模型进阶应用与参数优化、批量模拟 ★最新DSSAT作物模型建模方法及应用 ★基于Python语言快速批量运行DSSAT模型及交叉融合、扩展应用 ★R语言与作物模型&#xff08;以DSSAT模型为例&#xff09;融合应用 ★遥感数据与…

论文阅读——VSA

VSA: Learning Varied-Size Window Attention in Vision Transformers 方法&#xff1a; 给定输入特征X&#xff0c;VSA首先按照基线方法的例程&#xff0c;将这些标记划分为几个窗口Xw&#xff0c;窗口大小为预定义的w。我们将这些窗口称为默认窗口&#xff0c;并从默认窗口中…

KMP算法——解决字符串匹配问题

一般来说在你没学过KMP算法前&#xff0c;你解决字符串匹配问题会采用BF算法——BF算法&#xff0c;即暴力(Brute Force)算法&#xff0c;是普通的模式匹配算法&#xff0c;BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配&#xff0c;若相等&#xff0c;…

BM1684X搭建sophon c++环境

1:首先安装编译好sophon-sail 比特大陆BM1684X开发环境搭建--SOC mode-CSDN博客 2:在将之前配置的soc-sdk拷贝一份到sdk根目录&#xff0c;将交叉编译好的sail中的build_soc拷贝至soc-sdk文件夹内&#xff1b; cp -rf build_soc/sophon-sail/inlcude soc-sdk cp -rf build_soc…

YOLOv8独家改进:backbone改进 | TransXNet:聚合全局和局部信息的全新CNN-Transformer视觉主干| CVPR2024

💡💡💡本文独家改进:CVPR2024 TransXNet助力检测,代替YOLOv8 Backbone 改进结构图如下: 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm=1001.2014.3001.5482 💡💡💡全网独家首发创新(原创),适合paper !!! 💡…

突发:日本火箭发射后爆炸

综合路透社、法新社13日消息&#xff0c;现场直播画面显示&#xff0c;日本初创公司Space One火箭发射失败&#xff0c;在半空中发生爆炸。 ▲日媒视频报道截图 据共同社此前介绍&#xff0c;Space One公司11日宣布&#xff0c;13日上午11点零1分将从日本首个民用火箭发射场“…

数据集成平台选型建议

一 数据集成介绍 数据集成平台是一种用于管理和协调数据流动的软件工具或服务。它的主要目标是将来自多个不同数据源的数据整合到一个统一的、易于访问和分析的数据存储库中。这些数据源可以包括数据库、云应用、传感器、日志文件、社交媒体等等。数据集成平台的关键任务是确保…

代码随想录算法训练营第五九天 | 下一个更大元素II、接雨水

目录 下一个更大元素II接雨水 LeetCode 503.下一个更大元素II LeetCode 42. 接雨水 下一个更大元素II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一…

《Ubuntu20.04环境下的ROS进阶学习2》

一、使用rviz和gazebo实时仿真 本节我们将使用三维可视化工具rviz&#xff08;The Robot Visualization Tool&#xff09;来实时观测gazebo仿真中的激光雷达数据。 二、打开仿真gazebo项目 如果您已经按照 《Ubuntu20.04环境下的ROS进阶学习0》-CSDN博客 如果您已经按照上次的文…

C++作业day2

封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() #include <iostre…