Java高手速成 | 实现人物拼图游戏

news2024/11/19 8:32:05

 

拼图游戏指将一幅图片分割成若干拼块,并随机打乱顺序,当将所有拼块都放回原位置时就完成了拼图(游戏结束)。

01、游戏介绍

在游戏中,拼块以随机顺序排列,网格上有一个位置是空的。完成拼图的方法是利用这个空位置移动拼块,玩家通过单击空位置周围的拼块来交换它们的位置,直到所有拼块都回到原位置。拼图游戏的运行界面如图1所示。

▍图1拼图游戏的运行界面

02、程序设计的思路

在游戏中动态生成一个3×3的图片按钮数组cells。将图片woman.jpg分割成行、列数均为3的小图片,并按顺序编号;每个图片按钮显示一幅小图片,其位置成员place存储0~8的数,代表正确的位置编号。注意,最后一个图片按钮显示的是空白信息图片“9.jpg”,而位置成员place存储8。

在游戏开始时,随机打乱图片按钮数组cells,根据玩家的单击来交换图片按钮数组cells对应按钮与空白图片按钮的位置,通过判断图片按钮数组cells中所有元素的位置成员place是否有序来判断是否已经完成游戏。

03、关键技术

1、按钮显示图片的实现

Swing中的按钮可以显示图片(图像)。

JButton中显示图片的构造方法为

JButton(Icon icon),用来在按钮上显示图片。

JButton类的方法设置不同状态下按钮显示的图片。

  • setIcon(Icon defaultIcon):用来设置按钮在默认状态下显示的图片。
  • setRolloverIcon(Icon rolloverIcon):设置当鼠标指针移动到按钮上方时显示的图片。
  • setPressedIcon(Icon pressedIcon):设置当按钮被按下时显示的图片。

下面是一个控制鼠标指针移动到按钮上方及按钮被按下时显示不同图片的示例。

 程序运行结果如图2和图3所示。    

▍图2按钮被按下去时显示的图片

▍图3鼠标滚动时显示的图片

2、图片按钮移动的实现

当图片按钮移动后,按钮的坐标发生改变,此操作通过setLocation()方法实现。setLocation()方法是从Component类继承的,其定义如下:

public void.setLocation(int x,int y)

其中,参数x是当前组件的左上角在父级坐标空间中新位置的x坐标,参数y是当前组件的左上角在父级坐标空间中新位置的y坐标。

3、从BufferedImage转化成ImageIcon

BufferedImage类是java.awt.Image的子类,在image的基础上增加了缓存功能。

ImageIcon类是一个Icon接口的实现,它根据Image绘制Icon,可使用URL、文件名或字节数组创建的图像。

从BufferedImage转化成ImageIcon只需要使用“ImageIcon im=new ImageIcon(BufferedImage实例)”。

另外,使用ImageIcon的Image getImage()方法返回此图标的Image。

04、程序设计的步骤

项目组成如图4所示。

 

▍图4项目组成

1、设计单元图片类

创建名称为Cell的类,用于封装一个单元图片对象,此类继承JButton对象,并对JButton按钮组件进行重写,其代码如下:

 

2、创建枚举类型

在项目中创建一个名称为Direction的枚举类型,用于定义图片移动的4个方向。

3、设计游戏面板类

在项目中创建一个名称为GamePanel的类,此类继承JPanel类,实现MouseListener接口,用于创建游戏面板对象。在GamePanel类中定义长度为9个单元的图片数组对象cells,并通过init()方法对所有单元图片对象进行实例化。

 

构造方法GamePanel()调用init()对所有单元图片对象进行实例化。在对单元图片对象进行实例化时可以直接用分割好的图片1.jpg~9.jpg(如图9.5所示)实现,其中9.jpg为空白图片。

▍图5拼图所用图片

单元图片对象直接用现成的分割好的图片进行实例化,代码如下:

