一、前言
在上一篇文章中讲述了如何添加图片,本文将实现将十六个格子中的小图片打乱的效果,并且会提到有关于二维数组的知识点
二、思路
在上文就提到了,这个看起来完整的大图片,实际上是十六张小图片按照一定顺序放在4×4的格子当中的,那么我们不妨 用一个二维数组来表示每一个格子
,每个格子内再放入不同的图片
;由于要求打乱图片,所以二维数组内的图片序号随机
,具体的思路如下
- 定义一个一维数组
tempArr
,存放0-15(图片编号)
int[] tempArr = {0,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
- 定义一个随机数,用来表示索引值(范围是0-15)
Random r = new Random();
- 遍历数组,让每个数都与随机索引所对应的数值交换
for (int i = 0; i < tempArr.length; i++) {
//随机生成索引值
int index = r.nextInt(tempArr.length);
//交换
int temp = tempArr[i];
tempArr[i] = tempArr[index];
tempArr[index] = temp;
}
- 创建一个二维数组
data[i][j]
来表示4×4的方格
int[][] data = new int[4][4];
- 定义一个索引,用来提取一维数组内的值
int tempIndex = 0;
- 遍历二维数组,为二维数组依次赋值为一维数组内的值
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
System.out.print(data[i][j] + " ");
}
//每行输出后要换行
System.out.println();
}
测试一下代码
三、改写GameJFrame类
1.注意事项
- 此处要注意,由于二维数组在打乱图片和加载图片中都会用到,所以我们把初始化二维数组的代码写在成员位置上
- 打乱图片界面要放在初始化界面前面,否则无法实现打乱效果
- 要用一个数去接收二维数组中的每个数(图片编号)
- 重新定义一个方法来实现打乱图片的效果
2.完整代码
private void initdata() {
//初始化一维数组
int[] tempArr = {0,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
//定义一个随机变量(索引)
Random r = new Random();
//遍历数组,将每个数与随机索引对应数值交换
for (int i = 0; i < tempArr.length; i++) {
int index = r.nextInt(tempArr.length);
int temp = tempArr[i];
tempArr[i] = tempArr[index];
tempArr[index] = temp;
}
//定义索引,用来提取一维数组中的数
int tempIndex = 0;
//遍历二维数组,填入数值
for (int i = 0; i < data.length; i++) {
//将每一行看作是一个一维数组,遍历一次
for (int j = 0; j < data[i].length; j++) {
data[i][j] = tempArr[tempIndex];
//遍历完成后提取一维数组中下一个值
tempIndex++;
}
}
}
private void initImage() {
for(int i = 0; i < 4; i++){
for(int j = 0; j < 4; j++){
int number = data[i][j];
JLabel jLabel = new JLabel(new ImageIcon("F:\\IDEA\\PuzzleGame\\image\\image\\animal\\animal3\\"+ number +".jpg"));
jLabel.setBounds(105 * j, 105 * i,105,105);
this.getContentPane().add(jLabel);
}
}
}
四、测试代码
五、结语
本文中的二维数组实现方法还有另外一种,感兴趣的读者可以自己思考一下,具体的方法会在下一篇文章的文末写出来以供参考