06.查看完整图片,作弊码和判断胜利

一.查看完整图片(效果):

二.以一张图片为例查看完整图片:

1.代码:

package com.itheima.ui;
​
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
​
public class GameJFrame extends JFrame implements KeyListener {
    /* 注意一定要继承JFrame类
      因为此时要创建一个窗体,而JFrame就是一个界面,窗体,
      继承JFrame的子类也表示界面,窗体
    */
    //规定:GameJFrame这个界面表示的就是游戏的主界面
    //以后跟游戏相关的所有逻辑都写在这个类中
​
​
    //创建一个二维数组
    //目的:用来管理数据
    //加载图片的时候,会根据二维数组中的数据进行加载
    int[][] data=new int[4][4];
​
    //记录空白方块在二维数组中的位置-->一开始设为0
    int x=0;
    int y=0;
​
​
    public GameJFrame(){
        //初始化界面
        initJFrame();
​
        //初始化菜单
        initJMenuBar();
​
        //初始化数据(打乱)
        initData();
​
​
        //初始化图片(根据打乱之后的结果去加载图片)
        initImage();
​
​
​
        //参数为true显示界面,为false隐藏界面-->建议写最后
        this.setVisible(true);//gameJframe.show();也可以显示界面
    }
​
​
    //初始化数据(打乱)的方法
    private void initData() {
        //1.定义一个一维数组
        int[] tempArr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        //2.打乱数组中数据的顺序
        Random r=new Random();
        for (int i = 0; i < tempArr.length; i++) {
            //a.随机生成一个索引
            int index=r.nextInt(tempArr.length-1);
            //b.与i索引上的元素交换位置
            int temp=tempArr[i];
            tempArr[i]=tempArr[index];
            tempArr[index]=temp;
        }
        //3.给二维数组添加数据
        /*遍历一维数组tempArr得到每一个元素,把每一个元素依次添加到二维数组当中 */
        for (int i = 0; i < tempArr.length; i++) {
            if(tempArr[i]==0){
                //为0时对坐标进行改变
                x=i/4;
                y=i%4;
            } else {
                //不为0时添加到二维数组中
                data[i/4][i%4]=tempArr[i];
            }
​
        }
    }
​
​
    //初始化图片的方法
     //初始化数据(打乱)后,在添加图片时,就需要根据二维数组中管理的数据进行添加图片
    private void initImage() {
        //需要先清空原本已经出现的所有图片
        this.getContentPane().removeAll();//之后重新加载
​
​
​
        /* 路径分为两种:
            1.绝对路径:一定是从盘符开始的,如D:\Java
            2.相对路径:相对路径是相对当前项目而言的,不是从盘符开始的.
                如aaa\\bbb,就是在当前项目下去找aaa文件夹,里面再找bbb文件夹
         */
​
​
        /* 细节:
            先加载的图片在上方,后加载的图片在下方。
            本例中背景图片在下方,应该之后加载
         */
​
        //外循环控制x,内循环控制y----嵌套循环(先看内循环,再看外循环)
        //外循环 --- 把内循环重复执行了四次
        for (int i = 0; i < 4; i++) {
            //内循环 --- 表示在一行添加4张图片
            for (int j = 0; j < 4; j++) {
                //获取当前要加载的图片的序号
                int number=data[i][j];
                //创建一个图片ImageIcon的对象,注:number是整型,要单独写出来
                ImageIcon icon=new ImageIcon("..\\PuzzleGame\\image\\animal\\animal3\\"+number+".jpg");/*这是相对路径,PuzzleGame前有个..\\(..//也行)  */
                //创建一个JLabel的对象(管理容器),本例中没有第16张图片,但也会执行new JLabel,只不过加载了个空白
                JLabel jLabel=new JLabel(icon);//放入icon,代表管理icon
                //指定图片位置(必须是在"把管理容器添加到界面中"前)
                /* 83和134是为了把内容移动到中央偏下(这个数值需要自己测试) */
                jLabel.setBounds(105*j+83,105*i+134,105,105);//第一个参数为横坐标,第二个参数为纵坐标,第三个参数为宽(像素),第四个参数为高(像素)
                //给图片添加边框(new BevelBorder(0)代表让图片凸起来,0是RAISED;new BevelBorder(1)代表让图片凹下去,1是LOWERED)
                jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));//也可以是jLabel.setBorder(new BevelBorder(1));
                //把管理容器添加到界面中
                this.getContentPane().add(jLabel);//getContentPane()用来获取里面隐藏的容器
            }
        }
​
​
        //添加背景图片
        ImageIcon bg=new ImageIcon("..\\PuzzleGame\\image\\background.png");/*这是相对路径,PuzzleGame前有个..\\  */
        //创建一个JLabel的对象(管理容器)
        JLabel background=new JLabel(bg);
        //设置JLabel的对象(管理容器)的位置和宽高-->数值需要自己一点一点测试
        background.setBounds(40,40,508,560);
        //把背景图片(管理容器)添加到界面中
        this.getContentPane().add(background);//getContentPane()用来获取里面隐藏的容器
​
​
​
        //刷新一下界面
        this.getContentPane().repaint();
​
    }
​
​
​
​
​
    //初始化菜单的方法
    private void initJMenuBar() {
        //初始化菜单
        //1.创建整个的菜单对象
        JMenuBar jMenuBar=new JMenuBar();
        //2.创建菜单上面的两个选项的对象(功能  关于我们)
        JMenu functionJMenu=new JMenu("功能");
        JMenu aboutJMenu=new JMenu("关于我们");
        //3.创建选项下面的条目对象
        //功能
        JMenuItem replayItem=new JMenuItem("重新游戏");
        JMenuItem reLoginItem=new JMenuItem("重新登录");
        JMenuItem closeItem=new JMenuItem("关闭游戏");
        //关于我们
        JMenuItem accountItem=new JMenuItem("公众号");
​
​
        //将每一个选项下面的条目添加到选项当中
        //功能
        functionJMenu.add(replayItem);
        functionJMenu.add(reLoginItem);
        functionJMenu.add(closeItem);
        //关于我们
        aboutJMenu.add(accountItem);
​
​
        //将菜单里面的两个选项添加到菜单中
        jMenuBar.add(functionJMenu);
        jMenuBar.add(aboutJMenu);
​
​
        //给整个界面设置菜单
        this.setJMenuBar(jMenuBar);
    }
