第 7 章 单机连连看
注:以上两个属性,同样加到 Piece 对象的构造器中。
7.3.4 创建游戏处理类
新建一个 GameService 的接口,用于定义游戏逻辑的接口方法,再为这个接口新增一个实现类
GameServiceImpl,将 GameService 接口设置到 GamePanel 这个视图组件中,这们就可以达到逻辑
与视图分离了。
代码清单:code\linkgame\src\org\crazyit\linkgame\service\GameService.java
public interface GameService {
//定义一个接口方法, 用于返回一个二维数组
Piece[][] getPieces();
}
以后我们需要实现某些游戏逻辑,可以在这个接口里面定义方法,并由 GameServiceImpl 去实现
了。这样可以简化视图的代码,也遵循了单一职责的原则。现在我们为 GamePanel 类加入一个
GameService 的属性,并为它的构造器中加入设置 GameService 的代码,用于设置 GameService,
使得在 GamePanel 中可以拿到 GameService 对象,代码如下。
代码清单:code\linkgame\src\org\crazyit\linkgame\view\GamePanel.java
private GameService gameService;
public GamePanel(GameService gameService) {
//省略其他设值的代码
}
现在,我们可以去修改 GamePanel 中的 paint 方法,代表游戏区域的二维数组 Piece[][]的创建与
变 化 , 我 们 可 以 放 到 GameService 的 实 现 类 中 去 , 在 GameService 中 提 供 一 些 接 口 方 法 ,
GamePanel 通过这些方法去获取二维数组,而如何去创建,设置这个二维组数里面的值,GamePanel
不再需要去理会这些过程。如果 GamePanel 类的 paint 方法中可以这样得到 Piece 数组。
代码清单:code\linkgame\src\org\crazyit\linkgame\view\GamePanel.java
public void paint(Graphics g) {
//使用 GameService 来获取 Piece[][]二维数组
Piece[][] pieces = gameService.getPieces();
}
7.3.5 图片的读取
连连看的游戏区域中分布着图片,如果要初始化游戏区域,我们必须将这些图片读取,放到我们
的二维数组中。这一小节,将介绍怎样去随机读取图片,将图片的顺序打乱等。在读取图片之前,我
们先要明白连连看的游戏规则,点击两张相同的图片并符合一定的规则才能消除,换言之,随便点击
一张图片,必有另外一张图片等待着与它相连,也就是在游戏区域中任何一类图片的个数都是双数。
如果为单数的话,游戏将不能结束了。
首先我们必须准备好游戏中所需要的图片,本例中准备了 23 张内容不同的图片用于作为图片方块。
注:这 23 张图片的长和宽必须一样,使界面好看,也符合连连看的规则。
接下来,我们去创建用于读取图片和处理图片的 ImageUtil 工具类,在为这个工具类添加方法前,
我们必须要明确这个类的作用,读取或者处理图片的一些公共方法可以放到这里,做成静态方法给外
部使用。现在我们新建一个读取图片的方法,读取某个文件夹下面的符合后缀的图片,我们把方块的
图片独立放到一个文件夹,再使用程序读取它们,并封装成一个集合返回,实现代码如下。
代码清单:code\linkgame\src\org\crazyit\linkgame\utils\ImageUtil.java
//用于获取某个文件夹下面的所有图片