第25章 案例1:拼图游戏.
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
25.2 素材准备
拼图游戏所需的素材比较简单,仅为需要拼接的图片,如图 25-1所示,大小为400*300(单位像素),拆分的小图片 大小为100*100像素。对于图25-1中被拆分的小图,不需 要另外准备,在内存中对图片进行截取和拆分即可。
25.3 算法设计
要实现本游戏上述功能,关键考虑如下几个问题:如何加载 和拆分图片、如何实现图片的随机排列、如何在程序中实 现图片的移动。这实际上是算法的设计问题。本节简要分 析一下拼图游戏的算法设计和实现。
接着创建一个窗体类,该类继承自JFrame类,为程序的主 窗体类。然后在该类中声明拼图按钮所在面板和显示参考 图片的面板对象、菜单栏对象等。编写该类的构造器,在 构造器中调用相应的方法,完成图像的加载和拆分、创建 显示图像的按钮,并设置窗体在屏幕中显示的位置。
25.4.3 加载和拆分图像
在PuzzleGame类中编写一个实现图像加载的方法 loadImage(),其返回类型为BufferedImage对象。在构 造器中调用此方法加载图像并赋给实例变量image。
25.4.1 自定义按钮类设计:ImageButton类
首先创建一个ImageButton类,该类继承自JButton类,为 该类增加两个属性row和col,都是整型变量,用来保存 该按钮对象所在的行和列。同时,为这两个属性增加读取 和设置的get和set方法。
25.4.2 游戏界面布局:构造窗体类 PuzzleGame
25.3.3 实现图片的移动
在游戏操作中,通过单击与空白网格相信的网格,就可以将 该网格中显示的图片移动,那么就可以用一个按钮代表一 个网格,然后让每个按钮显示一个小图片,最后将这些按 钮添加到一个面板中,面板采用GridLayout网格布局, 就可以实现如图所示的效果了。关键的要解决的是,如何 实现单击图片按钮以后图片的移动。
拼图游戏是很常见而且很受欢迎的一种小游戏。所谓拼图游 戏,是指将一个完整的图片分割成若干个规则的小图片, 然后将这些小图片随机地拼接在一起。玩家按照原图,通 过移动各个图片,最后重新拼接出正确的图片。
25.1.1 应用背景
拼图游戏是老少皆宜的一个小游戏。在工作和学习之余,可 以自己单独玩,也可以和家人一起玩,不但益智,而且可 以达到放松身心的目的。现在计划开发一单机版拼图游戏 ,使用java语言,可以双击独立运行。
25.4.6 创建菜单栏
在上面两步中,创建拼接图面板和显示参考图像的面板,并 添加到窗体的内容面板。然后,就要调用 createMenuBar()方法创建菜单栏,并调用 setJMenuBar()为窗体设置菜单栏。
25.4.7 实现按钮事件监听器类
在创建显示图片的按钮数组时,为每一个按钮都添加了事件 监听器。这里,需要创建按钮的事件监听器类 ImgButtomAction,这是PuzzleGame类的内部类,这 样做的好处是可以方便地在事件响应方法中布局窗体中的 按钮。
第25章 案例1:拼图游戏
通过前面的学习,读者已经基本掌握了Java程序设计语言的 语法基础、面向对象程序设计的概念及Swing图形界面程 序的编程。本章通过一个拼图游戏程序的开发案例,详细 讲解综合运用Swing组件和布局管理器进行程序界面布局 ,响应事件处理的方法,以及应用程序的开发思路。
25.1 软件简介
25.3.1 加载和拆分图片
将原始图片放在background目录下,使用 javax.imageio.ImageIO类的read()方法,加载图片到内 存中,保存到缓冲图像对象BufferedImage中。
25.3.2 实现图片的随机排列
在程序一开始,拆分过后的图像应该是随机排列的。随机排 列可以有两种方式:一是将图像顺序显示在按钮上,然后 随机布局按钮;二是先将图像的顺序随机打乱,然后按打 乱后的次序顺序显示在按键上。本案例中使用后一种方法 。
25.4.4 创建拼接图面板
接着,编写方法createCenterPane(),在这个方法中,创建 一个JPanel对象作为拼接图面板,并将其设置为 GridLayout布局。
25.4.5 创建显示参考图像的面板
为了玩家在玩游戏时随时有参考图像可供对比,需要在拼接 图面板的右边添加显示参考图像的面板。在本案例中,专 门自定义了一个类ModelPane,它继承自JPanel类。在 构造ModelPane时,传递进要显示的参考图像参数。
25.1.2 功能介绍
拼图游戏界面的效果如图所示。 在图右边的小图片是供玩家 参考的原图。左边带网格的 大图片为初始打乱的拼接图 ,每一个小网格都是一个小 图片,在开始游戏时这些小 图片是杂乱无章的,如图所 示,在图中有一个网格是空 白的,玩家可以通过单击与 其相临的网格,即位于其上 、下、左、右的4个网格, 将被单击网格中显示的小图 片移动到空白网格中,然后 被单击的网格将变为空白, 经过这样反复地移动,要求 最终将图左边所示的图片重 新拼接成图右边所示原始效 果图。
25.3.4 参考图像的缩放
在图中,右边的参考原始图像,是在内存中经过对原始图像 的缩放以后,由JLabel标签对象显示的。要实现图像的 缩放功能,利用java.awt.geom包中的AffineTransform 类。
2பைடு நூலகம்.4 开发步骤
解决了游戏程序的主要算法问题,下面就来实现拼图游戏。 具体的实现步骤如下。 自定义按钮类设计:创建能保存自身位置信息的自定义的按 钮类ImageButton。 游戏主窗体设计:构造窗体类PuzzleGame。 菜单栏设计:构造菜单栏,并实现事件响应功能。 监听器设计:创建游戏事件监听器,实现游戏功能。 显示参考图形的设计:创建自定义面板组件类ModelPane 。
25.4.8 设置窗体在屏幕中出现的位置
在PuzzleGame类布局的最后,在构造器中需要设置窗体出 现的位置,使其运行起来更符合用户的习惯。这里,将窗 体设置为出现在屏幕的中央。
25.4.9 编写main方法
布局和事件响应代码都已经实现了,最后一步,就是编写 main()方法,创建PuzzleGame类的实例了。