Java实现人物拼图游戏│附代码

Original 清华计算机学堂 清华计算机学堂 Yesterday

收录于话题

#数据库

7个

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

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游戏成功的效果

05

源代码下载

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

06

参考书籍

《从Java到Android游戏编程开发》

ISBN:9787302557876

刘卫光 夏敏捷 编著

定价:99.8 元

内容简介

本书是一本面向广大编程爱好者的游戏设计类图书。本书从最基本的Java面向对象设计,图形开发开始,对游戏的原理及其Java程序实现进行了详细介绍,包括动画的实现、音效的处理、鼠标和键盘事件的处理。本书最后4章在前面基础上讲解Android游戏图形界面开发,介绍Java如何开发Andriod手机游戏。

扫码京东优惠购书

配套资源

本书提供教学课件、程序源码,扫描封底的“课件下载”二维码,在公众号“书圈”可以下载教学课件,扫描每章章首的二维码可以下载本章的程序源码。

07

Java实现人物拼图游戏相关推荐

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

    拼图游戏指将一幅图片分割成若干拼块,并随机打乱顺序,当将所有拼块都放回原位置时就完成了拼图(游戏结束). 01 游戏介绍 在游戏中,拼块以随机顺序排列,网格上有一个位置是空的.完成拼图的方法是利用这个 ...

  2. python自动拼图_Python图像处理——人物拼图游戏

    开发工具:pycharm 游戏介绍: 拼图游戏将一幅图片分割咸若干拼块并将它们随机打乱顺序,当将所有拼块都放回原位置时,就完成了拼图(游戏结束).本人物拼图游戏为3行3列,拼块以随机顺序排列,玩家用鼠 ...

  3. python制作图片拼图游戏下载_Python图像处理——人物拼图游戏

    游戏介绍: 拼图游戏将一幅图片分割咸若干拼块并将它们随机打乱顺序,当将所有拼块都放回原位置时,就完成了拼图(游戏结束).本人物拼图游戏为3行3列,拼块以随机顺序排列,玩家用鼠标单击空白块四周的交换它们 ...

  4. Java实现小拼图游戏

    今天整理之前的项目,发现了在大二上学期的java课程设计中编写的智能拼图小游戏,觉得有意思,所以打算写篇文章和大伙分享分享. 一.项目功能 1)本游戏是一个Java语言的拼图游戏,有一个格子是空的,其 ...

  5. html 拼图游戏,HTML5人物拼图游戏

    7.1  人物拼图游戏介绍 拼图游戏将一幅图片分割成若干拼块并将它们随机打乱顺序.当将所有拼块都放回原位置时,就完成了拼图(游戏结束). 在"游戏"中,单击滑块选择游戏难易,&qu ...

  6. java基础实现拼图游戏

    大家在初学java的时候,大部分的代码都是在控制台上运行的.可能大家辛辛苦苦写了几十行代码,最终就只是在控制台输出一个字符,这个时候,心里肯定是拔凉拔凉的,心中那一朵编程的火花,就马上给扑灭了.我们都 ...

  7. java编写九宫格拼图游戏_九宫格拼图游戏

    九宫格拼图游戏设计文档 一.综合设计目的.条件.任务和内容要求: 1.设计目的 <Windows程序设计>是计算机科学与技术专业本科生的一门学科基础课程.Windows程序以图形用户界面( ...

  8. HTML小游戏设计(1)- 人物拼图游戏

    游戏介绍:拼图游戏将一幅图片分隔成若干拼块并且随机打乱,需要移动拼块,最后还原图形. 程序设计思路:HTML5可以把图片整合到网页中,使用canvas元素可以在这个空白的画布填充线条.载入图片和设置动 ...

  9. 拼图java 源代码,Java语言实现拼图游戏源代码

    /* * JAVA小游戏-拼图 我做的第一个小游戏 * Cell类是继承的按钮类,并加上相应图形,形成方格 *MyCanvas是一个面板,加载Cell类的对象(方格),是这三个类中的核心 */ imp ...

最新文章

  1. SpringBoot介绍
  2. 【Linux 内核】实时调度类 ① ( 进程分类 | 实时进程、普通进程 | Linux 内核 SCHED_FIFO、SCHED_RR 调度策略 | 实时调度实体 sched_rt_entity )
  3. Java的知识点19——异常机制Exception
  4. python多线程信息提示
  5. 用户选购计算机可分为,助理电子商务师考试试题(1+答案)
  6. 使用Maven进行Selenium测试自动化
  7. mysql convert报错_部署mysql版本项目问题记录
  8. Chrome 浏览器 NET::ERR_SSL_OBSOLETE_VERSION 问题及解决方式
  9. 关于tomcat和jetty的乱码问题
  10. Selenium 凭什么成为 Web 自动化测试的首选?(内附源码)
  11. moosefs即将发布新版
  12. Application,Session,Cookie和ViewState等对象用法和区别
  13. python图书馆抢座_Python-Requests模拟登录-实现图书馆座位自动预约
  14. 手机论文查重软件哪个靠谱?
  15. 双臂Matlab仿真建模:正运动学
  16. 浏览器 实现复制粘贴 上传图片, js实现粘贴图片预览功能
  17. 服务器主板如何连接无线网卡,无线网卡如何设置WiFi共享模式?
  18. 在线使用ChatGPT,国内手机号也可以注册。
  19. kafka-eagle详细安装配置图文教程
  20. Java基础练习——读心术(扑克牌魔术——21张扑克牌)

热门文章

  1. 机器学习之sklearn-KNN近邻算法分类小案例(乳腺癌预测最优模型)
  2. 微信公众平台从入门到精通二
  3. 【数据挖掘】主成分分析Python实现
  4. IDEA文件出现java file out of source root解决方法
  5. php可以用中文的单引号吗,PHP中单双引号用法误区
  6. EXCEL2003版无法运行2007以上版本VBA程序
  7. 翻译:数据页面和数据行
  8. python函数介绍(20804字的带图超详细说明)
  9. windows用python读取文件open()函数
  10. autohotkey windows画板 Mspaint 快捷键