当然也可以不用现成的分割好的图片,使用BufferedImage类的getSubimage()方法可以将一个大的图片woman.jpg任意分割成子图像。

在使用时先得到一幅原图片的长和宽,根据要求分块,算出每块的x、y坐标,这样就可以分割了。注意,分割出来的是BufferedImage对象,而按钮的图片需要ImageIcon类型,从BufferedImage转化成ImageIcon只需要使用ImageIcon im=new ImageIcon(BufferedImage对象)。

 

random()对图片进行随机排序,产生两个随机数 m、n(0~8)作为被交换图片按钮数组 元素的下标,对调这两个被交换图片按钮的位置。

在图片块单击事件中,通过e.getSource()获取触发事件的对象cell,与空白图片块cellBlank的位置进行比较,从而决定被单击对象cell和空白图片块cellBlank的移动方向。

isSuccess()判断游戏是否成功,只需要判断图片块的原始位置cells[i].getPlace()是否符合现在的位置,只要有一个单元图片的位置不正确就返回false,所有单元图片的位置都正确时返回true。

 

4、设计主窗口类

在项目中创建一个继承JFrame的MainFrame类,用于显示自定义游戏面板(GamePanel)。

 拼图游戏的总体设计情况如上,并没有很高深的内容,实现的核心在于对按钮数组的操作。拼图游戏成功的效果如图6所示。

 ▍图6游戏成功的效果

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

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

相关文章

服务搭建常见问题

怎么将myeclipse项目部署到tomcat服务器 https://www.laike.net/article-162-238315-0.html eclipse提示错误:save could not be completed Dynamic Web Module 4.0 requires Java 1.8 or newer. https://blog.csdn.net/xixihaha_coder/article/details/118345378 …

微星 MPG B460I GAMING EDGE WIFI +i5-10400电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板微星 MPG B460I GAMING EDGE WIFI (MS-7C86)(LPC Controller B460芯片组)处理器英特尔 Core i5-10400 2.90GHz 六核已驱动内存16 GB ( 芝奇 DDR4 2666MHz 8GB x 2 )已驱动硬盘朗科科技 NVMe SSD 480GB (480 GB / 固态硬盘)已驱动显…

React学习笔记:实用又好用的Hooks函数

React框架以前是采用Class类编程,在类编程中使用生命周期比较方便,但是随着迭代更新,官方开始推荐使用函数式编程,但是函数式编程就没有状态这一个概念,于是乎官方就定义了一系列钩子函数来弥补在这一缺陷,…

Rabbitmq(七) -- rabbitmq的工作模式

