【c语言】五子棋(EasyX图形库+背景音乐)

大家好,有没有觉得写了好多c语言代码,面对的都是黑框框控制台,当我们学习了基础的c语言知识,和EasyX图形库后,终于可以和黑框框saygoodbye,今天要分享给大家的是小游戏五子棋,跟着小张一起学习吧


EasyX图形库安装

图形库链接

在这里插入图片描述
1.点击下载

在这里插入图片描述
2.安装你对应集成开发环境对应的安装包,我用的是vs2019

在这里插入图片描述
3.ok,我们使用库函数,加上头文件即可

棋盘的绘制

注意创建必须是.cpp,要不然图形库用不了

在这里插入图片描述棋盘大小我们搞成15*15的格子,每个格子长宽为30,每个棋子半径搞成13,棋盘格长450,宽450,为了防止边界下的棋子显示不完全,每个边在向外延申15,界面总大小为480×480
在这里插入图片描述

1.棋盘木板

initgraph(480, 480);//初始化一个窗口(窗口大小480*480);

此时窗口闪一下就消失了,尝试加一个while循环

#include<graphics.h>//包含图形库头文件
int main()
{
	initgraph(480, 480);
	while (1)
	{
	}


}

编译运行:在这里插入图片描述
这个并非控制台的黑框框

五子棋背景一般是棕色,我们需要自己画一个棕色背景图片贴上去,大小和界面大小480*480一样大请添加图片描述

IMAGE p;//定义一个图片变量
loadimage(&p, "./background.png", 480, 480);//加载图片函数,(参数1图片地址,参数2图片的位置,图片大小)

./为当前目录下,和.c文件放在一个目录下面
在这里插入图片描述

putimage(0, 0, &p);//贴图片到界面上去(参数1,2为图片从界面的哪个位置开始贴)

在这里插入图片描述

#include<graphics.h>//包含图形库头文件
IMAGE p;
int main()
{
	initgraph(480, 480);
	loadimage(&p, "./background.png", 480, 480);
	putimage(0, 0, &p);
	while (1)
	{
	}


}

在这里插入图片描述如果出现该问题,调试>属性>高级>字符集改为多字符集就行了

编译运行:在这里插入图片描述


2.开始画线

setlinecolor(BLACK);//设置线颜色的函数(黑线)
for (int x = 15; x < 480; x += 30)//循环画竖线
	{
		line(x, 15, x, 465);//画线函数,前两个参数为起始点x,y,后两个参数为终点x,y
	}
	for (int y= 15; y < 480; y+= 30)//循环画横线
	{
		line(15, y, 465,y);
	}
#include<graphics.h>//包含图形库头文件
IMAGE p;
int main()
{
	initgraph(480, 480);
	loadimage(&p, "./background.png", 480, 480);
	putimage(0, 0, &p);
	setlinecolor(BLACK);
	for (int x = 15; x < 480; x += 30)
	{
		line(x, 15, x, 465);
	}
	for (int y = 15; y < 480; y += 30)
	{
		line(15, y, 465, y);
	}
	while (1)
	{
	}


}

编译运行
在这里插入图片描述

3.专业棋盘好像有5个黑点点(圆)

在这里插入图片描述对应五个点的坐标

setfillcolor(BLACK);//设置圆的颜色
	fillcircle(15 + 3 * 30, 15 + 3 * 30, 3);前两个参数为圆的圆心坐标,第三个参数为圆的半径
	fillcircle(15 + 3 * 30, 15 + 11 * 30, 3);
	fillcircle(15 + 11 * 30, 15 + 3 * 30, 3);
	fillcircle(15 + 7 * 30, 15 + 7 * 30, 3);
	fillcircle(15 + 11 * 30, 15 + 11 * 30, 3);

编译运行
在这里插入图片描述