​
​
​
    //初始化界面的方法
    private void initJFrame() {
        //设置界面的宽高(单位:像素)-->大小根据内容定
        this.setSize(603,680);//第一个参数为宽,第二个参数为高
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式-->不设置的话最终运行后再关闭界面,但程序不停止
        //this.setDefaultCloseOperation(3);//3代表一种关闭规则,可通过看源码了解
        //还可以this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //对于关闭模式,必须每个界面都设置一遍才生效。关闭模式2是关了最后一个才结束,关闭模式3是关一个就结束一个
        //本项目这几个界面不会同时出现,因此用关闭模式3即可
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //取消默认的居中放置,只有取消了才会按照XY轴的形式添加组件
        this.setLayout(null);
        //给整个界面添加键盘监听事件
        this.addKeyListener(this);
    }
​
    @Override
    public void keyTyped(KeyEvent e) {
​
    }
​
    //按下不松时,调用这个方法
    @Override
    public void keyPressed(KeyEvent e) { //按下不松:可用于写快捷键
        int code = e.getKeyCode();
        //本例以A为快捷键,A对应编号为65
        if(code==65){
            //把界面中所有图片全部删除
            this.getContentPane().removeAll();
            //加载第一张完整的图片
            ImageIcon icon=new ImageIcon("D:\\Java\\PuzzleGame\\image\\animal\\animal3\\all.jpg");
            JLabel all=new JLabel(icon);
            all.setBounds(83,134,420,420);//前两个为坐标,因题而异;后两个为宽高(像素),和图片一致即可
            this.getContentPane().add(all);
            //加载背景图片
            ImageIcon bg=new ImageIcon("..\\PuzzleGame\\image\\background.png");/*这是相对路径,PuzzleGame前有个..\\  */
            JLabel background=new JLabel(bg);
            background.setBounds(40,40,508,560);
            this.getContentPane().add(background);//getContentPane()用来获取里面隐藏的容器
            //刷新界面
            this.getContentPane().repaint();
        }
    }
​
    @Override
    public void keyReleased(KeyEvent e) {
        //对上,下,左,右进行判断(各对应一个编号-->不需要记,用的时候打印一下即可知道编号是几)
        //左:37;上:38;右:39;下:40
        int code=e.getKeyCode();
        if(code==37){
            System.out.println("向左移动");
            /* 逻辑:
                把空白方块右方的数字往左移动
             */
            if(y==3){
                //表示空白方块已经在最右方了,他的右方没有图片再能向左移动了-->直接结束方法即可
                return;
            }
​
            //把空白方块右方的数字赋值给空白方块
            data[x][y]=data[x][y+1]; //x,y表示空白方块
            data[x][y+1]=0;//0代表第0张图片即空白图片
            y++;//空白方块此时向右移动了,y也就自增
            //调用方法按照最新的数字加载图片
            initImage();
​
        } else if (code==38) {
            System.out.println("向上移动");
            /* 逻辑:
                把空白方块下方的数字往上移动
                x,y表示空白方块
                x+1,y表示空白方块下方的数字
             */
            /* 特例:如果空白块在最下方如一开始x=3,y=0
                  此时x+1就越界了
                因此要做越界判断
             */
            if(x==3){
                //表示空白方块已经在最下方了,他的下方没有图片再能向上移动了-->直接结束方法即可
                return;
            }
​
            //把空白方块下方的数字赋值给空白方块
            data[x][y]=data[x+1][y];
            data[x+1][y]=0;//0代表第0张图片即空白图片
            x++;//空白方块此时向下移动了,x也就自增
            //调用方法按照最新的数字加载图片
            initImage();
​
        } else if (code==39) {
            System.out.println("向右移动");
            /* 逻辑:
                把空白方块左方的数字往右移动
             */
            if(y==0){
                //表示空白方块已经在最左方了,他的左方没有图片再能向右移动了-->直接结束方法即可
                return;
            }
​
            //把空白方块左方的数字赋值给空白方块
            data[x][y]=data[x][y-1]; //x,y表示空白方块
            data[x][y-1]=0;//0代表第0张图片即空白图片
            y--;//空白方块此时向左移动了,y也就自减
            //调用方法按照最新的数字加载图片
            initImage();
​
        } else if (code==40) {
            System.out.println("向下移动");
            /* 逻辑:
                把空白方块上方的数字往下移动
             */
            if(x==0){
                //表示空白方块已经在最上方了,他的上方没有图片再能向下移动了-->直接结束方法即可
                return;
            }
​
            //把空白方块上方的数字赋值给空白方块
            data[x][y]=data[x-1][y];
            data[x-1][y]=0;//0代表第0张图片即空白图片
            x--;//空白方块此时向上移动了,x也就自减
            //调用方法按照最新的数字加载图片
            initImage();
​
        } else if (code==65) {
            //此时是松开了,加载图片即可
            initImage();
        }
    }
}
​

2.测试类:

import com.itheima.ui.GameJFrame;
import com.itheima.ui.LoginJFrame;
import com.itheima.ui.RegisterJFrame;
​
public class App {
    public static void main(String[] args) {
        //表示程序的启动入口
​
        //如果我们想要开启一个界面,就创建谁的对象就可以了
        //new LoginJFrame();//调用了登录界面的空参构造
​
        //new RegisterJFrame();
​
        new GameJFrame();
    }
}
​
​

3.运行结果:

英文输入法下按A:


三.查看完整图片代码优化:提取路径为字符串

1.代码:

