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

01

游戏介绍

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

▍图9.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):设置当按钮被按下时显示的图片。

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

程序运行结果如图9.2和图9.3所示。

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

▍图9.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

程序设计的步骤

项目组成如图9.4所示。

▍图9.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为空白图片。

▍图9.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)。

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

▍图9.6游戏成功的效果

关注微信公众号,后台回复关键词“Java人物拼图”即可获得完整源代码。

java编程如何算圆的面具,Java实现人物拼图游戏│附代码相关推荐

  1. Java实现人物拼图游戏

    Java实现人物拼图游戏│附代码 Original 清华计算机学堂 清华计算机学堂 Yesterday 收录于话题 #数据库 7个 拼图游戏指将一幅图片分割成若干拼块,并随机打乱顺序,当将所有拼块都放 ...

  2. java收费学java,讷河学java编程,讷河java编程学习的学校,讷河java编程学习一般怎么收费...

    讷河学java编程,讷河java编程学习的学校,讷河java编程学习一般怎么收费 首页 > 软件 > 讷河学java编程 作者:镀金池   发布时间:2019-02-20 07:00 Gr ...

  3. java编程思想企业版Enterprise Thingking in java

    java编程思想企业版Enterprise Thingking in java 文档默认是英文版本,但是这个文件是HTML文档,我们只需要把它拖进浏览器中就行了,然后用我们熟悉的谷歌翻译就可以搞定了. ...

  4. java 员工类算工资_用java设计一个员工类,可以计算工资个人所得税

    用java设计一个员工类,可以计算工资个人所得税 1. 背景 老师在课上布置了几道java编程题,此为其中之一 2. 题目内容 设计一个员工类.该员工具有下列私有属性:编号,姓名,基本工资,奖金  提 ...

  5. java编程能做什么_学习Java编程能做什么工作?

    Java作为编程语言界最时髦流行的元老之一,现今在软件市场上也是宠儿,被各大企业广泛应用到生产中.在各种行业.各个企业的业务管理平台,如门户网站等许多方面都占据了主导地位.吸引着越来越多学习Java的 ...

  6. java编程一般类抽象类的定义,Java编程基础抽象类

    本文主要是讲述Java编程基础-抽象类,更多Java技术知识,请登陆疯狂软件教育官网. 抽象类: 抽象:不具体,看不明白关键字abstract 抽象类的特点: 1.抽象方法只能定义在抽象类中,抽象类和 ...

  7. 质量不同的球java编程_荐非常经典的java编程题全集-共50题(1-10)...

    非常经典的java编程题 程序1:斐波那契数列问题 题目概述: 古典问题: 有一对兔子,从出生第三个月起每月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多 ...

  8. JAVA编程基础(四)开启Java语言编程之旅

    上一节单元测试的答案: 1. b 2. d 3. e 4. a 5. e 6. c 7. b 8. f 9. b 了解java对象的结构 更多精彩请阅读 东陆之滇的csdn博客:http://blog ...

  9. Java编程学习:初学者怎样学好Java

    零基础学生只要方法得当,完全可以掌握Java编程.这里也是我个人的学习经历下面总结出来的几点学习Java的方法,仅供大家参考. 1.理解Java思想 Java是一门面向对象编程语言.向对象编程是Jav ...

最新文章

  1. 一文图解机器学习的基本算法!
  2. 全球及中国矢量超导磁体行业“十四五”竞争状况及投资前景策略分析报告2021-2027年版
  3. java高级用法之:JNA类型映射应该注意的问题
  4. Windows下Qt5搭建Android开发环境笔记
  5. iis express8 自动关闭
  6. MySql 数据库基本设计规范
  7. 视频PPT互动问答丨数据库智能运维专题
  8. 计算机系统中处理的图片可分为,第五章图像处理.doc
  9. HDU2000 ASCII码排序【字符排序】
  10. Android APP
  11. 学习July博文总结——支持向量机(SVM)的深入理解(下)
  12. SDCard权限设置
  13. 螳螂科技接入百度“文心一言”,提升营销管理AI服务能力
  14. 出中的意思是什么_回归分析中的“回归”是什么意思?
  15. 嵌入式硬件入门——Flash Memory(W25Q64+SPI协议)
  16. DPABI详细使用教材——数据准备、预处理流程、数据分析流程
  17. Flutter 新闻客户端 - 09 详情页展示、分享、远程真机调试
  18. 动作手游实时PVP技术揭密(服务器篇)
  19. ThinkPHP的车辆租赁管理系统
  20. 负载,性能测试工具-Gatling

热门文章

  1. python 大智慧 dll 下单_大智慧闪电下单
  2. 小米电视刷android系统升级,小米盒子跳升安卓8.0系统:针对电视等大屏产品进一步优化...
  3. plot画图时纵轴字母加点(加速度z两点)
  4. crm系统是什么很棒ec实力_CRM系统好用的四个原因
  5. HTML5物理游戏开发 - 越野山地自行车(二)创建一辆可操控的自行车
  6. 3A信用等级证书有什么用
  7. MacOS Catalina 10.15.x ISO/CDR格式镜像 用于VMware等虚拟机
  8. 背锅王者“光明会”是如何炼成的?
  9. Executors线程池详解(全)
  10. Could not find method ndk() for arguments XXXXXXXXXXXXXXXXX解决方法