1. 简单模式:无需交换机 消息产生消息,将消息放入队列消息的消费者(consumer) 监听 消息队列,如果队列中有消息,就消费掉,消息被拿走后,自动从队列中删除(隐患 消息可能没有被消费者正确处理,已经从队列中消失了,造成消息的丢失,这里可以设置…

VTK-数据集vtkUnstructuredGrid

前言:本博文主要介绍vtkUnstructuredGrid的特点、结构组成,vtkUnstructuredGrid的创建方法,及其vtkUnstructuredGrid相关的接口及示例。 特点 非结构化网格数据,是最常见的数据集类型,它的拓扑结构和几何结构都是非结…

Pycharm调试功能介绍

文章目录pycharm中的debug模式debug的断点调试pycharm中的debug模式 在pycharm中,一共有4中方法开启debug调试,如下: 点击导航栏的run >> debug 双击打开py文件 >> 右上角点击小虫子图标。 写好if name ‘main’: >> 点…

React 类组件你不知道的细节+案例

React基础-组件-类组件 1.组件概述 目标:了解React组件的作用和创建组件的方式 什么是组件组件的设计思想 1.what is 组件啊? 在前端开发中组件就是用户界面当中一块独立的区域,在组件内部会包含这块区域中的视图代码,样式代码以及逻辑代码 React是采用…

Cadence PCB仿真使用Allegro PCB SI配置差分对的方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,配置方法3,总结1,概述 本文简单介绍使用Allegro PCB SI配置差分对的方法。 2,配置方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是Allegro PCB SI则可这样切换 执行Fil…

天下苦“个人公众号认证”久矣,吾闻今可

大家好,我是小悟 一看到个人公众号可以认证,便以迅雷不及掩耳之势准备资料,一顿操作猛如虎后,我的号终于认证啦。 看到别人的个人公众号有认证的,这两天我就在想要怎么才能认证,于是就去搜索相关的内容&am…

电子采购系统的优势是什么 常用的电子采购系统介绍

采购是企业发展中的重要环节之一。在企业采购流程中,并不是简单的完成买和卖就行了,这其中还会涉及到各个方面。例如,在企业采购活动中,常常会遇到供应商数据维护难,采购成本把控难,供应商筛选难等问题。而…

面对集中式缓存实现上的挑战,Redis交出的是何种答卷?聊聊Redis在分布式方面的能力设计

大家好,又见面了。 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。 在本专栏前面的文章中,我们介绍了各种本地缓存框…

数据结构与算法1—线性表

1. 线性表的定义 线性表L是n(n≥0)个具有相同属性的数据元素a1,a2,a3,…,an组成的有限序列,其中序列中元素的个数n称为线性表的长度。当n0时称为空表,即不含有任何元素。常常将非空…

express接口

文章目录什么是接口创建 API 路由模块编写 GET 接口编写 POST 接口完整代码CORS 跨域资源共享使用 CORS 中间件解决跨域问题实现 JSONP 接口什么是接口 API (Application Programming Interface,应用程序编程接口 ) 是一些预先定义的函数,目的是提供应用…

TCP/IP 网络模型有哪几层

备注:本文参考小林coding相关内容,侵权请联系作者删除 1.应用层 最上层的,也是我们能直接接触到的就是应用层(Application Layer),我们电脑或手机使用的应用软件都是在应用层实现。那么,当两个…

高并发系统设计 -- 登录系统设计

同源策略 同源策略是一种安全策略。是游览器最核心最基本的安全功能。防止XSS,CSFR等攻击具体表现是游览器在执行脚本之前,会判断脚本是否与打开的网页是同源的,也就是协议,域名,端口是否都相同,相同就是同…

记录--前端性能监控初步实战

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 在当下前后端分离的主流环境下,前端部分的优化变得越来越重要。为了提升前端的性能和用户体验,我觉得可能需要从三个维度采集数据进行分析。 前端埋点。通过埋点收集和统计…

SCRM与CRM的区别

当私域流量的概念兴起时,企业直接触达用户的场景也越来越丰富,SCRM形式的私域运营已然成为很多企业数字化转型布局的关键阵地。 前言 当私域流量的概念兴起时,企业直接触达用户的场景也越来越丰富,SCRM形式的私域运营已然成为很多…

服务器部署所有前后端分离项目

1、Linux服务器安装好jdk、mysql、redis、node 2、拉取最新代码 gitee仓库项目地址:https://gitee.com/y_project/RuoYi-Vue 拉取代码到本地 3、修改后端配置 3.1、修改系统内上传文件位置的配置: 默认是windows系统的配置,将此配置修改…

JMeter接口测试使用教程哪里有?

JMeter接口测试使用教程哪里有?接口测试是测试工程师的必备技能之一,运用JMeter工具一步步实现接口请求,数据参数化,断言等操作,通过常见的企业实际测试场景详解JMeter各项技术使用,最后结合Jenkins持续集成…

Django搭建个人博客Blog-Day01

创建虚拟环境虚拟环境相当于一个抽屉,在这个抽屉里面安装的任何软件,都不会影响到其他抽屉,所以利用虚拟环境就可以做到同时安装不同版本的第三方库,而互不影响。使用虚拟环境的目的是为了防止一些第三方库出现版本不兼容问题&…