package com.itheima.ui;
​
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
​
public class GameJFrame extends JFrame implements KeyListener {
    /* 注意一定要继承JFrame类
      因为此时要创建一个窗体,而JFrame就是一个界面,窗体,
      继承JFrame的子类也表示界面,窗体
    */
    //规定:GameJFrame这个界面表示的就是游戏的主界面
    //以后跟游戏相关的所有逻辑都写在这个类中
​
​
    //创建一个二维数组
    //目的:用来管理数据
    //加载图片的时候,会根据二维数组中的数据进行加载
    int[][] data=new int[4][4];
​
    //记录空白方块在二维数组中的位置-->一开始设为0
    int x=0;
    int y=0;
​
​
    //定义一个变量,记录当前展示图片的路径
    String path="..\\PuzzleGame\\image\\girl\\girl3\\";
​
​
    public GameJFrame(){
        //初始化界面
        initJFrame();
​
        //初始化菜单
        initJMenuBar();
​
        //初始化数据(打乱)
        initData();
​
​
        //初始化图片(根据打乱之后的结果去加载图片)
        initImage();
​
​
​
        //参数为true显示界面,为false隐藏界面-->建议写最后
        this.setVisible(true);//gameJframe.show();也可以显示界面
    }
​
​
    //初始化数据(打乱)的方法
    private void initData() {
        //1.定义一个一维数组
        int[] tempArr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        //2.打乱数组中数据的顺序
        Random r=new Random();
        for (int i = 0; i < tempArr.length; i++) {
            //a.随机生成一个索引
            int index=r.nextInt(tempArr.length-1);
            //b.与i索引上的元素交换位置
            int temp=tempArr[i];
            tempArr[i]=tempArr[index];
            tempArr[index]=temp;
        }
        //3.给二维数组添加数据
        /*遍历一维数组tempArr得到每一个元素,把每一个元素依次添加到二维数组当中 */
        for (int i = 0; i < tempArr.length; i++) {
            if(tempArr[i]==0){
                //为0时对坐标进行改变
                x=i/4;
                y=i%4;
            } else {
                //不为0时添加到二维数组中
                data[i/4][i%4]=tempArr[i];
            }
​
        }
    }
​
​
    //初始化图片的方法
     //初始化数据(打乱)后,在添加图片时,就需要根据二维数组中管理的数据进行添加图片
    private void initImage() {
        //需要先清空原本已经出现的所有图片
        this.getContentPane().removeAll();//之后重新加载
​
​
​
        /* 路径分为两种:
            1.绝对路径:一定是从盘符开始的,如D:\Java
            2.相对路径:相对路径是相对当前项目而言的,不是从盘符开始的.
                如aaa\\bbb,就是在当前项目下去找aaa文件夹,里面再找bbb文件夹
         */
​
​
        /* 细节:
            先加载的图片在上方,后加载的图片在下方。
            本例中背景图片在下方,应该之后加载
         */
​
        //外循环控制x,内循环控制y----嵌套循环(先看内循环,再看外循环)
        //外循环 --- 把内循环重复执行了四次
        for (int i = 0; i < 4; i++) {
            //内循环 --- 表示在一行添加4张图片
            for (int j = 0; j < 4; j++) {
                //获取当前要加载的图片的序号
                int number=data[i][j];
                //创建一个图片ImageIcon的对象,注:number是整型,要单独写出来
                ImageIcon icon=new ImageIcon(path+number+".jpg");/*这是相对路径,PuzzleGame前有个..\\(..//也行)  */
                //创建一个JLabel的对象(管理容器),本例中没有第16张图片,但也会执行new JLabel,只不过加载了个空白
                JLabel jLabel=new JLabel(icon);//放入icon,代表管理icon
                //指定图片位置(必须是在"把管理容器添加到界面中"前)
                /* 83和134是为了把内容移动到中央偏下(这个数值需要自己测试) */
                jLabel.setBounds(105*j+83,105*i+134,105,105);//第一个参数为横坐标,第二个参数为纵坐标,第三个参数为宽(像素),第四个参数为高(像素)
                //给图片添加边框(new BevelBorder(0)代表让图片凸起来,0是RAISED;new BevelBorder(1)代表让图片凹下去,1是LOWERED)
                jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));//也可以是jLabel.setBorder(new BevelBorder(1));
                //把管理容器添加到界面中
                this.getContentPane().add(jLabel);//getContentPane()用来获取里面隐藏的容器
            }
        }
​
​
        //添加背景图片
        ImageIcon bg=new ImageIcon("..\\PuzzleGame\\image\\background.png");/*这是相对路径,PuzzleGame前有个..\\  */
        //创建一个JLabel的对象(管理容器)
        JLabel background=new JLabel(bg);
        //设置JLabel的对象(管理容器)的位置和宽高-->数值需要自己一点一点测试
        background.setBounds(40,40,508,560);
        //把背景图片(管理容器)添加到界面中
        this.getContentPane().add(background);//getContentPane()用来获取里面隐藏的容器
​
​
​
        //刷新一下界面
        this.getContentPane().repaint();
​
    }
​
​
​
​
​
    //初始化菜单的方法
    private void initJMenuBar() {
        //初始化菜单
        //1.创建整个的菜单对象
        JMenuBar jMenuBar=new JMenuBar();
        //2.创建菜单上面的两个选项的对象(功能  关于我们)
        JMenu functionJMenu=new JMenu("功能");
        JMenu aboutJMenu=new JMenu("关于我们");
        //3.创建选项下面的条目对象
        //功能
        JMenuItem replayItem=new JMenuItem("重新游戏");
        JMenuItem reLoginItem=new JMenuItem("重新登录");
        JMenuItem closeItem=new JMenuItem("关闭游戏");
        //关于我们
        JMenuItem accountItem=new JMenuItem("公众号");
​
​
        //将每一个选项下面的条目添加到选项当中
        //功能
        functionJMenu.add(replayItem);
        functionJMenu.add(reLoginItem);
        functionJMenu.add(closeItem);
        //关于我们
        aboutJMenu.add(accountItem);
​
​
        //将菜单里面的两个选项添加到菜单中
        jMenuBar.add(functionJMenu);
        jMenuBar.add(aboutJMenu);
​
​
        //给整个界面设置菜单
        this.setJMenuBar(jMenuBar);
    }
​
​
​
    //初始化界面的方法
    private void initJFrame() {
        //设置界面的宽高(单位:像素)-->大小根据内容定
        this.setSize(603,680);//第一个参数为宽,第二个参数为高
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式-->不设置的话最终运行后再关闭界面,但程序不停止
        //this.setDefaultCloseOperation(3);//3代表一种关闭规则,可通过看源码了解
        //还可以this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //对于关闭模式,必须每个界面都设置一遍才生效。关闭模式2是关了最后一个才结束,关闭模式3是关一个就结束一个
        //本项目这几个界面不会同时出现,因此用关闭模式3即可
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //取消默认的居中放置,只有取消了才会按照XY轴的形式添加组件
        this.setLayout(null);
        //给整个界面添加键盘监听事件
        this.addKeyListener(this);
    }
