第 7 章 单机连连看
public static List<BufferedImage> randomImages(List<BufferedImage> sourceImages) {
//创建一个随机数生成器
Random random = new Random();
//创建一个存放数字的集合
List<Integer> numbers = new ArrayList<Integer>();
//获取一个集合, 里面是一些被打乱的数字
for (int i = 0; i < sourceImages.size(); i++) {
//随机创建一个数字,范围是 0 到参数 sourceImage 的 size, 包括 0 不包括 size
Integer temp = random.nextInt(sourceImages.size());
//为了确保数字没有重复,如果该数字已经在存放数字的集合中,重新再获取一次数字
if (!numbers.contains(temp)) {
//存放数字的集合中没有该随机数,添加集合中
numbers.add(temp);
} else {
//该数字已经存在于集合中,i - 1 执行循环
i--; continue;
}
}
//创建一个结果集合
List<BufferedImage> result = new ArrayList<BufferedImage>();
//对源图片集合进行遍历
for (int i = 0; i < sourceImages.size(); i++) {
//从数字集合中获取已经被打乱的索引,源图片集合获取这个索引的值
result.add(sourceImages.get(numbers.get(i)));
}
return result;
}
我们在这里先完成了一个工具类用于处理图片,那么在创建游戏区域的时候,我们可以不用在
GameService 这个逻辑类里面实现图片读取和随机打乱的功能,只需要调用这一个工具类就可以达到
同种图片为双数,并随机打乱图片的功能。
7.3.6 创建游戏区域图片数组
在画游戏区域之前,我们必须要为游戏区域数组进行赋值,将游戏区域看作一个二维数组,那么
这个数组的每个值的变化,将会影响到游戏区域的展现,因此这个二维数组对我们的游戏尤为重要。
我们现在为 GameService 接口提供一个 start 方法,用于执行游戏开始时的一些动作,例如初始化
游戏区域,重新计时,重新计分等,当玩家点击了开始时,我们就要调用这个 start 方法开始游戏,我
们可以为开始按钮创建鼠标监听器。当然,我们这里先讲创建游戏区域,GameServiceImpl 代码如下。
代码清单:code\linkgame\src\org\crazyit\linkgame\service\impl\GameServiceImpl.java
public void start() {
//创建一个有 100 个方块的游戏区域
this.pieces = new Piece[10][10];
//获取游戏图片,数量为 Piece 数组一维的长度乘以二维的长度
List<BufferedImage> playImages = ImageUtil.getPlayImages(new File("images/pieces"), 10 * 10);
//拿第一张图片的宽,由于之前约定每张图片的大小必须一致,只拿一张即可
int imageWidth = playImages.get(0).getWidth();
//拿第一张图片的高
int imageHeight = playImages.get(0).getHeight();