#include<graphics.h>//包含图形库头文件
IMAGE p;
int main()
{
	initgraph(480, 480);
	loadimage(&p, "./background.png", 480, 480);
	putimage(0, 0, &p);
	setlinecolor(BLACK);
	for (int x = 15; x < 480; x += 30)
	{
		line(x, 15, x, 465);
	}
	for (int y = 15; y < 480; y += 30)
	{
		line(15, y, 465, y);
	}
	setfillcolor(BLACK);
	fillcircle(15 + 3 * 30, 15 + 3 * 30, 3);
	fillcircle(15 + 3 * 30, 15 + 11 * 30, 3);
	fillcircle(15 + 11 * 30, 15 + 3 * 30, 3);
	fillcircle(15 + 7 * 30, 15 + 7 * 30, 3);
	fillcircle(15 + 11 * 30, 15 + 11 * 30, 3);
	while (1)
	{
	}


}

获取鼠标点击

ExMessage msg;//消息结构体变量
if (peekmessage(&msg, EX_MOUSE)) //偷瞄消息,第一个消息结构体地址,第二个参数,鼠标消息
		{
			switch (msg.message)   //鼠标消息
			{
			case WM_LBUTTONDOWN:                      //左键
				draw(msg.x, msg.y);//鼠标光标位置坐标
				break;
			
			}
		}

当鼠标左键按下时,将此时的鼠标在对应界面的坐标传递给draw函数,需要随时获取鼠标的消息,将上述代码放在循环里面

	while (1)
	{
		if (peekmessage(&msg, EX_MOUSE))              //偷瞄消息,第一个消息结构体地址,鼠标消息
		{
			switch (msg.message)                      //鼠标消息
			{
			case WM_LBUTTONDOWN:                      //左键
				draw(msg.x, msg.y);
				break;
			
			}
		}
		



	}

画棋子

将鼠标点击的坐标传到draw函数中来,定义一个全局变量num,判断是黑子,还是白子,num=1,黑子下,num=-1,白子下。

int num = 1;
void draw(int m, int n)
{
	if (num == -1)
	{
		setfillcolor(WHITE);//设置圆的填充色(白色)白棋
    }
	else if (num == 1)
	{
		setfillcolor(BLACK);//设置圆的填充色(黑色)黑棋
    }
    fillcircle(m - m % 30 + 15, n - n % 30 + 15, 13);//画圆,圆的x,y,半径,棋子的绘制
    num *= -1;//黑白棋轮着下,每次调用draw,改变num值,实现黑白黑白黑白


}

为什么棋子坐标是(m - m % 30 + 15, n - n % 30 + 15),因为鼠标不可能一点就是要下的坐标,只能鼠标点在某一个范围,就把该棋子落在离鼠标点的位置最近的位置,如果鼠标的坐标为48,48传给draw时,在这里插入图片描述
我们知道应该下在这个位置,经过处理后是45,45,刚好是要下的位置,避免棋子落在不该落的位置。

编译运行
在这里插入图片描述

解决棋子可以下在棋子上面的问题

在这里插入图片描述>在点一次黑色棋子被覆盖
我们可以定义一个二维数组,15*15,刚开始初始化为0,如果数组下标对应棋盘的地方有黑棋,把对应二维数组中的值放1,如果数组下标对应棋盘的地方有白棋,把对应二维数组中的值放-1;如果鼠标点击的位置有棋子的话,直接return掉,不进行绘制棋子

二维数组的初始化:

int arr[15][15];//全局变量好操作
void initboard()
{
	for (int i = 0; i < 15; i++)
	{
		for (int j = 0; j < 15; j++)
		{
			arr[i][j] = 0;//循环初始化二维数组
       }
       }
}
int full(int x, int y)
{
	if (arr[x][y] != 0)//如果不等于0,表示下过棋了return 0;
		return 0;
	else//如果等于0,表示没下过棋了,将该数组对应位置放num,return 1;
		arr[x][y] = num;
	     return 1;
}
void draw(int m,int n)
{
	if (num == -1)
	{       setfillcolor(WHITE);
	         
			
		
	}
	else if (num == 1)
	{       setfillcolor(BLACK);
			
		
	}
	
	
	int x;
	int y;y
	x = m / 30;//二维数组横坐标,m鼠标横坐标,如果m=48,x就是1,
	y = n / 30;//二维数组纵坐标n鼠标纵坐标,如果n=48,y就是1,
	if (full(x,y) == 0)//等于0表示下过棋了,直接return;跳出draw,如果=1,跳过这个条件判断语句,开始下棋
		return;


	fillcircle(m - m % 30 + 15, n - n % 30 + 15, 13);//下棋

	num *= -1;


}