​
    @Override
    public void keyTyped(KeyEvent e) {
​
    }
​
    //按下不松时,调用这个方法
    @Override
    public void keyPressed(KeyEvent e) { //按下不松:可用于写快捷键
        int code = e.getKeyCode();
        //本例以A为快捷键,A对应编号为65
        if(code==65){
            //把界面中所有图片全部删除
            this.getContentPane().removeAll();
            //加载第一张完整的图片
            ImageIcon icon=new ImageIcon(path+"all.jpg");
            JLabel all=new JLabel(icon);
            all.setBounds(83,134,420,420);//前两个为坐标,因题而异;后两个为宽高(像素),和图片一致即可
            this.getContentPane().add(all);
            //加载背景图片
            ImageIcon bg=new ImageIcon("..\\PuzzleGame\\image\\background.png");/*这是相对路径,PuzzleGame前有个..\\  */
            JLabel background=new JLabel(bg);
            background.setBounds(40,40,508,560);
            this.getContentPane().add(background);//getContentPane()用来获取里面隐藏的容器
            //刷新界面
            this.getContentPane().repaint();
        }
    }
​
    @Override
    public void keyReleased(KeyEvent e) {
        //对上,下,左,右进行判断(各对应一个编号-->不需要记,用的时候打印一下即可知道编号是几)
        //左:37;上:38;右:39;下:40
        int code=e.getKeyCode();
        if(code==37){
            System.out.println("向左移动");
            /* 逻辑:
                把空白方块右方的数字往左移动
             */
            if(y==3){
                //表示空白方块已经在最右方了,他的右方没有图片再能向左移动了-->直接结束方法即可
                return;
            }
​
            //把空白方块右方的数字赋值给空白方块
            data[x][y]=data[x][y+1]; //x,y表示空白方块
            data[x][y+1]=0;//0代表第0张图片即空白图片
            y++;//空白方块此时向右移动了,y也就自增
            //调用方法按照最新的数字加载图片
            initImage();
​
        } else if (code==38) {
            System.out.println("向上移动");
            /* 逻辑:
                把空白方块下方的数字往上移动
                x,y表示空白方块
                x+1,y表示空白方块下方的数字
             */
            /* 特例:如果空白块在最下方如一开始x=3,y=0
                  此时x+1就越界了
                因此要做越界判断
             */
            if(x==3){
                //表示空白方块已经在最下方了,他的下方没有图片再能向上移动了-->直接结束方法即可
                return;
            }
​
            //把空白方块下方的数字赋值给空白方块
            data[x][y]=data[x+1][y];
            data[x+1][y]=0;//0代表第0张图片即空白图片
            x++;//空白方块此时向下移动了,x也就自增
            //调用方法按照最新的数字加载图片
            initImage();
​
        } else if (code==39) {
            System.out.println("向右移动");
            /* 逻辑:
                把空白方块左方的数字往右移动
             */
            if(y==0){
                //表示空白方块已经在最左方了,他的左方没有图片再能向右移动了-->直接结束方法即可
                return;
            }
​
            //把空白方块左方的数字赋值给空白方块
            data[x][y]=data[x][y-1]; //x,y表示空白方块
            data[x][y-1]=0;//0代表第0张图片即空白图片
            y--;//空白方块此时向左移动了,y也就自减
            //调用方法按照最新的数字加载图片
            initImage();
​
        } else if (code==40) {
            System.out.println("向下移动");
            /* 逻辑:
                把空白方块上方的数字往下移动
             */
            if(x==0){
                //表示空白方块已经在最上方了,他的上方没有图片再能向下移动了-->直接结束方法即可
                return;
            }
​
            //把空白方块上方的数字赋值给空白方块
            data[x][y]=data[x-1][y];
            data[x-1][y]=0;//0代表第0张图片即空白图片
            x--;//空白方块此时向上移动了,x也就自减
            //调用方法按照最新的数字加载图片
            initImage();
​
        } else if (code==65) {
            //此时是松开了,加载图片即可
            initImage();
        }
    }
}

2.测试类:

import com.itheima.ui.GameJFrame;
import com.itheima.ui.LoginJFrame;
import com.itheima.ui.RegisterJFrame;
​
public class App {
    public static void main(String[] args) {
        //表示程序的启动入口
​
        //如果我们想要开启一个界面,就创建谁的对象就可以了
        //new LoginJFrame();//调用了登录界面的空参构造
​
        //new RegisterJFrame();
​
        new GameJFrame();
    }
}
​
​

3.运行结果:

英文输入法下按A:


四.作弊码:要用到键盘监听

五.作弊码代码实现:

1.代码:

