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

更多Java全套学习资源均在专栏,持续更新中↑↑戳进去领取~

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

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

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



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[]{ 112233 }; 

​ 但是这个格式稍微有点复杂,我们还有一种简写格式。

​ 格式2:数据类型[] 数组名 = { 元素1,元素2,元素3… };

​ 举例:

int[] array = { 112233 };

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值