此时不能下下过的位置

判断输赢

int check_over()
{
	for (int i = 0; i < 15; i++)
	{
		for (int j = 0; j < 15; j++)
		{
			if (arr[i][j] == 0)
				continue;
			if (check_five(i, j) == 1)
			{
				q = arr[i][j];
				return 1;
			}




		}


	}

}

因为二维数组记录了下棋的状况,对应位置为1则是黑棋,-1为白棋,0是未下,循环遍历每个数组元素,先是找到下过棋的位置,没下过棋的位置直接跳过,因为我们是通过这个函数将下过棋的坐标传给
check_five(int x, int y),然后根据下x,y坐标相邻的五个是否一样,如果没下的话直接跳过,防止五个相邻位置没下棋都是0,进入check_five(int x, int y),五个0也是一样,然后游戏就结束了

int check_five(int x, int y)
{//检查一个下过棋的坐标相邻五个是否一样
	
	if (arr[x][y] == arr[x - 1][y] && arr[x][y] == arr[x - 2][y] && arr[x][y] == arr[x + 1][y] && arr[x][y] == arr[x + 2][y])//横行判断
		return 1;
	if (arr[x][y] == arr[x][y-1] && arr[x][y] == arr[x][y-2] && arr[x][y] == arr[x][y+1] && arr[x][y] == arr[x][y+2])//纵行判断
		return 1;
	if (arr[x][y] == arr[x - 1][y-1] && arr[x][y] == arr[x - 2][y-2] && arr[x][y] == arr[x + 1][y+1] && arr[x][y] == arr[x + 2][y+2])以该坐标为中心,主对角线判断
		return 1;
	if (arr[x][y] == arr[x - 1][y+1] && arr[x][y] == arr[x+2][y-2] && arr[x][y] == arr[x + 1][y-1] && arr[x][y] == arr[x-2][y+2])以该坐标为中心,副对角线判断
		return 1;
//相同则返回1
//不同返回0
	
	return 0;
}

在check_over()中如果check_five(i, j) 返回一,则有五个连成,将该坐标对应二维数组中的值保存在q全局变量中,然后check_over()返回1

if (check_over() == 1)
		{
			outtextxy(180, 180, "游戏结束");//输出文字,参数一参数二为文字左上角坐标,参数三为文字内容
			//change();//消息盒子函数,提示谁赢了
			system("pause");//退出程序,头文件windows.h

		}

在调用之前必须

	settextstyle(40, 20, "隶书");//设置字体高度,宽度,字体的格式
	setbkmode(TRANSPARENT);//字体后面设置透明,背景模式

编译运行
在这里插入图片描述

提示输赢

void change()//消息盒子函数,提示谁赢了
{

	HWND hnd = GetHWnd();  //获取窗口句柄(相当于窗口的指针)
	SetWindowText(hnd, "五子棋"); //设置窗口标题
	int isok;
				if(q==1)//q获取的是赢家对应二维数组的消息,黑子为1											//
	       isok = MessageBox(NULL, "黑子胜", "提示", MB_OKCANCEL); //弹出消息盒子,提示用户操作
			else if(q==-1)
				isok = MessageBox(NULL, "白子胜", "提示", MB_OKCANCEL);
			

	if (IDOK== isok)                                             //返回点了哪里
	{                                                            //点了ok
		
	}
	else if (IDCANCEL == isok)                               //点了取消
	{
		
		

	}
}

编译运行
在这里插入图片描述
在这里插入图片描述

背景音乐函数

这里可以去看动态通讯录那一篇,加音乐有具体步骤

#include<graphics.h>//包含图形库头文件
#include<mmsystem.h>//包含多媒体设备接口头文件

#pragma comment(lib,"winmm.lib")//加载静态库
void bgm()
{    //打开音乐
	mciSendString("open ./music.MP3", 0, 0, 0);//后面参数不用管
	//播放音乐
	mciSendString("play ./music.MP3", 0, 0, 0);//后面参数不用管
}

整体代码展示


#include <windows.h>
#include<graphics.h>//包含图形库头文件
#include<mmsystem.h>//包含多媒体设备接口头文件