package com.itheima.ui;
​
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
​
public class GameJFrame extends JFrame implements KeyListener {
    /* 注意一定要继承JFrame类
      因为此时要创建一个窗体,而JFrame就是一个界面,窗体,
      继承JFrame的子类也表示界面,窗体
    */
    //规定:GameJFrame这个界面表示的就是游戏的主界面
    //以后跟游戏相关的所有逻辑都写在这个类中
​
​
    //创建一个二维数组
    //目的:用来管理数据
    //加载图片的时候,会根据二维数组中的数据进行加载
    int[][] data=new int[4][4];
​
    //记录空白方块在二维数组中的位置-->一开始设为0
    int x=0;
    int y=0;
​
​
    //定义一个变量,记录当前展示图片的路径
    String path="..\\PuzzleGame\\image\\animal\\animal3\\";
​
​
    public GameJFrame(){
        //初始化界面
        initJFrame();
​
        //初始化菜单
        initJMenuBar();
​
        //初始化数据(打乱)
        initData();
​
​
        //初始化图片(根据打乱之后的结果去加载图片)
        initImage();
​
​
​
        //参数为true显示界面,为false隐藏界面-->建议写最后
        this.setVisible(true);//gameJframe.show();也可以显示界面
    }
​
​
    //初始化数据(打乱)的方法
    private void initData() {
        //1.定义一个一维数组
        int[] tempArr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        //2.打乱数组中数据的顺序
        Random r=new Random();
        for (int i = 0; i < tempArr.length; i++) {
            //a.随机生成一个索引
            int index=r.nextInt(tempArr.length-1);
            //b.与i索引上的元素交换位置
            int temp=tempArr[i];
            tempArr[i]=tempArr[index];
            tempArr[index]=temp;
        }
        //3.给二维数组添加数据
        /*遍历一维数组tempArr得到每一个元素,把每一个元素依次添加到二维数组当中 */
        for (int i = 0; i < tempArr.length; i++) {
            if(tempArr[i]==0){
                //为0时对坐标进行改变
                x=i/4;
                y=i%4;
            } else {
                //不为0时添加到二维数组中
                data[i/4][i%4]=tempArr[i];
            }
​
        }
    }
​
​
    //初始化图片的方法
     //初始化数据(打乱)后,在添加图片时,就需要根据二维数组中管理的数据进行添加图片
    private void initImage() {
        //需要先清空原本已经出现的所有图片
        this.getContentPane().removeAll();//之后重新加载
​
​
​
        /* 路径分为两种:
            1.绝对路径:一定是从盘符开始的,如D:\Java
            2.相对路径:相对路径是相对当前项目而言的,不是从盘符开始的.
                如aaa\\bbb,就是在当前项目下去找aaa文件夹,里面再找bbb文件夹
         */
​
​
        /* 细节:
            先加载的图片在上方,后加载的图片在下方。
            本例中背景图片在下方,应该之后加载
         */
​
        //外循环控制x,内循环控制y----嵌套循环(先看内循环,再看外循环)
        //外循环 --- 把内循环重复执行了四次
        for (int i = 0; i < 4; i++) {
            //内循环 --- 表示在一行添加4张图片
            for (int j = 0; j < 4; j++) {
                //获取当前要加载的图片的序号
                int number=data[i][j];
                //创建一个图片ImageIcon的对象,注:number是整型,要单独写出来
                ImageIcon icon=new ImageIcon(path+number+".jpg");/*这是相对路径,PuzzleGame前有个..\\(..//也行)  */
                //创建一个JLabel的对象(管理容器),本例中没有第16张图片,但也会执行new JLabel,只不过加载了个空白
                JLabel jLabel=new JLabel(icon);//放入icon,代表管理icon
                //指定图片位置(必须是在"把管理容器添加到界面中"前)
                /* 83和134是为了把内容移动到中央偏下(这个数值需要自己测试) */
                jLabel.setBounds(105*j+83,105*i+134,105,105);//第一个参数为横坐标,第二个参数为纵坐标,第三个参数为宽(像素),第四个参数为高(像素)
                //给图片添加边框(new BevelBorder(0)代表让图片凸起来,0是RAISED;new BevelBorder(1)代表让图片凹下去,1是LOWERED)
                jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));//也可以是jLabel.setBorder(new BevelBorder(1));
                //把管理容器添加到界面中
                this.getContentPane().add(jLabel);//getContentPane()用来获取里面隐藏的容器
            }
        }
​
​
        //添加背景图片
        ImageIcon bg=new ImageIcon("..\\PuzzleGame\\image\\background.png");/*这是相对路径,PuzzleGame前有个..\\  */
        //创建一个JLabel的对象(管理容器)
        JLabel background=new JLabel(bg);
        //设置JLabel的对象(管理容器)的位置和宽高-->数值需要自己一点一点测试
        background.setBounds(40,40,508,560);
        //把背景图片(管理容器)添加到界面中
        this.getContentPane().add(background);//getContentPane()用来获取里面隐藏的容器
​
​
​
        //刷新一下界面
        this.getContentPane().repaint();
​
    }
​
​
​
​
​
    //初始化菜单的方法
    private void initJMenuBar() {
        //初始化菜单
        //1.创建整个的菜单对象
        JMenuBar jMenuBar=new JMenuBar();
        //2.创建菜单上面的两个选项的对象(功能  关于我们)
        JMenu functionJMenu=new JMenu("功能");
        JMenu aboutJMenu=new JMenu("关于我们");
        //3.创建选项下面的条目对象
        //功能
        JMenuItem replayItem=new JMenuItem("重新游戏");
        JMenuItem reLoginItem=new JMenuItem("重新登录");
        JMenuItem closeItem=new JMenuItem("关闭游戏");
        //关于我们
        JMenuItem accountItem=new JMenuItem("公众号");
​
​
        //将每一个选项下面的条目添加到选项当中
        //功能
        functionJMenu.add(replayItem);
        functionJMenu.add(reLoginItem);
        functionJMenu.add(closeItem);
        //关于我们
        aboutJMenu.add(accountItem);
​
​
        //将菜单里面的两个选项添加到菜单中
        jMenuBar.add(functionJMenu);
        jMenuBar.add(aboutJMenu);
​
​
        //给整个界面设置菜单
        this.setJMenuBar(jMenuBar);
    }
​
​
​
    //初始化界面的方法
    private void initJFrame() {
        //设置界面的宽高(单位:像素)-->大小根据内容定
        this.setSize(603,680);//第一个参数为宽,第二个参数为高
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式-->不设置的话最终运行后再关闭界面,但程序不停止
        //this.setDefaultCloseOperation(3);//3代表一种关闭规则,可通过看源码了解
        //还可以this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //对于关闭模式,必须每个界面都设置一遍才生效。关闭模式2是关了最后一个才结束,关闭模式3是关一个就结束一个
        //本项目这几个界面不会同时出现,因此用关闭模式3即可
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //取消默认的居中放置,只有取消了才会按照XY轴的形式添加组件
        this.setLayout(null);
        //给整个界面添加键盘监听事件
        this.addKeyListener(this);
    }
​
    @Override
    public void keyTyped(KeyEvent e) {
​
    }
​
    //按下不松时,调用这个方法
    @Override
    public void keyPressed(KeyEvent e) { //按下不松:可用于写快捷键
        int code = e.getKeyCode();
        //本例以A为快捷键,A对应编号为65
        if(code==65){
            //把界面中所有图片全部删除
            this.getContentPane().removeAll();
            //加载第一张完整的图片
            ImageIcon icon=new ImageIcon(path+"all.jpg");
            JLabel all=new JLabel(icon);
            all.setBounds(83,134,420,420);//前两个为坐标,因题而异;后两个为宽高(像素),和图片一致即可
            this.getContentPane().add(all);
            //加载背景图片
            ImageIcon bg=new ImageIcon("..\\PuzzleGame\\image\\background.png");/*这是相对路径,PuzzleGame前有个..\\  */
            JLabel background=new JLabel(bg);
            background.setBounds(40,40,508,560);
            this.getContentPane().add(background);//getContentPane()用来获取里面隐藏的容器
            //刷新界面
            this.getContentPane().repaint();
        }
    }
