0
点赞
收藏
分享

微信扫一扫

Java《石头迷阵02》黑马程序员官方出版万字教程+源码

更多Java全套学习资源均在专栏,持续更新中

​​🍅2022年全新Java学习路线图,含源码+笔记,另附在职提升课​​🍅跟我20天学Java:01-计算机基础以及JDK、IDEA等安装详解
🍅跟我20天学Java:02-自动类型转换,表达式的自动类型转换,强制类型转换
🍅跟我20天学Java:03-6个案例手把手带你学循环结构

​​🍉Maven简介以及手把手教你下载安装​​

更多内容加急更新,从安装开始学起来👼

文章目录

  • ​​1,游戏优化​​
  • ​​1.1添加背景色​​
  • ​​1.1.1实现步骤:​​
  • ​​1.2抽取代码​​
  • ​​1.3循环​​
  • ​​1.3.1比较运算符​​
  • ​​1.3.2自增运算符​​
  • ​​1.3.3循环的格式​​
  • ​​1.3.4执行流程​​
  • ​​1.3.5循环添加图片​​
  • ​​2,打乱顺序​​
  • ​​2.1打乱步骤​​
  • ​​3,数组​​
  • ​​3.1格式​​
  • ​​3.2数组图解​​
  • ​​3.3数组的常见操作​​
  • ​​3.3.1怎么存​​
  • ​​3.3.2怎么取​​
  • ​​3.3.3修改元素​​
  • ​​3.3.4遍历​​
  • ​​3.4数组的其他格式​​
  • ​​4,随机数​​
  • ​​5,数据交换​​
  • ​​6,打乱数组中的数字​​
  • ​​7,二维数组​​
  • ​​7.1二维数组定义格式​​
  • ​​7.2二维数组遍历​​
  • ​​8,打乱数字并存入二维数组​​
  • ​​9,if判断​​
  • ​​9.1 if语句格式1​​
  • ​​9.2 if语句格式2​​
  • ​​9.3 if语句格式3​​
  • ​​10,记录游戏中空白区域的位置​​
  • ​​11,添加随机图片​​

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执行流程

首先执行初始化语句,然后执行条件判断语句。

如果条件判断语句结果为真,则进入循环体执行。再执行条件控制语句。回到条件判断语句继续重复这个过程。

如果条件判断语句结果为假,则直接结束循环。

Java《石头迷阵02》黑马程序员官方出版万字教程+源码_开发语言

如果大家觉得这个过程有点绕,也没有关系。看下面的代码,简单理解循环。

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所有的数字图片都添加到界面当中了。但是此时添加进去顺序是乱的。我们还得把里面的顺序打乱,这样才可以开始玩游戏。

Java《石头迷阵02》黑马程序员官方出版万字教程+源码_开发语言_02

添加前 打乱顺序之后

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中表示一个数组

大括号里面:就是数组中真实存的数据,每一个数据用逗号隔开。

数组的图解如下:

Java《石头迷阵02》黑马程序员官方出版万字教程+源码_开发语言_03

创建了一个数组,其实在内容中就相当于有了一个容器。这个容器的名字叫做array。

因为数组中存3个值,那么会把这个容器中分为3个小格子。然后把11,22,33分别存入到这三个小格当中。

3.3数组的常见操作

  • 怎么存
  • 怎么取
  • 如何修改数组内的元素
  • 遍历

3.3.1怎么存

在上述数组格式中,我们当我们创建了数组之后,数组内就已经存好了元素。

所以,我们只要把希望存在数组里面的所有数据,都写在大括号中就可以了。元素之后用逗号隔开。

3.3.2怎么取

数组的获取要依赖索引。

格式:数组名[索引]

索引就相当于编号一样。但是他是从0开始,逐一增加的。

Java《石头迷阵02》黑马程序员官方出版万字教程+源码_intellij-idea_04

比如:在上述图中,四个房间里面分别有四只小鸡在洗衣服,我现在要找洗蓝色衣服的小鸡。

那么其实就可以通过房间的编号来获取,又因为这个编号是从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,二维数组

在我们的游戏中,每一张图片对应着一个数字。所以,整个游戏界面就可以看成是四行四列的。

每一行都可以看成是一个小数组。而这种数组也叫做一维数组。装着四个一维数组的大数组,叫做二维数组。

二维数组简单理解:数组里面装的还是数组。

而这种二维数组,就更加方便管理游戏中的数据。

Java《石头迷阵02》黑马程序员官方出版万字教程+源码_开发语言_05

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,打乱数字并存入二维数组

下面,我们就要完成游戏中较为复杂的功能了。

我们为了方便管理,要先在一维数组中将所有的数据打乱顺序,再把打乱之后的存入二维数组中。

这样二维数组的数字排布,就跟游戏界面中的数字图片对应起来了。

Java《石头迷阵02》黑马程序员官方出版万字教程+源码_数组_06

实现步骤如下:
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判断。

Java《石头迷阵02》黑马程序员官方出版万字教程+源码_开发语言_07

9.1 if语句格式1

格式:
if (关系表达式) {
语句体;
}

执行流程:

①首先计算关系表达式的值

②如果关系表达式的值为true就执行语句体

③如果关系表达式的值为false就不执行语句体

④继续执行后面的语句内容

Java《石头迷阵02》黑马程序员官方出版万字教程+源码_数组_08

代码示例:

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

④继续执行后面的语句内容

Java《石头迷阵02》黑马程序员官方出版万字教程+源码_java_09

示例:选择吃饭的地点

如果身上的钱是大于等于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。

Java《石头迷阵02》黑马程序员官方出版万字教程+源码_intellij-idea_10

需求:

小明快要期末考试了,小明爸爸对他说,会根据他不同的考试成绩,送他不同的礼物,假如你可以控制小明的得分,请用程序实现小明到底该获得什么样的礼物,并在控制台输出。

分析:

①小明的考试成绩可以使用定义变量的形式体现

②由于奖励种类较多,属于多种判断,采用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);
}


举报

相关推荐

0 条评论