#pragma comment(lib,"winmm.lib")//加载静态库
IMAGE p;
int num = 1;
int q;
int arr[15][15];
void change()
{

	HWND hnd = GetHWnd();                                             //获取窗口句柄(相当于窗口的指针)
	SetWindowText(hnd, "五子棋"); 
	int isok;//设置窗口标题
				if(q==1)											//
	       isok = MessageBox(NULL, "黑子胜", "提示", MB_OKCANCEL); //弹出消息盒子,提示用户操作
			else if(q==-1)
				isok = MessageBox(NULL, "白子胜", "提示", MB_OKCANCEL);
			

	if (IDOK== isok)                                             //返回点了哪里
	{                                                            //点了ok
		
	}
	else if (IDCANCEL == isok)                               //点了取消
	{
		
		

	}
}
void bgm()
{    //打开音乐
	mciSendString("open ./music.MP3", 0, 0, 0);//后面参数不用管
	//播放音乐
	mciSendString("play ./music.MP3", 0, 0, 0);//后面参数不用管
}
void initboard()
{
	for (int i = 0; i < 15; i++)
	{
		for (int j = 0; j < 15; j++)
		{
			arr[i][j] = 0;




		}



	}
}
int full(int x, int y)
{
	if (arr[x][y] != 0)
		return 0;
	else
		arr[x][y] = num;
	     return 1;
}
void draw(int m,int n)
{
	if (num == -1)
	{       setfillcolor(WHITE);
	         
			
		
	}
	else if (num == 1)
	{       setfillcolor(BLACK);
			
		
	}
	
	
	int x;
	int y;
	x = m / 30;
	y = n / 30;
	if (full(x,y) == 0)
		return;


	fillcircle(m - m % 30 + 15, n - n % 30 + 15, 13);

	num *= -1;


}
int check_five(int x, int y)
{
	//if (x < 2 || y < 2 || x>12 || y>12)
		//return 0;
	if (arr[x][y] == arr[x - 1][y] && arr[x][y] == arr[x - 2][y] && arr[x][y] == arr[x + 1][y] && arr[x][y] == arr[x + 2][y])
		return 1;
	if (arr[x][y] == arr[x][y-1] && arr[x][y] == arr[x][y-2] && arr[x][y] == arr[x][y+1] && arr[x][y] == arr[x][y+2])
		return 1;
	if (arr[x][y] == arr[x - 1][y-1] && arr[x][y] == arr[x - 2][y-2] && arr[x][y] == arr[x + 1][y+1] && arr[x][y] == arr[x + 2][y+2])
		return 1;
	if (arr[x][y] == arr[x - 1][y+1] && arr[x][y] == arr[x+2][y-2] && arr[x][y] == arr[x + 1][y-1] && arr[x][y] == arr[x-2][y+2])
		return 1;

	
	return 0;
}
int check_over()
{
	for (int i = 0; i < 15; i++)
	{
		for (int j = 0; j < 15; j++)
		{
			if (arr[i][j] == 0)
				continue;
			if (check_five(i, j) == 1)
			{
				q = arr[i][j];
				return 1;
			}




		}


	}

}
int main()
{
	bgm();
	ExMessage msg;
	
	initgraph(480, 480);
	loadimage(&p,"./background.png",480,480);
	putimage(0, 0, &p);
	setlinecolor(BLACK);
	for (int x = 15; x < 480; x += 30)
	{
		line(x, 15, x, 465);
	}
	for (int y= 15; y < 480; y+= 30)
	{
		line(15, y, 465,y);
	}
	setfillcolor(BLACK);
	fillcircle(15 + 3 * 30, 15 + 3 * 30, 3);
	fillcircle(15 + 3 * 30, 15 + 11 * 30, 3);
	fillcircle(15 + 11 * 30, 15 + 3 * 30, 3);
	fillcircle(15 + 7 * 30, 15 + 7 * 30, 3);
	fillcircle(15 + 11 * 30, 15 + 11 * 30, 3);
	settextstyle(40, 20, "隶书");
	setbkmode(TRANSPARENT);
	





	while (1)
	{
		if (peekmessage(&msg, EX_MOUSE))              //偷瞄消息,第一个消息结构体地址,鼠标消息
		{
			switch (msg.message)                      //鼠标消息
			{
			case WM_LBUTTONDOWN:                      //左键
				draw(msg.x, msg.y);
				break;
			
			}
		}
		if (check_over() == 1)
		{
			outtextxy(180, 180, "游戏结束");
			change();
			system("pause");

		}



	}
}