​
    @Override
    public void keyReleased(KeyEvent e) {
        //对上,下,左,右进行判断(各对应一个编号-->不需要记,用的时候打印一下即可知道编号是几)
        //左:37;上:38;右:39;下:40
        int code=e.getKeyCode();
        if(code==37){
            System.out.println("向左移动");
            /* 逻辑:
                把空白方块右方的数字往左移动
             */
            if(y==3){
                //表示空白方块已经在最右方了,他的右方没有图片再能向左移动了-->直接结束方法即可
                return;
            }
​
            //把空白方块右方的数字赋值给空白方块
            data[x][y]=data[x][y+1]; //x,y表示空白方块
            data[x][y+1]=0;//0代表第0张图片即空白图片
            y++;//空白方块此时向右移动了,y也就自增
            //调用方法按照最新的数字加载图片
            initImage();
​
        } else if (code==38) {
            System.out.println("向上移动");
            /* 逻辑:
                把空白方块下方的数字往上移动
                x,y表示空白方块
                x+1,y表示空白方块下方的数字
             */
            /* 特例:如果空白块在最下方如一开始x=3,y=0
                  此时x+1就越界了
                因此要做越界判断
             */
            if(x==3){
                //表示空白方块已经在最下方了,他的下方没有图片再能向上移动了-->直接结束方法即可
                return;
            }
​
            //把空白方块下方的数字赋值给空白方块
            data[x][y]=data[x+1][y];
            data[x+1][y]=0;//0代表第0张图片即空白图片
            x++;//空白方块此时向下移动了,x也就自增
            //调用方法按照最新的数字加载图片
            initImage();
​
        } else if (code==39) {
            System.out.println("向右移动");
            /* 逻辑:
                把空白方块左方的数字往右移动
             */
            if(y==0){
                //表示空白方块已经在最左方了,他的左方没有图片再能向右移动了-->直接结束方法即可
                return;
            }
​
            //把空白方块左方的数字赋值给空白方块
            data[x][y]=data[x][y-1]; //x,y表示空白方块
            data[x][y-1]=0;//0代表第0张图片即空白图片
            y--;//空白方块此时向左移动了,y也就自减
            //调用方法按照最新的数字加载图片
            initImage();
​
        } else if (code==40) {
            System.out.println("向下移动");
            /* 逻辑:
                把空白方块上方的数字往下移动
             */
            if(x==0){
                //表示空白方块已经在最上方了,他的上方没有图片再能向下移动了-->直接结束方法即可
                return;
            }
​
            //把空白方块上方的数字赋值给空白方块
            data[x][y]=data[x-1][y];
            data[x-1][y]=0;//0代表第0张图片即空白图片
            x--;//空白方块此时向上移动了,x也就自减
            //调用方法按照最新的数字加载图片
            initImage();
​
        } else if (code==65) {
            //此时是松开了,加载图片即可
            initImage();
​
        } else if (code==87) { //本例以W为作弊码,W对应编码为87
            //直接把二维数组里的数据变为最终效果即可
            data=new int[][]{  //直接添加元素,1到15和0是图片编号-->元素内容就是最终效果
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0},
            };
            //重新加载图片
            initImage();
        }
    }
}

2.测试类:

import com.itheima.ui.GameJFrame;
import com.itheima.ui.LoginJFrame;
import com.itheima.ui.RegisterJFrame;
​
public class App {
    public static void main(String[] args) {
        //表示程序的启动入口
​
        //如果我们想要开启一个界面,就创建谁的对象就可以了
        //new LoginJFrame();//调用了登录界面的空参构造
​
        //new RegisterJFrame();
​
        new GameJFrame();
    }
}
​
​

3.运行结果:

英文输入法下按下W松开后:


六.判断胜利:

七.判断胜利代码实现(注意:胜利后不能再执行移动拼图的代码了)

1.代码:

