更多Java全套学习资源均在专栏,持续更新中↑↑戳进去领取~
🍅2022年全新Java学习路线图,含源码+笔记,另附在职提升课
🍅跟我20天学Java:01-计算机基础以及JDK、IDEA等安装详解
🍅跟我20天学Java:02-自动类型转换,表达式的自动类型转换,强制类型转换
🍅跟我20天学Java:03-6个案例手把手带你学循环结构
更多内容加急更新,从安装开始学起来👼
文章目录
1,游戏优化
1.1添加背景色
为了让游戏的整个界面更好看一点,所以在添加完15张数字图片之后,还得加一个背景色。
背景色也是一张较大的图片,在资料文件中image里面,名字为:background.png。
可以右键点击属性,看到该图片宽高为:484,450。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9oopXO7F-1646823659207)(img\background.png)]
1.1.1实现步骤:
1,创建ImageIcon对象,并制定图片位置。
2,创建JLabel对象,并把ImageIcon对象放到小括号中。
3,利用JLabel对象设置大小,宽高。
4,将JLabel对象添加到整个界面当中。
代码实现:
ImageIcon background = new ImageIcon("image\\background.png");
JLabel backgroundJlabel = new JLabel(background);
backgroundJlabel.setBounds(26, 30, 450, 484);
注意事项:
在之前添加1-15数字图片的时候,我们是从左上角的点依次添加的。
但是为了能跟背景色匹配起来。我们要对1-15数字图片做一些偏移,让他们都在背景色的黑色
最终代码:
JLabel jLabel1 = new JLabel(new ImageIcon("image\\1.png"));
jLabel1.setBounds(0 + 50, 0 + 90, 100, 100);
this.add(jLabel1);
JLabel jLabel2 = new JLabel(new ImageIcon("image\\2.png"));
jLabel2.setBounds(100 + 50, 0 + 90, 100, 100);
this.add(jLabel2);
JLabel jLabel3 = new JLabel(new ImageIcon("image\\3.png"));
jLabel3.setBounds(200+ 50, 0 + 90, 100, 100);
this.add(jLabel3);
JLabel jLabel4 = new JLabel(new ImageIcon("image\\4.png"));
jLabel4.setBounds(300+ 50, 0+ 90, 100, 100);
this.add(jLabel4);
JLabel jLabel5 = new JLabel(new ImageIcon("image\\5.png"));
jLabel5.setBounds(0+ 50, 100+ 90, 100, 100);
this.add(jLabel5);
JLabel jLabel6 = new JLabel(new ImageIcon("image\\6.png"));
jLabel6.setBounds(100+ 50, 100+ 90, 100, 100);
this.add(jLabel6);
JLabel jLabel7 = new JLabel(new ImageIcon("image\\7.png"));
jLabel7.setBounds(200+ 50, 100+ 90, 100, 100);
this.add(jLabel7);
JLabel jLabel8 = new JLabel(new ImageIcon("image\\8.png"));
jLabel8.setBounds(300+ 50, 100+ 90, 100, 100);
this.add(jLabel8);
......//重复上面的代码,继续添加其他图片。
JLabel background = new JLabel(new ImageIcon("image/background.png"));
background.setBounds(26,30,450,484);
this.add(background);
1.2抽取代码
我们在写代码的时候,如果代码比较多,会把相同功能的代码,抽取出来,放在一个独立的方法里面,这样以后的阅读代码的时候,不会显得乱糟糟的,要想看什么功能的代码,直接到对应的方法中就可以了。
但是我们现在把所有的代码都写在构造方法当中,会让代码非常的难以阅读,所以我们要进行抽取。
此时在构造方法当中,总体可以分为三部分:
//第一部分:初始化界面的代码
......
//第二部分:初始化菜单的代码
......
//第三部分:初始化1-15数字图片的代码
......
那现在我们就要把分别写三个方法,装着三段代码。而在构造方法中,直接调用就可以了。
这样会提高代码的阅读性和后期的维护性。
维护性的简单理解:当我们要修改代码的时候,可以很方便快捷的找到代码。
代码示例:
//构造方法
public MyJFrame() {
//初始化界面
initFrame();
//初始化菜单
initMenu();
//初始化图片
initImage();
//让当前窗体可展示出来。
this.setVisible(true);
}
//初始化界面的方法
public void initFrame() {
//把当前窗体的宽高进行了设置
this.setSize(514, 595);
//把当前窗体的标题进行了设置
this.setTitle("石头迷阵单机版 V1.0");
//把当前窗体的关闭模式进行了设置
this.setDefaultCloseOperation(3);
//让当前窗体可以到屏幕的正中央
this.setLocationRelativeTo(null);
//让当前窗体可以置顶。
this.setAlwaysOnTop(true);
//让界面添加键盘监听
this.addKeyListener(this);
//取消内部居中放置方式
this.setLayout(null);
}
//初始化菜单的方法
public void initMenu() {
//创建一个菜单对象
JMenuBar jMenuBar = new JMenuBar();
//设置菜单的宽高
jMenuBar.setSize(514, 20);
//创建一个选项
JMenu jMenu = new JMenu("功能");
//创建一个条目
jMenuItem = new JMenuItem("重新游戏");
//把条目添加到选项当中
jMenu.add(jMenuItem);
//把选项添加到菜单当中
jMenuBar.add(jMenu);
//把菜单添加到最外层的窗体当中
this.setJMenuBar(jMenuBar);
}
public void initImage() {
JLabel jLabel1 = new JLabel(new ImageIcon("image\\1.png"));
jLabel1.setBounds(0 + 50, 0 + 90, 100, 100);
this.add(jLabel1);
JLabel jLabel2 = new JLabel(new ImageIcon("image\\2.png"));
jLabel2.setBounds(100 + 50, 0 + 90, 100, 100);
this.add(jLabel2);
JLabel jLabel3 = new JLabel(new ImageIcon("image\\3.png"));
jLabel3.setBounds(200+ 50, 0 + 90, 100, 100);
this.add(jLabel3);
JLabel jLabel4 = new JLabel(new ImageIcon("image\\4.png"));
jLabel4.setBounds(300+ 50, 0+ 90, 100, 100);
this.add(jLabel4);
JLabel jLabel5 = new JLabel(new ImageIcon("image\\5.png"));
jLabel5.setBounds(0+ 50, 100+ 90, 100, 100);
this.add(jLabel5);
JLabel jLabel6 = new JLabel(new ImageIcon("image\\6.png"));
jLabel6.setBounds(100+ 50, 100+ 90, 100, 100);
this.add(jLabel6);
JLabel jLabel7 = new JLabel(new ImageIcon("image\\7.png"));
jLabel7.setBounds(200+ 50, 100+ 90, 100, 100);
this.add(jLabel7);
JLabel jLabel8 = new JLabel(new ImageIcon("image\\8.png"));
jLabel8.setBounds(300+ 50, 100+ 90, 100, 100);
this.add(jLabel8);
......//重复上面的代码,继续添加其他图片。
JLabel background = new JLabel(new ImageIcon("image/background.png"));
background.setBounds(26,30,450,484);
this.add(background);
}
1.3循环
为什么要学习循环?因为在刚刚的代码当中,每一个图片都要创建一个ImageIcon,然后再创建一个JLabel,要把这几行代码,重复的写15遍。才能添加15张图片。非常的麻烦。如果我们一直采取这么复杂的方法,那添加100张图片,这得多少代码?
好几百行啊!
在以后,类似这种需要重复执行的代码,我们就可以使用循环。循环可以重复的执行同样的事情。如果有了循环,我们就可以节约大量的代码。但是在循环中,涉及到了几个小知识点,是需要我们提前学习的。
1.3.1比较运算符
比较运算符,其实就是拿着左边跟右边进行比较。其中包括:等等,大于,大于等于,小于,小于等于
- 如果满足条件,结果就是true,就表示正确的意思。
- 如果不满足条件,结果就是false。就表示错误的意思。
符号 | 说明 |
---|---|
== | a==b,判断a和b的值是否相等,成立为true,不成立为false |
> | a>b,判断a是否大于b,成立为true,不成立为false |
>= | a>=b,判断a是否大于等于b,成立为true,不成立为false |
< | a<b,判断a是否小于b,成立为true,不成立为false |
<= | a<=b,判断a是否小于等于b,成立为true,不成立为false |
代码示例:
int a = 10;
int b = 20;
//10 > 20 ? 错误
System.out.println(a > b);
//10 < 20 ? 正确
System.out.println(a < b);
1.3.2自增运算符
自增运算符是对变量进行的操作,就是把变量里面的值+1。
符号 | 作用 | 说明 |
---|---|---|
++ | 自增 | 变量的值加1 |
代码示例:
int c = 10;
c++;//把变量c里面的值 + 1
System.out.println(c);
int d = 1;
//把变量里面的值+1 d = 2
d++;
//把变量里面的值+1 d = 3
d++;
System.out.println(d);//3
1.3.3循环的格式
循环:重复的做一件事情。
格式:
for (初始化语句;条件判断语句;条件控制语句) {
循环体语句;
}
1.3.4执行流程
首先执行初始化语句,然后执行条件判断语句。
如果条件判断语句结果为真,则进入循环体执行。再执行条件控制语句。回到条件判断语句继续重复这个过程。
如果条件判断语句结果为假,则直接结束循环。
如果大家觉得这个过程有点绕,也没有关系。看下面的代码,简单理解循环。
for(int i = 1; i <= 4; i++){
重复执行的代码
}
int i = 1.就理解为循环的起始条件。
i<=4就理解为循环的结束条件。
i++就理解为每次循环结束后,i做了什么事情。
因为我们要通过i来控制循环的次数。i++就是每次自增一个数。
既然起始为1,结束为4,那么循环的范围就是从1开始到4结束。一共将大括号中的代码重复执行4次。
1.3.5循环添加图片
既然循环可以帮我们简化代码书写,那么我们就用循环来改进一下。
改进之前,先看一下,重复的代码是什么?
翻阅代码之后,发现,重复的代码就是添加图片的代码。那么就把需要重复执行的代码当做循环体写在大括号中。
JLabel jLabel1 = new JLabel(new ImageIcon("image\\1.png"));
jLabel1.setBounds(0 + 50, 0 + 90, 100, 100);
this.add(jLabel1);
找到了循环体,我们还要继续找,这个代码需要重复执行多少次?
一共添加15张图片,所以重复执行15次。循环每次结束,变量+1。
现在,我们以第一排的前4张图片为例:
for(int i = 1; i <= 4 ; i++){
JLabel jLabel1 = new JLabel(new ImageIcon("image\\1.png"));
jLabel1.setBounds(0 + 50, 0 + 90, 100, 100);
this.add(jLabel1);
}
代码修改完,但是这样还不行,这样我们是重复添加了第一张图片,而且把这张图片都放在了左上角位置。
所以我们还要继续修改。
因为我们添加的是4张不同的图片,而且每张图片的位置也不一样。
那么要修改的地方有两个:
- 图片的路径
- 图片在游戏界面中的位置
修改代码如下:
for (int i = 1; i <= 4; i++) {
ImageIcon imageIcon = new ImageIcon("image\\1.png");
JLabel jLabel = new JLabel(imageIcon);
jLabel.setBounds((i-1) * 100 + 50, 0 + 90, 100, 100);
this.add(jLabel);
}
到目前为止,我们就可以把4张图片添加到界面当中了。
如果我们要添加15张,那么把上面的for循环,重复4遍就可以了。难度太高不推荐,我们下面有更好的办法。
2,打乱顺序
现在我们已经可以把1-15所有的数字图片都添加到界面当中了。但是此时添加进去顺序是乱的。我们还得把里面的顺序打乱,这样才可以开始玩游戏。
添加前 打乱顺序之后
2.1打乱步骤
- 我们要先把这些图片都放在一个容器中,这样才能方便管理。
- 在容器中打乱顺序
- 再把容器中打乱的图片展示出来
所以,我们来挨个学习需要使用到的知识点。
3,数组
我们为了方便管理这些图片,要把所有的数组图片都放到一个容器中。这个容器不能使用变量,因为变量只能记录一个值。那么我们就需要用到下面学习的数组。
数组也是一个可以存储数据的容器。用来存储同种数据类型的多个值。 存在数组里面的数据也叫元素。
3.1格式
格式1:数据类型[] 数组名 = new 数据类型[]{ 元素1,元素2,元素3… }; ,
举例:
int[] array = new int[]{ 11,22,33 };
但是这个格式稍微有点复杂,我们还有一种简写格式。
格式2:数据类型[] 数组名 = { 元素1,元素2,元素3… };
举例:
int[] array = { 11,22,33 };
3.2数组图解
int [] array = new int[]{11,22,33};
等号左边:
int:表示数组中只能存整数
方括号:java中表示一个数组。
array:表示数组的名字。
等号右边:
new:表示准备创建一个数组
int:表示数组中只能存整数
方括号:java中表示一个数组
大括号里面:就是数组中真实存的数据,每一个数据用逗号隔开。
数组的图解如下:
创建了一个数组,其实在内容中就相当于有了一个容器。这个容器的名字叫做array。
因为数组中存3个值,那么会把这个容器中分为3个小格子。然后把11,22,33分别存入到这三个小格当中。
3.3数组的常见操作
- 怎么存
- 怎么取
- 如何修改数组内的元素
- 遍历
3.3.1怎么存
在上述数组格式中,我们当我们创建了数组之后,数组内就已经存好了元素。
所以,我们只要把希望存在数组里面的所有数据,都写在大括号中就可以了。元素之后用逗号隔开。
3.3.2怎么取
数组的获取要依赖索引。
格式:数组名[索引]
索引就相当于编号一样。但是他是从0开始,逐一增加的。
比如:在上述图中,四个房间里面分别有四只小鸡在洗衣服,我现在要找洗蓝色衣服的小鸡。
那么其实就可以通过房间的编号来获取,又因为这个编号是从0开始的,所以蓝色小鸡编号为2。
代码示例:
//创建一个数组
int [] arr1 = new int[]{1,2,3,4,5};
int [] arr2 = {1,2,3,4,5};
//获取数组中的元素
//获取arr2数组中0索引的元素
int a = arr2[0];
System.out.println(a);
//获取arr2数组中2索引的元素之后,立马打印到控制台上面
System.out.println(arr2[2]);
3.3.3修改元素
修改元素有两种方式,可以直接把值赋值赋值给数组,也可以通过变量进行赋值。
方式一:
数组名[索引] = 数据值;
方式二:
数组名[索引] = 变量;
举例:
//创建一个数组
int [] arr = {1,2,3,4,5};
//把arr2数组中0索引上的元素修改为100
System.out.println("修改前" + arr[0]);
arr[0] = 100;
System.out.println("修改后" + arr[0]);
3.3.4遍历
所谓遍历,把数组的元素一个一个的全部获取出来。
格式为:
int[] arr = {……};
for(int i=0; i<arr.length; i++) {
arr[i]//此时arr[i]在循环的过程中,就依次表示数组中的每一个元素。
//我们可以对arr[i]进行任意操作
}
int i = 0:表示从数组的0索引开始遍历。
i < arr.lenght:其中arr.length表示获取当前数组的长度。而数组中,索引的范围是从0开始的,到数组的长度减1。所以i < arr.length表示循环一直进行到数组的最大索引。
i++:表示循环的过程中,索引每次+1。
快速生成方式:数组名.fori + 回车
3.4数组的其他格式
格式:数据类型 [ ] 变量名 = new 数据类型[数组长度];
举例:int [ ] arr = new int[3];
该格式适用于,在创建数组时,不知道要存什么,但是知道要存几个元素时使用。
4,随机数
在Java中,也有一个类用来描述随机数。这个类叫做Random。类里面也有一个方法可以用来获取一个随机数。
一起来看一下他的步骤:
- 创建对象
- 获取随机数
代码示例:
//这行代码中,r 是变量名,可以变,其他的都不允许变
Random r = new Random();
//这行代码中,number是变量名,可以变,数字10可以变。其他的都不允许变
int number = r.nextInt(10);//获取数据的范围:[0,10) 包括0,不包括10
注意事项:
nextInt是Random类中,用于获取随机数的方法。在调用方法的时候需要传递一个范围。
但是这个范围是包头不包尾的。
比如:传递一个10,那么范围是从0开始,不包含10的。
实际上是在0,1,2,3,4,5,6,7,8,9这个范围中获取一个随机数。
比如:传递一个100,那么范围是从0开始,不包含100的。
起始位置0不变,在0-99之间获取一个随机数。
代码示例:
//创建对象
Random r = new Random();
//获取一个0-9之间的随机数
int number = r.nextInt(10);
//将得到的随机数打印到控制台上
System.out.println(number);
5,数据交换
我们在打乱顺序的时候,需要使用到数据交换,那么咱们就一起来看一下:
需求:
有定义两个变量a,b。分别赋值为10和20。如何交换两个变量的值呢?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7L9mNy8J-1646823659209)(img\交换.png)]
对比上方图解,步骤如下:
1,创建第一个第三方变量c
2,把变量a的值交给第三方变量c
3,把变量b的值交给变量a
4,把变量c的值交给变量b
代码示例:
//定义两个变量
int a = 10;
int b = 20;
//开始交换
//定义一个第三方变量c,并把变量a的值交给c
int c = a;
//把变量b的值交给a,此时变量a原来的值被覆盖。
a = b;
//把变量c的值交给b,此时变量b原来的值被覆盖。
b = c;
6,打乱数组中的数字
学习完了数组,也学习完了随机数。那么我们就要把数组中的数字打乱一下顺序。
原先的数组中0-15是依次排列的,现在我要把他们的顺序打乱。
可以遍历数组,并获取一个随机交换的位置。让当前遍历到的元素跟随机位置进行交换。
步骤如下:
- 定义数组,存0-15。
- 遍历数组,依次得到每一个元素。
- 遍历的过程中,获取随机索引。
- 拿着随机索引处的元素跟当前遍历到的元素进行交换。
代码示例:
//打乱数组中数字的顺序
int [] temp = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
//1.遍历数组,可以依次得到数组中的每一个数。
for (int i = 0; i < temp.length; i++) {
//temp[i]; - 当前遍历到的数组中的数字
//2.获取数组中的一个随机索引。
Random r = new Random();
int index = r.nextInt(temp.length);//5
//3.将当前遍历到的数字,跟随机索引上的数字两者进行交换。
int number = temp[i];
temp[i] = temp[index];
temp[index] = number;
}
//遍历数组
for (int i = 0; i < temp.length; i++) {
System.out.println(temp[i]);
}
7,二维数组
在我们的游戏中,每一张图片对应着一个数字。所以,整个游戏界面就可以看成是四行四列的。
每一行都可以看成是一个小数组。而这种数组也叫做一维数组。装着四个一维数组的大数组,叫做二维数组。
二维数组简单理解:数组里面装的还是数组。
而这种二维数组,就更加方便管理游戏中的数据。
7.1二维数组定义格式
格式1:数据类型 [][] 变量名 = {{元素1,元素2},{元素3,元素4}};
举例:int [][] arr = {{11,22},{33,44}};
解释:
在本案例中,二维数组取名arr。二维数组中装了两个一维数组。
第一个一维数组中存了11和22两个元素。
第二个一维数组中存了33和44两个元素。
格式2:数据类型 [][] 变量名 = new 数据类型[m][n];
举例:int [] [] arr = new int [2][3];
解释:
m表示二维数组的长度,也代表了二维数组里面可以装多少个一维数组。
n表示每一个一维数组的长度,也代表了每一个一维数组里面可以装多少个元素。
如果定义为:int [] [] arr = new int [2][3];
表示该数组可以存放2个一维数组,每个一维数组中可以存放3个int类型元素。
7.2二维数组遍历
二维数组,也是一个数组。所以,也可以将里面每一个元素一一获取出来。
以int [][] arr = {{11,22},{33,44}};
为例。
二维数组的0索引是存着11和22的一维数组。
二维数组的1索引是存在33和44的一维数组。
代码示例:
for (int i = 0; i < arr.length; i++) {
//arr[i]
}
现在我们遍历的是二维数组,得到二维数组里面的元素。
i的取值范围:0~1.
所以arr[0]和arr[1]都分别代表一个一维数组,我们可以继续遍历
完整遍历代码示例:
for (int i = 0; i < arr.length; i++) {
//arr[i]表示每一个一维数组。内循环继续遍历一维数组
for (int j = 0; j < arr[i].length; j++) {
System.out.println(temp[i][j]);
}
}
8,打乱数字并存入二维数组
下面,我们就要完成游戏中较为复杂的功能了。
我们为了方便管理,要先在一维数组中将所有的数据打乱顺序,再把打乱之后的存入二维数组中。
这样二维数组的数字排布,就跟游戏界面中的数字图片对应起来了。
实现步骤如下:
1,创建一个一维数组,存入数字0-15。数字跟图片一一对应。
2,打乱一维数组中所有数字的顺序。
3,将一维数组中打乱之后的数字存入到二维数组。
代码示例:
代码步骤一:
因为二维数组在多个方法中都要使用到。所以需要到类的最上面,定义一个二维数组。
如果把该二维数组定义在方法中,那么只能在本方法中使用。
public class MyJFrame extends JFrame{
//定义一个二维数组,方便管理数据
int[][] datas = new int[4][4];
...
}
代码步骤二:
添加一个initDate的方法。在本方法中,完成打乱数据并添加到二维数组的操作。
public void initData() {
//创建一个数组
int[] temp = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
//打乱一下数组中这些数字的顺序
//1.遍历数组,可以依次得到数组中的每一个数。
for (int i = 0; i < temp.length; i++) {
//temp[i]; - 当前遍历到的数组中的数字
//2.获取数组中的一个随机索引。
Random r = new Random();
int index = r.nextInt(temp.length);//5
//3.将当前遍历到的数字,跟随机索引上的数字两者进行交换。
int number = temp[i];
temp[i] = temp[index];
temp[index] = number;
}
//把打乱之后的数据添加到二维数组当中
//把arr中的16个元素添加到二维数组当中
for (int i = 0; i < temp.length; i++) {
datas[i / 4][i % 4] = temp[i];
}
}
代码步骤三:
在构造方法中调用inteDate方法。
//构造方法
public MyJFrame() {
...
//初始化数据
initData();
...
}
9,if判断
因为在赋值的过程中,我们需要记录一下空白区域,也就是在二维数组中元素0的位置,所以我们还需要学习一个if判断。
9.1 if语句格式1
格式:
if (关系表达式) {
语句体;
}
执行流程:
①首先计算关系表达式的值
②如果关系表达式的值为true就执行语句体
③如果关系表达式的值为false就不执行语句体
④继续执行后面的语句内容
代码示例:
public class IfDemo {
public static void main(String[] args) {
//如果你的酒量大于等于2斤,那么可以穿走老丈人的小棉袄
//否则,老丈人不给出回应
int number = 0;
if(number >= 2){
System.out.println("可以穿走我的小棉袄");
}
}
}
9.2 if语句格式2
格式:
if (关系表达式) {
语句体1;
} else {
语句体2;
}
执行流程:
①首先计算关系表达式的值
②如果关系表达式的值为true就执行语句体1
③如果关系表达式的值为false就执行语句体2
④继续执行后面的语句内容
示例:选择吃饭的地点
如果身上的钱是大于等于100块,那么就吃网红餐厅,否则就吃经济实惠的福建料理。
public class IfDemo {
public static void main(String[] args) {
//如果身上的钱是大于等于100块,那么就吃网红餐厅
//否则就吃经济实惠的福建料理
int money = 20000;
if(money >= 100){
System.out.println("吃网红餐厅");
}else{
System.out.println("经济实惠的福建料理");
}
}
}
9.3 if语句格式3
格式:
if (关系表达式1) {
语句体1;
} else if (关系表达式2) {
语句体2;
}
…
else {
语句体n+1;
}
执行流程:
①首先计算关系表达式1的值
②如果值为true就执行语句体1;如果值为false就计算关系表达式2的值
③如果值为true就执行语句体2;如果值为false就计算关系表达式3的值
④…
⑤如果没有任何关系表达式为true,就执行语句体n+1。
需求:
小明快要期末考试了,小明爸爸对他说,会根据他不同的考试成绩,送他不同的礼物,假如你可以控制小明的得分,请用程序实现小明到底该获得什么样的礼物,并在控制台输出。
分析:
①小明的考试成绩可以使用定义变量的形式体现
②由于奖励种类较多,属于多种判断,采用if…else…if格式实现
③为每种判断设置对应的条件
public class IfDemo {
public static void main(String[] args){
int score = 60;
if(score == 100){
System.out.println("买自行车一辆");
}else if(score == 99){
System.out.println("游乐场玩一天");
}else if(score == 98){
System.out.println("买变形金刚一个");
}else{
System.out.println("胖揍一顿");
}
}
}
10,记录游戏中空白区域的位置
在游戏中,如果要移动数字图片,只能移动空白区域附近的,所以我们在给二维数组赋值的过程中,必须要记录一下数组0的位置。
第一步:
首先,因为空白区域的位置在多个方法中都要使用,所以我们要在类的上面定义两个变量,记录空白区域,也就是数字0的位置。
public class MyJFrame extends JFrame {
......
//定义两个变量,用来记录空白的位置 0
int x0 = 0;
int y0 = 0;
......
}
第二步:
在赋值的过程中对每一个数字进行判断,如果找到了0,那么就记录他的位置。
for (int i = 0; i < temp.length; i++) {
datas[i / 4][i % 4] = temp[i];
//如果当前的数字为0,则记录其位置。
if (temp[i] == 0) {
x0 = i / 4;
y0 = i % 4;
}
}
11,添加随机图片
二维数组中的每一个数字就对应着一张随机图片,在刚刚我们已经把随机数字赋值给二维数组了。
那么接下来,我们只要按照二维数组中数字的顺序,把对应的图片添加到游戏界面中即可。
所以,我们要改写initImage方法中所有的代码。
在方法中,遍历二维数组得到每一个数字。如果当前数字不是0,则找到对应的图片添加到界面中。
initImage方法实现步骤:
1,遍历二维数组,得到每一个数字
2,对当前数字进行判断,如果是0,则不管。
3,如果不是0,则拿着数字找到对应的图片
4,将对应的图片添加到界面当中
5,添加背景图片
public void initImage() {
//遍历二维数组
for (int i = 0; i < datas.length; i++) {
for (int j = 0; j < datas[i].length; j++) {
//date表示二维数组里的每一个元素
int data = datas[i][j];
//对每一个元素进行判断,如果不为0就找到对应的图片,再添加到界面当中。
if (data != 0) {
//如果data不为0,那么我们才添加图片
ImageIcon imageIcon = new ImageIcon("image\\" + data + ".png");
JLabel jLabel = new JLabel(imageIcon);
jLabel.setBounds(j * 100 + 50, i * 100 + 90, 100, 100);
this.add(jLabel);
}
}
}
//添加背景色
ImageIcon background = new ImageIcon("image\\background.png");
JLabel backgroundJlabel = new JLabel(background);
backgroundJlabel.setBounds(26, 30, 450, 484);
this.add(backgroundJlabel);
}
找到对应的图片添加到界面中。
initImage方法实现步骤:
1,遍历二维数组,得到每一个数字
2,对当前数字进行判断,如果是0,则不管。
3,如果不是0,则拿着数字找到对应的图片
4,将对应的图片添加到界面当中
5,添加背景图片
public void initImage() {
//遍历二维数组
for (int i = 0; i < datas.length; i++) {
for (int j = 0; j < datas[i].length; j++) {
//date表示二维数组里的每一个元素
int data = datas[i][j];
//对每一个元素进行判断,如果不为0就找到对应的图片,再添加到界面当中。
if (data != 0) {
//如果data不为0,那么我们才添加图片
ImageIcon imageIcon = new ImageIcon("image\\" + data + ".png");
JLabel jLabel = new JLabel(imageIcon);
jLabel.setBounds(j * 100 + 50, i * 100 + 90, 100, 100);
this.add(jLabel);
}
}
}
//添加背景色
ImageIcon background = new ImageIcon("image\\background.png");
JLabel backgroundJlabel = new JLabel(background);
backgroundJlabel.setBounds(26, 30, 450, 484);
this.add(backgroundJlabel);
}