效果展示

20230821_194813

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

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

相关文章

仓库管理的重点在哪?仓库管理能有哪些软件?

对于做实体生意的中小商户来说&#xff0c;仓库管理工作是重中之重的&#xff0c;仓库管理的好坏&#xff0c;直接影响着门店销售和财务状况。 但对于很多中小商户来说&#xff0c;没有足够的人力和精力去高效地做好仓库管理工作&#xff0c;而借助仓库管理软件或进销存软件来…

Vue轻量级富文本编辑器-Vue-Quill-Editor

效果图&#xff1a; 下载Vue-Quill-Editor npm install vue-quill-editor --save 下载quill&#xff08;Vue-Quill-Editor需要依赖&#xff09; npm install quill --save vue项目中使用代码 <template><div class"edit_container"><quill-edito…

vector(介绍)

目录 1.vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vector 增删查改 1.2.5 vector 迭代器失效问题。&#xff08;重点&#xff09; 2.vector深度剖析及模拟实现 2.1 使用…

FL Studio21.1中文完整版Win/Mac

FL Studio All Plugins Edition【中文完整版 Win/Mac】适合音乐制作人/工作室使用&#xff0c;全套插件!&#xff08;20.9新增Vintage Chorus&#xff0c;Pitch Shifter变调插件&#xff09;FL Studio是超多顶级音乐人的启蒙首选&#xff01;包括百大DJ冠军Martin Garrix&…

指针(一)【C语言进阶版】

大家好&#xff0c;我是深鱼~ 【前言】&#xff1a; 指针的主题&#xff0c;在初阶指针章节已经接触过了&#xff0c;我们知道了指针的概念&#xff1a; 1.指针就是个变量&#xff0c;用来存放地址&#xff0c;地址的唯一标识一块内存空间&#xff08;指针变量&#xff09;&a…

微信怎么添加更多的好友?通过后还能自动打招呼?

近期好多客户来问想把抖音、淘宝等平台的客户引流到自己的微信号里&#xff0c;打造自己的私域流量池&#xff0c;有什么办法能快捷地批量自动添加客户好友的微信呢&#xff1f;怎么规避加太多频繁的问题呢&#xff1f; 今天&#xff0c;我们来一一解决&#xff0c;都知道加好…

Shell 脚本常用命令

Shell 脚本常用命令 一.日志打印1.信息打印效果2.占位符打印效果 二.文件检索1.文件夹查找2.文件名称3.文件内容检索 三.字符串处理1.字符串截取2.字符串长度获取3.字符串判断4.数字判断5.数字运算 四.日期获取五.文件遍历1.遍历获取修改时间和MD52.Find 查找 六.循环重试1.Whi…

机器学习:什么是分类/回归/聚类/降维/决策

目录 学习模式分为三大类&#xff1a;监督&#xff0c;无监督&#xff0c;强化学习 监督学习基本问题 分类问题 回归问题 无监督学习基本问题 聚类问题 降维问题 强化学习基本问题 决策问题 如何选择合适的算法 我们将涵盖目前「五大」最常见机器学习任务&#xff1a…

Java面向对象——多态、Object类、instanceof关键字以及final关键字

多态的概念 1.多态是指同一个方法调用可以在不同的对象上有不同的表现&#xff0c;即同一种方法调用方式适用于不同的数据类型。 编译时和运行时&#xff1a;编译时期调用的是父类中的方法&#xff0c;但运行时期会根据实际的对象类型来调用适当的方法。这种行为称为动态绑定&…

【已解决】记 Vue3+SpringBoot 前后端分离项目部署时的一次跨域问题

问题背景是在一次部署开发环境时&#xff0c;由于是前后端分离项目&#xff08;前端Vue3&#xff0c;后端SpringBoot&#xff09;&#xff0c;SpringBoot 使用 Docker 部署&#xff0c;前端访问服务接口时出现跨域问题。 不知道什么是跨域问题的小伙伴可以查看另一篇文章&…