package com.itheima.ui;
​
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
​
public class GameJFrame extends JFrame implements KeyListener {
    /* 注意一定要继承JFrame类
      因为此时要创建一个窗体,而JFrame就是一个界面,窗体,
      继承JFrame的子类也表示界面,窗体
    */
    //规定:GameJFrame这个界面表示的就是游戏的主界面
    //以后跟游戏相关的所有逻辑都写在这个类中
​
​
    //创建一个二维数组
    //目的:用来管理数据
    //加载图片的时候,会根据二维数组中的数据进行加载
    int[][] data=new int[4][4];
​
    //记录空白方块在二维数组中的位置-->一开始设为0
    int x=0;
    int y=0;
​
​
    //定义一个变量,记录当前展示图片的路径
    String path="..\\PuzzleGame\\image\\animal\\animal3\\";
​
​
    //定义一个二维数组,存储正确的数据
    int[][] win={
        {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12},
        {13,14,15,0},
    };
​
​
    public GameJFrame(){
        //初始化界面
        initJFrame();
​
        //初始化菜单
        initJMenuBar();
​
        //初始化数据(打乱)
        initData();
​
​
        //初始化图片(根据打乱之后的结果去加载图片)
        initImage();
​
​
​
        //参数为true显示界面,为false隐藏界面-->建议写最后
        this.setVisible(true);//gameJframe.show();也可以显示界面
    }
​
​
    //初始化数据(打乱)的方法
    private void initData() {
        //1.定义一个一维数组
        int[] tempArr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        //2.打乱数组中数据的顺序
        Random r=new Random();
        for (int i = 0; i < tempArr.length; i++) {
            //a.随机生成一个索引
            int index=r.nextInt(tempArr.length-1);
            //b.与i索引上的元素交换位置
            int temp=tempArr[i];
            tempArr[i]=tempArr[index];
            tempArr[index]=temp;
        }
        //3.给二维数组添加数据
        /*遍历一维数组tempArr得到每一个元素,把每一个元素依次添加到二维数组当中 */
        for (int i = 0; i < tempArr.length; i++) {
            if(tempArr[i]==0){
                //为0时对坐标进行改变
                x=i/4;
                y=i%4;
            } else {
                //不为0时添加到二维数组中
                data[i/4][i%4]=tempArr[i];
            }
​
        }
    }
​
​
    //初始化图片的方法
     //初始化数据(打乱)后,在添加图片时,就需要根据二维数组中管理的数据进行添加图片
    private void initImage() {
        //需要先清空原本已经出现的所有图片
        this.getContentPane().removeAll();//之后重新加载
​
​
        if(victory()){
            //走if说明方法victory返回true,即胜利
            //需要显示胜利的图标
            JLabel winJLabel=new JLabel(new ImageIcon("D:\\Java\\PuzzleGame\\image\\win.png"));
            //设置图标
            winJLabel.setBounds(203,283,197,73);
            this.getContentPane().add(winJLabel);
        }
​
​
​
        /* 路径分为两种:
            1.绝对路径:一定是从盘符开始的,如D:\Java
            2.相对路径:相对路径是相对当前项目而言的,不是从盘符开始的.
                如aaa\\bbb,就是在当前项目下去找aaa文件夹,里面再找bbb文件夹
         */
​
​
        /* 细节:
            先加载的图片在上方,后加载的图片在下方。
            本例中背景图片在下方,应该之后加载
         */
​
        //外循环控制x,内循环控制y----嵌套循环(先看内循环,再看外循环)
        //外循环 --- 把内循环重复执行了四次
        for (int i = 0; i < 4; i++) {
            //内循环 --- 表示在一行添加4张图片
            for (int j = 0; j < 4; j++) {
                //获取当前要加载的图片的序号
                int number=data[i][j];
                //创建一个图片ImageIcon的对象,注:number是整型,要单独写出来
                ImageIcon icon=new ImageIcon(path+number+".jpg");/*这是相对路径,PuzzleGame前有个..\\(..//也行)  */
                //创建一个JLabel的对象(管理容器),本例中没有第16张图片,但也会执行new JLabel,只不过加载了个空白
                JLabel jLabel=new JLabel(icon);//放入icon,代表管理icon
                //指定图片位置(必须是在"把管理容器添加到界面中"前)
                /* 83和134是为了把内容移动到中央偏下(这个数值需要自己测试) */
                jLabel.setBounds(105*j+83,105*i+134,105,105);//第一个参数为横坐标,第二个参数为纵坐标,第三个参数为宽(像素),第四个参数为高(像素)
                //给图片添加边框(new BevelBorder(0)代表让图片凸起来,0是RAISED;new BevelBorder(1)代表让图片凹下去,1是LOWERED)
                jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));//也可以是jLabel.setBorder(new BevelBorder(1));
                //把管理容器添加到界面中
                this.getContentPane().add(jLabel);//getContentPane()用来获取里面隐藏的容器
            }
        }
​
​
        //添加背景图片
        ImageIcon bg=new ImageIcon("..\\PuzzleGame\\image\\background.png");/*这是相对路径,PuzzleGame前有个..\\  */
        //创建一个JLabel的对象(管理容器)
        JLabel background=new JLabel(bg);
        //设置JLabel的对象(管理容器)的位置和宽高-->数值需要自己一点一点测试
        background.setBounds(40,40,508,560);
        //把背景图片(管理容器)添加到界面中
        this.getContentPane().add(background);//getContentPane()用来获取里面隐藏的容器
​
​
​
        //刷新一下界面
        this.getContentPane().repaint();
​
    }
​
​
​
​
​
    //初始化菜单的方法
    private void initJMenuBar() {
        //初始化菜单
        //1.创建整个的菜单对象
        JMenuBar jMenuBar=new JMenuBar();
        //2.创建菜单上面的两个选项的对象(功能  关于我们)
        JMenu functionJMenu=new JMenu("功能");
        JMenu aboutJMenu=new JMenu("关于我们");
        //3.创建选项下面的条目对象
        //功能
        JMenuItem replayItem=new JMenuItem("重新游戏");
        JMenuItem reLoginItem=new JMenuItem("重新登录");
        JMenuItem closeItem=new JMenuItem("关闭游戏");
        //关于我们
        JMenuItem accountItem=new JMenuItem("公众号");
​
​
        //将每一个选项下面的条目添加到选项当中
        //功能
        functionJMenu.add(replayItem);
        functionJMenu.add(reLoginItem);
        functionJMenu.add(closeItem);
        //关于我们
        aboutJMenu.add(accountItem);
​
​
        //将菜单里面的两个选项添加到菜单中
        jMenuBar.add(functionJMenu);
        jMenuBar.add(aboutJMenu);
​
​
        //给整个界面设置菜单
        this.setJMenuBar(jMenuBar);
    }
​
​
​
    //初始化界面的方法
    private void initJFrame() {
        //设置界面的宽高(单位:像素)-->大小根据内容定
        this.setSize(603,680);//第一个参数为宽,第二个参数为高
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式-->不设置的话最终运行后再关闭界面,但程序不停止
        //this.setDefaultCloseOperation(3);//3代表一种关闭规则,可通过看源码了解
        //还可以this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //对于关闭模式,必须每个界面都设置一遍才生效。关闭模式2是关了最后一个才结束,关闭模式3是关一个就结束一个
        //本项目这几个界面不会同时出现,因此用关闭模式3即可
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //取消默认的居中放置,只有取消了才会按照XY轴的形式添加组件
        this.setLayout(null);
        //给整个界面添加键盘监听事件
        this.addKeyListener(this);
    }
​
    @Override
    public void keyTyped(KeyEvent e) {
​
    }
​
    //按下不松时,调用这个方法
    @Override
    public void keyPressed(KeyEvent e) { //按下不松:可用于写快捷键
        int code = e.getKeyCode();
        //本例以A为快捷键,A对应编号为65
        if(code==65){
            //把界面中所有图片全部删除
            this.getContentPane().removeAll();
            //加载第一张完整的图片
            ImageIcon icon=new ImageIcon(path+"all.jpg");
            JLabel all=new JLabel(icon);
            all.setBounds(83,134,420,420);//前两个为坐标,因题而异;后两个为宽高(像素),和图片一致即可
            this.getContentPane().add(all);
            //加载背景图片
            ImageIcon bg=new ImageIcon("..\\PuzzleGame\\image\\background.png");/*这是相对路径,PuzzleGame前有个..\\  */
            JLabel background=new JLabel(bg);
            background.setBounds(40,40,508,560);
            this.getContentPane().add(background);//getContentPane()用来获取里面隐藏的容器
            //刷新界面
            this.getContentPane().repaint();
        }
    }