Redis中的缓存穿透、雪崩、击穿的原因以及解决方案

一&#xff0c;什么是缓存穿透、雪崩、击穿&#xff1f; 1、缓存穿透&#xff1a; 是指用户查询数据&#xff0c;在数据库没有&#xff0c;自然在缓存中也不会有。这样就导致用户查询的时候&#xff0c;在缓存中找不到&#xff0c;每次都要去数据库再查询一遍&#xff0c;然后…

CSS 选择器

前言 基础选择器 以下是几种常见的基础选择器。 标签选择器&#xff1a;通过HTML标签名称选择元素。 例如&#xff1a; p {color: red; } 上述样式规则将选择所有<p>标签 &#xff0c;并将其文字颜色设置为红色。 类选择器&#xff1a;通过类名选择元素。使用类选择…

docker cURL error 6: Could not resolve host

场景&#xff1a; 微信小程序 获取 用户 openpid&#xff0c;在此之前&#xff0c;我需要先 "获取稳定版接口调用凭据"&#xff0c;根据手册提示的&#xff0c;要先调用 https://api.weixin.qq.com/cgi-bin/stable_token 我这边就开始了请求&#xff0c;结果返回了…

函数性能探测:更简单高效的 Serverless 规格选型方案

作者&#xff1a;拂衣、丛霄 2019 年 Berkeley 预测 Serverless 将取代 Serverful 计算成为云计算新范式。Serverless 为应用开发提供了一种全新系统架构。借助 2023 年由 OpenAI 所带来的 AIGC 风潮&#xff0c;以阿里云函数计算 FC、AWS Lambda 为代表的 Serverless 以其更高…

Flink的常用算子以及实例

1.map 特性&#xff1a;接收一个数据&#xff0c;经过处理之后&#xff0c;就返回一个数据 1.1. 源码分析 我们来看看map的源码 map需要接收一个MapFunction<T,R>的对象&#xff0c;其中泛型T表示传入的数据类型&#xff0c;R表示经过处理之后输出的数据类型我们继续往…

在ARM服务器上一键安装Proxmox VE(以在Oracle Cloud VPS上为例)(甲骨文)

前言 如题&#xff0c;具体用到的说明文档如下 virt.spiritlhl.net 具体流程 首先是按照说明&#xff0c;先得看看自己的服务器符不符合安装 Proxmox VE的条件 https://virt.spiritlhl.net/guide/pve_precheck.html#%E5%90%84%E7%A7%8D%E8%A6%81%E6%B1%82 有提到硬件和软…

Redis缓存问题(穿透, 击穿, 雪崩, 污染, 一致性)

目录 1.什么是Redis缓存问题&#xff1f; 2.缓存穿透 3.缓存击穿 4.缓存雪崩 5.缓存污染&#xff08;或满了&#xff09; 5.1 最大缓存设置多大 5.2 缓存淘汰策略 6.数据库和缓存一致性 6.1 4种相关模式 6.2 方案&#xff1a;队列重试机制 6.3 方案&#xff1a;异步更新缓…

基于YOLOV8模型的西红柿目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOV8模型的西红柿目标检测系统可用于日常生活中检测与定位西红柿目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…

day20 飞机大战射击游戏

有飞行物类 飞行 爆炸 的连环画&#xff0c; 飞行的背景图 &#xff0c; 子弹图&#xff0c; 还有游戏开始 暂停 结束 的画面图。 设计一个飞机大战的小游戏&#xff0c; 玩家用鼠标操作hero飞行机&#xff0c; 射出子弹杀死敌机&#xff0c;小蜜蜂。 敌机可以获得分数&…

浅谈java自定义中类两个对象的比较

目录 实现比较两个对象是否相同 1.前置代码 1.学生类 2.示例 3.输出 4.原因 2.那么我们要怎么做呢? 1.对Student类中重新实现quals方法(即对equals方法重写) 2.完整代码如下: 3.具体操作 4.演示 1.示例 2.输出 3.原因 实现比较两个对象的大小 第一种: 用…