​
    @Override
    public void keyReleased(KeyEvent e) {
        //需要先判断游戏是否胜利,如果胜利,此方法需要直接结束,不能再执行下面的移动代码了
        if(victory()){
            //走if说明方法victory返回true,即胜利-->结束方法
            return;
        }
​
​
        //对上,下,左,右进行判断(各对应一个编号-->不需要记,用的时候打印一下即可知道编号是几)
        //左:37;上:38;右:39;下:40
        int code=e.getKeyCode();
        if(code==37){
            System.out.println("向左移动");
            /* 逻辑:
                把空白方块右方的数字往左移动
             */
            if(y==3){
                //表示空白方块已经在最右方了,他的右方没有图片再能向左移动了-->直接结束方法即可
                return;
            }
​
            //把空白方块右方的数字赋值给空白方块
            data[x][y]=data[x][y+1]; //x,y表示空白方块
            data[x][y+1]=0;//0代表第0张图片即空白图片
            y++;//空白方块此时向右移动了,y也就自增
            //调用方法按照最新的数字加载图片
            initImage();
​
        } else if (code==38) {
            System.out.println("向上移动");
            /* 逻辑:
                把空白方块下方的数字往上移动
                x,y表示空白方块
                x+1,y表示空白方块下方的数字
             */
            /* 特例:如果空白块在最下方如一开始x=3,y=0
                  此时x+1就越界了
                因此要做越界判断
             */
            if(x==3){
                //表示空白方块已经在最下方了,他的下方没有图片再能向上移动了-->直接结束方法即可
                return;
            }
​
            //把空白方块下方的数字赋值给空白方块
            data[x][y]=data[x+1][y];
            data[x+1][y]=0;//0代表第0张图片即空白图片
            x++;//空白方块此时向下移动了,x也就自增
            //调用方法按照最新的数字加载图片
            initImage();
​
        } else if (code==39) {
            System.out.println("向右移动");
            /* 逻辑:
                把空白方块左方的数字往右移动
             */
            if(y==0){
                //表示空白方块已经在最左方了,他的左方没有图片再能向右移动了-->直接结束方法即可
                return;
            }
​
            //把空白方块左方的数字赋值给空白方块
            data[x][y]=data[x][y-1]; //x,y表示空白方块
            data[x][y-1]=0;//0代表第0张图片即空白图片
            y--;//空白方块此时向左移动了,y也就自减
            //调用方法按照最新的数字加载图片
            initImage();
​
        } else if (code==40) {
            System.out.println("向下移动");
            /* 逻辑:
                把空白方块上方的数字往下移动
             */
            if(x==0){
                //表示空白方块已经在最上方了,他的上方没有图片再能向下移动了-->直接结束方法即可
                return;
            }
​
            //把空白方块上方的数字赋值给空白方块
            data[x][y]=data[x-1][y];
            data[x-1][y]=0;//0代表第0张图片即空白图片
            x--;//空白方块此时向上移动了,x也就自减
            //调用方法按照最新的数字加载图片
            initImage();
​
        } else if (code==65) {
            //此时是松开了,加载图片即可
            initImage();
​
        } else if (code==87) { //本例以W为作弊码,W对应编码为87
            //直接把二维数组里的数据变为最终效果即可
            data=new int[][]{  //直接添加元素,1到15和0是图片编号-->元素内容就是最终效果
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0},
            };
            //重新加载图片
            initImage();
        }
    }
​
​
​
    //定义一个方法,用来判断胜利
    /* 判断data数组中的数据是否跟win数组中相同
          如果全部相同,返回true,否则返回false
     */
    public boolean victory(){
        for (int i = 0; i < data.length; i++) {
            //i:依次表示二维数组data里面的索引
            //data[i]:依次表示每一个一维数组
            for (int j = 0; j < data[i].length; j++) {
                if (data[i][j]!=win[i][j]) {
                    //只要有一个数据不一样就没赢,返回false
                    return false;
                }
            }
        }
        //此时还没有结束方法,循环结束表示数组遍历比较完毕,全部一样返回true
        return true;
    }
}

2.测试类:

import com.itheima.ui.GameJFrame;
import com.itheima.ui.LoginJFrame;
import com.itheima.ui.RegisterJFrame;
​
public class App {
    public static void main(String[] args) {
        //表示程序的启动入口
​
        //如果我们想要开启一个界面,就创建谁的对象就可以了
        //new LoginJFrame();//调用了登录界面的空参构造
​
        //new RegisterJFrame();
​
        new GameJFrame();
    }
}
​
​

3.运行结果:


  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
辍学dropout作弊码是指学生在辍学后通过作弊手段获取不正当的考试成绩。辍学本身是指学生提前放弃学业,未完成学校规定的学业要求而退学。在这种情况下,学生可能面临一定的学业压力和未来发展的困境。 然而,一些辍学的学生可能通过作弊来应对这些困境。作弊可以包括替代他人参加考试、抄袭他人作品或使用不正当的辅助工具等手段以获取不公平的优势。这些作弊行为是不道德的,且违反了学校和社会的规则和价值观。 辍学dropout作弊码的存在对学生和社会都带来了许多负面影响。对学生而言,他们通过作弊可能会获得不真实的成绩,这将误导他们对自身能力的认识,丧失了自我评估的能力。此外,辍学的学生如果被揭穿作弊行为,可能会丧失再次回归学校学习或找工作的机会。 对社会而言,由于辍学dropout作弊码的存在,不公平竞争的现象会逐渐蔓延。这将破坏教育的基本原则,削弱对知识的认真追求和对道德价值观的尊重。 因此,我们应该尽力避免辍学dropout作弊码的存在。学校和教育机构应该加强对学生的教育和引导,强调诚实、诚信和努力的重要性,并提供必要的帮助和支持,以防止学生辍学和作弊的情况发生。同时,社会也应该为辍学学生提供适当的培训和职业指导,帮助他们重新投入学习和工作中,为他们创造更好的未来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值