javase复习day16阶段综合项目

拼图小游戏

java的图像的图形化操作界面

主界面分析

练习一:创建主界面1

public class Test {
    public static void main(String[] args) {
        //游戏主界面
        //界面默认为隐藏状态
        JFrame GaneJFrame = new JFrame();
        GaneJFrame.setSize(603,680);
        //设置界面状态为显示
        GaneJFrame.setVisible(true);
        //登录界面
        JFrame LoginJFrame = new JFrame();
        LoginJFrame.setSize(488,430);
        LoginJFrame.setVisible(true);
        //注册界面
        JFrame RegisterJFrame = new JFrame();
        RegisterJFrame.setSize(488,500);
        RegisterJFrame.setVisible(true);
    }
}

将这三个个界面分别设置为三个类,有一个app类调用,界面的逻辑写在三个类中,三个类继承JFrame类并用无参构造来进行初始化。

public class GameJFrame extends JFrame {
    public GameJFrame() {
        this.setSize(603,680);
        this.setVisible(true);
    }
}
package com.czk.ui;

import javax.swing.*;

public class LoginJFrame extends JFrame {
    public LoginJFrame() {
        this.setSize(488,430);
        this.setVisible(true);
    }
}
package com.czk.ui;

import javax.swing.*;

public class RegisterJFrame extends JFrame {
    public RegisterJFrame() {
        this.setSize(488,500);
        this.setVisible(true);
    }
}
import com.czk.ui.GameJFrame;
import com.czk.ui.LoginJFrame;
import com.czk.ui.RegisterJFrame;

public class app {
    public static void main(String[] args) {
        new GameJFrame();
        new LoginJFrame();
        new RegisterJFrame();
    }
}

练习二:创建主界面二

各个画面修改相同

        //设置界面的标题
        this.setTitle("拼图单机版 v1.0 注册");
        //设置画面置顶
        this.setAlwaysOnTop(true);
        //设置画面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式,任意个界面关闭则关闭虚拟机
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //设置显示效果,一般放在最后
        this.setVisible(true);

菜单制作

练习

只修改了游戏主界面:将各个过程抽取为了方法。

package com.czk.ui;

import javax.swing.*;
import java.awt.*;

public class GameJFrame extends JFrame {
    public GameJFrame() {
        //初始化界面
        initialize_interface();

        //初始化菜单
        initialize();

        //设置显示效果,一般放在最后
        this.setVisible(true);
    }

    private void initialize_interface() {
        //设置长宽
        this.setSize(603,680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置画面置顶
        this.setAlwaysOnTop(true);
        //设置画面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式,任意个界面关闭则关闭虚拟机
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    private void initialize() {
        JMenuBar jMenuBar = new JMenuBar();

        JMenu functionjMenuBar = new JMenu("功能");
        JMenu aboutjMenuBar = new JMenu("关于我们");

        JMenuItem RestartjMenuItem = new JMenuItem("重新开始");
        JMenuItem SignjMenuItem = new JMenuItem("重新登录");
        JMenuItem ColosjMenuItem = new JMenuItem("关闭游戏");
        JMenuItem AccountjMenuItem = new JMenuItem("公众号");

        //将这些组件联系起来
        functionjMenuBar.add(RestartjMenuItem);
        functionjMenuBar.add(SignjMenuItem);
        functionjMenuBar.add(ColosjMenuItem);
        aboutjMenuBar.add(AccountjMenuItem);

        jMenuBar.add(functionjMenuBar);
        jMenuBar.add(aboutjMenuBar);

        //将菜单组件交给界面

        this.setJMenuBar(jMenuBar);
    }
}

添加图片

写在初始化菜单的下面,在无参构造中

        //初始化图片
        //将图片交给ImageIcon
        ImageIcon imageIcon = new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\girl\\girl1\\13.jpg");
        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
        JLabel jLabel = new JLabel(imageIcon);
        //将JLabel对象交给页面
        this.add(jLabel);

设立坐标确定图片的位置。

 修改的代码:

22-25行:修改了jLabel交给的容器

        //将JLabel对象交给页面
//        this.add(jLabel);
        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
        this.getContentPane().add(jLabel);

 20-21行:使用坐标轴指定图片的位置

        //指定图片位置
        jLabel.setBounds(0,0,105,105);

43-44行:将默认布局置为空,即关闭默认的居中布局。

//        //关闭默认的布局,将布局设置为空
        this.setLayout(null);
package com.czk.ui;

import javax.swing.*;
import java.awt.*;

public class GameJFrame extends JFrame {
    public GameJFrame() {
        //初始化界面
        initialize_interface();

        //初始化菜单
        initialize();

        //初始化图片
        //将图片交给ImageIcon
        ImageIcon imageIcon = new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\girl\\girl1\\1.jpg");
        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
        JLabel jLabel = new JLabel(imageIcon);

        //指定图片位置
        jLabel.setBounds(0,0,105,105);
        //将JLabel对象交给页面
        this.add(jLabel);
        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
        this.getContentPane().add(jLabel);

        //设置显示效果,一般放在最后
        this.setVisible(true);
    }

    private void initialize_interface() {
        //设置长宽
        this.setSize(603,680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置画面置顶
        this.setAlwaysOnTop(true);
        //设置画面居中
        this.setLocationRelativeTo(null);

        //设置关闭模式,任意个界面关闭则关闭虚拟机
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//        //关闭默认的布局,将布局设置为空
        this.setLayout(null);
    }

    private void initialize() {
        JMenuBar jMenuBar = new JMenuBar();

        JMenu functionjMenuBar = new JMenu("功能");
        JMenu aboutjMenuBar = new JMenu("关于我们");

        JMenuItem RestartjMenuItem = new JMenuItem("重新开始");
        JMenuItem SignjMenuItem = new JMenuItem("重新登录");
        JMenuItem ColosjMenuItem = new JMenuItem("关闭游戏");
        JMenuItem AccountjMenuItem = new JMenuItem("公众号");

        //将这些组件联系起来
        functionjMenuBar.add(RestartjMenuItem);
        functionjMenuBar.add(SignjMenuItem);
        functionjMenuBar.add(ColosjMenuItem);
        aboutjMenuBar.add(AccountjMenuItem);

        jMenuBar.add(functionjMenuBar);
        jMenuBar.add(aboutjMenuBar);

        //将菜单组件交给界面

        this.setJMenuBar(jMenuBar);
    }
}

图片添加全部

提取为一个方法,使用for循环进行遍历,并在String字符串中插入数字来修改获取哪个图片

    //初始化菜单
    private void initialize() {
        JMenuBar jMenuBar = new JMenuBar();

        JMenu functionjMenuBar = new JMenu("功能");
        JMenu aboutjMenuBar = new JMenu("关于我们");

        JMenuItem RestartjMenuItem = new JMenuItem("重新开始");
        JMenuItem SignjMenuItem = new JMenuItem("重新登录");
        JMenuItem ColosjMenuItem = new JMenuItem("关闭游戏");
        JMenuItem AccountjMenuItem = new JMenuItem("公众号");

        //将这些组件联系起来
        functionjMenuBar.add(RestartjMenuItem);
        functionjMenuBar.add(SignjMenuItem);
        functionjMenuBar.add(ColosjMenuItem);
        aboutjMenuBar.add(AccountjMenuItem);

        jMenuBar.add(functionjMenuBar);
        jMenuBar.add(aboutjMenuBar);

        //将菜单组件交给界面

        this.setJMenuBar(jMenuBar);
    }

游戏主页面添加组件小结

练习:打乱一维数组中的数据

public class Test {
    public static void main(String[] args) {
        //定义一个一维数组
        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[index];
            tempArr[index] = tempArr[i];
            tempArr[i] = temp;
        }
        for (int i = 0; i < tempArr.length; i++) {
            System.out.print(tempArr[i] +", ");
        }
        System.out.println();
        //四个一组添加到二维数组中
        //解法一:
//        int[][] date = new int[4][4];
//        for (int i = 0; i < tempArr.length; i++) {
//            date[i/4][i%4] = tempArr[i];
//        }
        //定义count用于记录tempArr数字的角标
        int count = 0;
        //定义一个4*4的二维数组
        int[][] arr = new int[4][4];
        for (int i = 0; i < arr.length; i++) {
            for (int i1 = 0; i1 < arr[i].length; i1++) {
                arr[i][i1] = tempArr[count];
                count++;
            }
        }

        //将得到的二维数组遍历
        for (int i = 0; i < arr.length; i++) {
            for (int i1 = 0; i1 < arr[i].length; i1++) {
                System.out.print(arr[i][i1] + " ");
            }
            System.out.println();
        }
    }
}

打乱图片

在初始化数据中设置二维数组存储每个图片应该耳的位置,在初始化图片是将各个图片按照位置放置

package com.czk.ui;

import javax.swing.*;
import java.awt.*;
import java.util.Random;

public class GameJFrame extends JFrame {

    //定义一个4*4的二维数组
    //用来管理数据
    int[][] arr = new int[4][4];
    public GameJFrame() {
        //初始化界面
        initialize_interface();

        //初始化菜单
        initialize();

        //初始化数据
        initeDate();

        //初始化图片
        startImage();


        //设置显示效果,一般放在最后
        this.setVisible(true);
    }

    //初始化数据
    private void initeDate() {
        //定义一个一维数组
        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[index];
            tempArr[index] = tempArr[i];
            tempArr[i] = temp;
        }
        for (int i = 0; i < tempArr.length; i++) {
            System.out.print(tempArr[i] +", ");
        }
        System.out.println();
        //四个一组添加到二维数组中
        //解法一:
//        int[][] date = new int[4][4];
//        for (int i = 0; i < tempArr.length; i++) {
//            date[i/4][i%4] = tempArr[i];
//        }
        //定义count用于记录tempArr数字的角标
        int count = 0;

        for (int i = 0; i < arr.length; i++) {
            for (int i1 = 0; i1 < arr[i].length; i1++) {
                arr[i][i1] = tempArr[count];
                count++;
            }
        }
    }

    //初始化图片
    private void startImage() {
        //样板:方便理解
//        //初始化图片
//        //将图片交给ImageIcon
//        ImageIcon imageIcon = new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\girl\\girl1\\1.jpg");
//        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
//        JLabel jLabel = new JLabel(imageIcon);
//
//        //指定图片位置
//        jLabel.setBounds(0,0,105,105);
//        //将JLabel对象交给页面
        this.add(jLabel);
//        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
//        this.getContentPane().add(jLabel);



        //一共方四行
        for (int i = 0;i<4;i++) {
            //表示在一行方四个图片
            for (int j = 0; j < 4; j++) {
                int number =arr[i][j];
                JLabel jLabel1 = new JLabel(new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\animal\\animal3\\"+number+".jpg"));
                jLabel1.setBounds(j*105,i*105,105,105);
                this.getContentPane().add(jLabel1);
            }
        }
    }

    //初始化界面
    private void initialize_interface() {
        //设置长宽
        this.setSize(603,680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置画面置顶
        this.setAlwaysOnTop(true);
        //设置画面居中
        this.setLocationRelativeTo(null);

        //设置关闭模式,任意个界面关闭则关闭虚拟机
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//        //关闭默认的布局,将布局设置为空
        this.setLayout(null);
    }

    //初始化菜单
    private void initialize() {
        JMenuBar jMenuBar = new JMenuBar();

        JMenu functionjMenuBar = new JMenu("功能");
        JMenu aboutjMenuBar = new JMenu("关于我们");

        JMenuItem RestartjMenuItem = new JMenuItem("重新开始");
        JMenuItem SignjMenuItem = new JMenuItem("重新登录");
        JMenuItem ColosjMenuItem = new JMenuItem("关闭游戏");
        JMenuItem AccountjMenuItem = new JMenuItem("公众号");

        //将这些组件联系起来
        functionjMenuBar.add(RestartjMenuItem);
        functionjMenuBar.add(SignjMenuItem);
        functionjMenuBar.add(ColosjMenuItem);
        aboutjMenuBar.add(AccountjMenuItem);

        jMenuBar.add(functionjMenuBar);
        jMenuBar.add(aboutjMenuBar);

        //将菜单组件交给界面

        this.setJMenuBar(jMenuBar);
    }
}

事件

事件就是可以被组件识别的操作。

练习一:使用匿名内部类来设置事件

package com.czk.Test;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Test3 {
    public static void main(String[] args) {
        JFrame jFrame= new JFrame();
            //设置长宽
        jFrame.setSize(603,680);
            //设置界面的标题
        jFrame.setTitle("拼图单机版 v1.0");
            //设置画面置顶
        jFrame.setAlwaysOnTop(true);
            //设置画面居中
        jFrame.setLocationRelativeTo(null);
        //设置关闭模式,任意个界面关闭则关闭虚拟机
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//        //关闭默认的布局,将布局设置为空
        jFrame.setLayout(null);

        //创建按钮对象
        JButton jb = new JButton("点我啊");
        //设置按钮位置
        jb.setBounds(0,0,100,100);
            //绑定事件监听
        jb.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("不要在点了");
            }
        });

        //将按钮添加到界面中
        jFrame.getContentPane().add(jb);

        jFrame.setVisible(true);

    }
}

练习二:使用类实现接口来设置事件

package com.czk.Test;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

public class MyAction extends JFrame implements ActionListener{
    //将两个按钮对象放在成员位置,两个方法都要用到。
    //创建按钮对象
    JButton jb = new JButton("点我啊");
    //创建第二个按钮对象
    JButton jbt = new JButton("点不到把");
    public  void show() {
        JFrame jFrame= new JFrame();
        //设置长宽
        jFrame.setSize(603,680);
        //设置界面的标题
        jFrame.setTitle("拼图单机版 v1.0");
        //设置画面置顶
        jFrame.setAlwaysOnTop(true);
        //设置画面居中
        jFrame.setLocationRelativeTo(null);
        //设置关闭模式,任意个界面关闭则关闭虚拟机
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//        //关闭默认的布局,将布局设置为空
        jFrame.setLayout(null);


        //设置按钮位置
        jb.setBounds(0,0,100,100);
        jbt.setBounds(200,200,100,100);
        //绑定事件监听
        jb.addActionListener(this);

        jbt.addActionListener(this);

        //将按钮添加到界面中
        jFrame.getContentPane().add(jb);
        jFrame.getContentPane().add(jbt);

        jFrame.setVisible(true);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //对当前按钮进行判断
        //获取被操作的按钮对象
        Object source = e.getSource();
        if (source == jb){
            System.out.println("别点了");
        } else if (source == jbt) {
            //随机jbt的位置
            Random r=new Random();
            jbt.setBounds(r.nextInt(500),r.nextInt(500),100,100);
        }
    }
}
package com.czk.Test;

public class Test4 {
    public static void main(String[] args) {
        MyAction a = new MyAction();
        a.show();
    }
}

鼠标监听机制

package com.czk.Test;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;

public class MyJfram2 implements MouseListener {

        public  void show() {
            JFrame jFrame= new JFrame();
            //设置长宽
            jFrame.setSize(603,680);
            //设置界面的标题
            jFrame.setTitle("拼图单机版 v1.0");
            //设置画面置顶
            jFrame.setAlwaysOnTop(true);
            //设置画面居中
            jFrame.setLocationRelativeTo(null);
            //设置关闭模式,任意个界面关闭则关闭虚拟机
            jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//        //关闭默认的布局,将布局设置为空
            jFrame.setLayout(null);
            //创建按钮对象
            JButton jb = new JButton("点我啊");

            //设置按钮位置
            jb.setBounds(0,0,100,100);
            //绑定鼠标监听
            jb.addMouseListener(this);

            //将按钮添加到界面中
            jFrame.getContentPane().add(jb);

            jFrame.setVisible(true);

        }

    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("单击");
    }

    @Override
    public void mousePressed(MouseEvent e) {
        System.out.println("按下不松");
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        System.out.println("松开");
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        System.out.println("划入");
    }

    @Override
    public void mouseExited(MouseEvent e) {
        System.out.println("划出");
    }
}

键盘监听

第三个方法通常不用,部分键位无法使用

package com.czk.Test;

import javax.swing.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;


public class MyJfram3 implements KeyListener {


        public  void show() {
            JFrame jFrame= new JFrame();
            //设置长宽
            jFrame.setSize(603,680);
            //设置界面的标题
            jFrame.setTitle("拼图单机版 v1.0");
            //设置画面置顶
            jFrame.setAlwaysOnTop(true);
            //设置画面居中
            jFrame.setLocationRelativeTo(null);
            //设置关闭模式,任意个界面关闭则关闭虚拟机
            jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//        //关闭默认的布局,将布局设置为空
            jFrame.setLayout(null);

            //绑定键盘监听
            //jFrame,界面对象,将键盘监听交个界面
            //addKeyListener 表示给本界面添加键盘监听
            //this 表示调用本类中的方法
            jFrame.addKeyListener(this);


            jFrame.setVisible(true);

        }


    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("按下不松");
    }

    @Override
    //keyCode与ASCII码无关
    public void keyReleased(KeyEvent e) {
        System.out.println("松开按键");
        int keyCode = e.getKeyCode();
        System.out.println(keyCode);
        if (keyCode == 65){
            System.out.println("按下的是A键");
        } else if (keyCode == 66) {
            System.out.println("按下的是B键");
        }
    }
}

美化界面

package com.czk.ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
import java.util.Random;

public class GameJFrame extends JFrame {

    //定义一个4*4的二维数组
    //用来管理数据
    int[][] arr = new int[4][4];
    public GameJFrame() {
        //初始化界面
        initialize_interface();

        //初始化菜单
        initialize();

        //初始化数据
        initeDate();

        //初始化图片
        startImage();


        //设置显示效果,一般放在最后
        this.setVisible(true);
    }

    //初始化数据
    private void initeDate() {
        //定义一个一维数组
        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[index];
            tempArr[index] = tempArr[i];
            tempArr[i] = temp;
        }
        for (int i = 0; i < tempArr.length; i++) {
            System.out.print(tempArr[i] +", ");
        }
        System.out.println();
        //四个一组添加到二维数组中
        //解法一:
//        int[][] date = new int[4][4];
//        for (int i = 0; i < tempArr.length; i++) {
//            date[i/4][i%4] = tempArr[i];
//        }
        //定义count用于记录tempArr数字的角标
        int count = 0;

        for (int i = 0; i < arr.length; i++) {
            for (int i1 = 0; i1 < arr[i].length; i1++) {
                arr[i][i1] = tempArr[count];
                count++;
            }
        }
    }

    //初始化图片
    private void startImage() {
        //样板:方便理解
//        //初始化图片
//        //将图片交给ImageIcon
//        ImageIcon imageIcon = new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\girl\\girl1\\1.jpg");
//        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
//        JLabel jLabel = new JLabel(imageIcon);
//
//        //指定图片位置
//        jLabel.setBounds(0,0,105,105);
//        //将JLabel对象交给页面
        this.add(jLabel);
//        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
//        this.getContentPane().add(jLabel);



        //一共方四行
        for (int i = 0;i<4;i++) {
            //表示在一行方四个图片
            for (int j = 0; j < 4; j++) {
                int number =arr[i][j];
                JLabel jLabel1 = new JLabel(new ImageIcon("javaseday16\\素材\\素材\\image\\animal\\animal3\\"+number+".jpg"));
                jLabel1.setBounds(j*105+83,i*105+134,105,105);
                //添加边框
                //BevelBorder.LOWERED,1表示图片下陷
                //0 表示图片上凸
                jLabel1.setBorder(new BevelBorder(BevelBorder.LOWERED));
                this.getContentPane().add(jLabel1);
            }
        }
        //添加背景图,先添加的在上面
        //将图片交给ImageIcon
        ImageIcon imageIcon = new ImageIcon("javaseday16\\素材\\素材\\image\\background.png");
        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
        JLabel jLabel = new JLabel(imageIcon);

        //指定图片位置
        jLabel.setBounds(40,40,508,560);
        //将JLabel对象交给页面
//        this.add(jLabel);
        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
        this.getContentPane().add(jLabel);
    }

    //初始化界面
    private void initialize_interface() {
        //设置长宽
        this.setSize(603,680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置画面置顶
        this.setAlwaysOnTop(true);
        //设置画面居中
        this.setLocationRelativeTo(null);

        //设置关闭模式,任意个界面关闭则关闭虚拟机
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//        //关闭默认的布局,将布局设置为空
        this.setLayout(null);
    }

    //初始化菜单
    private void initialize() {
        JMenuBar jMenuBar = new JMenuBar();

        JMenu functionjMenuBar = new JMenu("功能");
        JMenu aboutjMenuBar = new JMenu("关于我们");

        JMenuItem RestartjMenuItem = new JMenuItem("重新开始");
        JMenuItem SignjMenuItem = new JMenuItem("重新登录");
        JMenuItem ColosjMenuItem = new JMenuItem("关闭游戏");
        JMenuItem AccountjMenuItem = new JMenuItem("公众号");

        //将这些组件联系起来
        functionjMenuBar.add(RestartjMenuItem);
        functionjMenuBar.add(SignjMenuItem);
        functionjMenuBar.add(ColosjMenuItem);
        aboutjMenuBar.add(AccountjMenuItem);

        jMenuBar.add(functionjMenuBar);
        jMenuBar.add(aboutjMenuBar);

        //将菜单组件交给界面

        this.setJMenuBar(jMenuBar);
    }
}

上下左右移动

上移动

package com.czk.ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener {

    //定义一个4*4的二维数组
    //用来管理数据
    int[][] arr = new int[4][4];
    //记录空白块的位置
    int x =0;
    int y = 0;
    public GameJFrame() {
        //初始化界面
        initialize_interface();

        //初始化菜单
        initialize();

        //初始化数据
        initeDate();

        //初始化图片
        startImage();


        //设置显示效果,一般放在最后
        this.setVisible(true);
    }

    //初始化数据
    private void initeDate() {
        //定义一个一维数组
        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[index];
            tempArr[index] = tempArr[i];
            tempArr[i] = temp;
        }
        for (int i = 0; i < tempArr.length; i++) {
            System.out.print(tempArr[i] +", ");
        }
        System.out.println();
        //四个一组添加到二维数组中
        //解法一:
//        int[][] date = new int[4][4];
//        for (int i = 0; i < tempArr.length; i++) {
//            date[i/4][i%4] = tempArr[i];
//        }
        //定义count用于记录tempArr数字的角标
        int count = 0;

        for (int i = 0; i < arr.length; i++) {
            for (int i1 = 0; i1 < arr[i].length; i1++) {
                if (tempArr[count]==0){
                    x=i;
                    y=i1;
                    System.out.println(x);
                    System.out.println(y);
                }else {
                    arr[i][i1] = tempArr[count];
                }
                count++;
            }
        }
    }

    //初始化图片
    private void startImage() {
        //先将界面内的图片清除,用以更新新的图片位置
        this.getContentPane().removeAll();
        //样板:方便理解
//        //初始化图片
//        //将图片交给ImageIcon
//        ImageIcon imageIcon = new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\girl\\girl1\\1.jpg");
//        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
//        JLabel jLabel = new JLabel(imageIcon);
//
//        //指定图片位置
//        jLabel.setBounds(0,0,105,105);
//        //将JLabel对象交给页面
        this.add(jLabel);
//        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
//        this.getContentPane().add(jLabel);



        //一共方四行
        for (int i = 0;i<4;i++) {
            //表示在一行方四个图片
            for (int j = 0; j < 4; j++) {
                int number =arr[i][j];
                JLabel jLabel1 = new JLabel(new ImageIcon("javaseday16\\素材\\素材\\image\\animal\\animal3\\"+number+".jpg"));
                jLabel1.setBounds(j*105+83,i*105+134,105,105);
                //添加边框
                //BevelBorder.LOWERED,1表示图片下陷
                //0 表示图片上凸
                jLabel1.setBorder(new BevelBorder(BevelBorder.LOWERED));
                this.getContentPane().add(jLabel1);
            }
        }
        //添加背景图,先添加的在上面
        //将图片交给ImageIcon
        ImageIcon imageIcon = new ImageIcon("javaseday16\\素材\\素材\\image\\background.png");
        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
        JLabel jLabel = new JLabel(imageIcon);

        //指定图片位置
        jLabel.setBounds(40,40,508,560);
        //将JLabel对象交给页面
//        this.add(jLabel);
        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
        this.getContentPane().add(jLabel);

        //刷新界面
        this.getContentPane().repaint();
    }

    //初始化界面
    private void initialize_interface() {
        //设置长宽
        this.setSize(603,680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置画面置顶
        this.setAlwaysOnTop(true);
        //设置画面居中
        this.setLocationRelativeTo(null);

        //设置关闭模式,任意个界面关闭则关闭虚拟机
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//        //关闭默认的布局,将布局设置为空
        this.setLayout(null);
        //将界面和键盘监视器绑定
        this.addKeyListener(this);
    }

    //初始化菜单
    private void initialize() {
        JMenuBar jMenuBar = new JMenuBar();

        JMenu functionjMenuBar = new JMenu("功能");
        JMenu aboutjMenuBar = new JMenu("关于我们");

        JMenuItem RestartjMenuItem = new JMenuItem("重新开始");
        JMenuItem SignjMenuItem = new JMenuItem("重新登录");
        JMenuItem ColosjMenuItem = new JMenuItem("关闭游戏");
        JMenuItem AccountjMenuItem = new JMenuItem("公众号");

        //将这些组件联系起来
        functionjMenuBar.add(RestartjMenuItem);
        functionjMenuBar.add(SignjMenuItem);
        functionjMenuBar.add(ColosjMenuItem);
        aboutjMenuBar.add(AccountjMenuItem);

        jMenuBar.add(functionjMenuBar);
        jMenuBar.add(aboutjMenuBar);

        //将菜单组件交给界面

        this.setJMenuBar(jMenuBar);
    }

    @Override
    public void keyTyped(KeyEvent e) {}

    @Override
    public void keyPressed(KeyEvent e) {}

    //当按键抬起来时才执行
    @Override
    public void keyReleased(KeyEvent e) {
        int code = e.getKeyCode();
        System.out.println(code);
        if (code==37){
            System.out.println("向左移动");
            //添加校验防止数组越界
            if (y==3){
                return;
            }
            //逻辑:空白块右方的向左移动
            arr[x][y] = arr[x][y+1];
            arr[x][y+1] = 0;
            y++;
            //更新图片位置
            startImage();
        } else if (code == 38) {
            System.out.println("向上移动");
            //添加校验防止数组越界
            if (x==3){
                return;
            }
            //逻辑:空白块下方的向上移动
            //获取下方数组值与空格互换
            arr[x][y] = arr[x+1][y];
            arr[x+1][y] = 0;
            x++;
            //更新图片位置
            startImage();

        } else if (code == 39) {
            System.out.println("向右移动");
            //添加校验防止数组越界
            if (y==0){
                return;
            }
            //逻辑:空白块左方的向右移动
            arr[x][y] = arr[x][y-1];
            arr[x][y-1] = 0;
            y--;
            //更新图片位置
            startImage();
        } else if (code == 40) {
            System.out.println("向下移动");
            //添加校验防止数组越界
            if (x==0){
                return;
            }
            //逻辑:空白块上方的向下移动
            arr[x][y] = arr[x-1][y];
            arr[x-1][y] = 0;
            x--;
            //更新图片位置
            startImage();
        }

    }
}

查看完整图片功能

package com.czk.ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener {

    //定义一个4*4的二维数组
    //用来管理数据
    int[][] arr = new int[4][4];
    //记录空白块的位置
    int x =0;
    int y = 0;
    public GameJFrame() {
        //初始化界面
        initialize_interface();

        //初始化菜单
        initialize();

        //初始化数据
        initeDate();

        //初始化图片
        startImage();


        //设置显示效果,一般放在最后
        this.setVisible(true);
    }

    //初始化数据
    private void initeDate() {
        //定义一个一维数组
        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[index];
            tempArr[index] = tempArr[i];
            tempArr[i] = temp;
        }
        for (int i = 0; i < tempArr.length; i++) {
            System.out.print(tempArr[i] +", ");
        }
        System.out.println();
        //四个一组添加到二维数组中
        //解法一:
//        int[][] date = new int[4][4];
//        for (int i = 0; i < tempArr.length; i++) {
//            date[i/4][i%4] = tempArr[i];
//        }
        //定义count用于记录tempArr数字的角标
        int count = 0;

        for (int i = 0; i < arr.length; i++) {
            for (int i1 = 0; i1 < arr[i].length; i1++) {
                if (tempArr[count]==0){
                    x=i;
                    y=i1;
                    System.out.println(x);
                    System.out.println(y);
                }else {
                    arr[i][i1] = tempArr[count];
                }
                count++;
            }
        }
    }

    //初始化图片
    private void startImage() {
        //先将界面内的图片清除,用以更新新的图片位置
        this.getContentPane().removeAll();
        //样板:方便理解
//        //初始化图片
//        //将图片交给ImageIcon
//        ImageIcon imageIcon = new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\girl\\girl1\\1.jpg");
//        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
//        JLabel jLabel = new JLabel(imageIcon);
//
//        //指定图片位置
//        jLabel.setBounds(0,0,105,105);
//        //将JLabel对象交给页面
        this.add(jLabel);
//        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
//        this.getContentPane().add(jLabel);



        //一共方四行
        for (int i = 0;i<4;i++) {
            //表示在一行方四个图片
            for (int j = 0; j < 4; j++) {
                int number =arr[i][j];
                JLabel jLabel1 = new JLabel(new ImageIcon("javaseday16\\素材\\素材\\image\\animal\\animal3\\"+number+".jpg"));
                jLabel1.setBounds(j*105+83,i*105+134,105,105);
                //添加边框
                //BevelBorder.LOWERED,1表示图片下陷
                //0 表示图片上凸
                jLabel1.setBorder(new BevelBorder(BevelBorder.LOWERED));
                this.getContentPane().add(jLabel1);
            }
        }
        //添加背景图,先添加的在上面
        //将图片交给ImageIcon
        ImageIcon imageIcon = new ImageIcon("javaseday16\\素材\\素材\\image\\background.png");
        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
        JLabel jLabel = new JLabel(imageIcon);

        //指定图片位置
        jLabel.setBounds(40,40,508,560);
        //将JLabel对象交给页面
//        this.add(jLabel);
        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
        this.getContentPane().add(jLabel);

        //刷新界面
        this.getContentPane().repaint();
    }

    //初始化界面
    private void initialize_interface() {
        //设置长宽
        this.setSize(603,680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置画面置顶
        this.setAlwaysOnTop(true);
        //设置画面居中
        this.setLocationRelativeTo(null);

        //设置关闭模式,任意个界面关闭则关闭虚拟机
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//        //关闭默认的布局,将布局设置为空
        this.setLayout(null);
        //将界面和键盘监视器绑定
        this.addKeyListener(this);
    }

    //初始化菜单
    private void initialize() {
        JMenuBar jMenuBar = new JMenuBar();

        JMenu functionjMenuBar = new JMenu("功能");
        JMenu aboutjMenuBar = new JMenu("关于我们");

        JMenuItem RestartjMenuItem = new JMenuItem("重新开始");
        JMenuItem SignjMenuItem = new JMenuItem("重新登录");
        JMenuItem ColosjMenuItem = new JMenuItem("关闭游戏");
        JMenuItem AccountjMenuItem = new JMenuItem("公众号");

        //将这些组件联系起来
        functionjMenuBar.add(RestartjMenuItem);
        functionjMenuBar.add(SignjMenuItem);
        functionjMenuBar.add(ColosjMenuItem);
        aboutjMenuBar.add(AccountjMenuItem);

        jMenuBar.add(functionjMenuBar);
        jMenuBar.add(aboutjMenuBar);

        //将菜单组件交给界面

        this.setJMenuBar(jMenuBar);
    }

    @Override
    public void keyTyped(KeyEvent e) {}


    //按下是显示图片
    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if (code == 65){
            //显示完整图片
            //删除所有图片
            this.getContentPane().removeAll();
            //写入完整图片
        //将图片交给ImageIcon
        ImageIcon imageIcon = new ImageIcon("javaseday16\\素材\\素材\\image\\animal\\animal3\\all.jpg");
        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
        JLabel jLabel = new JLabel(imageIcon);
        //指定图片位置
        jLabel.setBounds(83,134,420,420);
        //将JLabel对象交给页面
        this.getContentPane().add(jLabel);

            //添加背景图,先添加的在上面
            //将图片交给ImageIcon
            ImageIcon imageIcon1 = new ImageIcon("javaseday16\\素材\\素材\\image\\background.png");
            //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
            JLabel jLabel1 = new JLabel(imageIcon1);

            //指定图片位置
            jLabel1.setBounds(40,40,508,560);
            //将JLabel对象交给页面
//        this.add(jLabel);
            //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
            this.getContentPane().add(jLabel1);

            //刷新页面
            //刷新界面
            this.getContentPane().repaint();
        }
    }

    //当按键抬起来时才执行
    @Override
    public void keyReleased(KeyEvent e) {
        int code = e.getKeyCode();
        System.out.println(code);
        if (code==37){
            System.out.println("向左移动");
            //添加校验防止数组越界
            if (y==3){
                return;
            }
            //逻辑:空白块右方的向左移动
            arr[x][y] = arr[x][y+1];
            arr[x][y+1] = 0;
            y++;
            //更新图片位置
            startImage();
        } else if (code == 38) {
            System.out.println("向上移动");
            //添加校验防止数组越界
            if (x==3){
                return;
            }
            //逻辑:空白块下方的向上移动
            //获取下方数组值与空格互换
            arr[x][y] = arr[x+1][y];
            arr[x+1][y] = 0;
            x++;
            //更新图片位置
            startImage();

        } else if (code == 39) {
            System.out.println("向右移动");
            //添加校验防止数组越界
            if (y==0){
                return;
            }
            //逻辑:空白块左方的向右移动
            arr[x][y] = arr[x][y-1];
            arr[x][y-1] = 0;
            y--;
            //更新图片位置
            startImage();
        } else if (code == 40) {
            System.out.println("向下移动");
            //添加校验防止数组越界
            if (x==0){
                return;
            }
            //逻辑:空白块上方的向下移动
            arr[x][y] = arr[x-1][y];
            arr[x-1][y] = 0;
            x--;
            //更新图片位置
            startImage();
        } else if (code == 65) {
            //抬起按键后显示本来的图片
            startImage();
        }

    }
}

作弊码

判断胜利

package com.czk.ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener {

    //定义一个4*4的二维数组
    //用来管理数据
    int[][] arr = new int[4][4];
    //记录正确的条件
    int[][] win = {
         {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12},
        {13,14,15,16}
    };
//    int[4][4] win = {
//        {1,2,3,4},
//        {5,6,7,8},
//        {9,10,11,12},
//        {13,14,15,16}
//    }
    //记录空白块的位置
    int x =0;
    int y = 0;
    public GameJFrame() {
        //初始化界面
        initialize_interface();

        //初始化菜单
        initialize();

        //初始化数据
        initeDate();

        //初始化图片
        startImage();


        //设置显示效果,一般放在最后
        this.setVisible(true);
    }

    //初始化数据
    private void initeDate() {
        //定义一个一维数组
        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[index];
            tempArr[index] = tempArr[i];
            tempArr[i] = temp;
        }
        for (int i = 0; i < tempArr.length; i++) {
            System.out.print(tempArr[i] +", ");
        }
        System.out.println();
        //四个一组添加到二维数组中
        //解法一:
//        int[][] date = new int[4][4];
//        for (int i = 0; i < tempArr.length; i++) {
//            date[i/4][i%4] = tempArr[i];
//        }
        //定义count用于记录tempArr数字的角标
        int count = 0;

        for (int i = 0; i < arr.length; i++) {
            for (int i1 = 0; i1 < arr[i].length; i1++) {
                if (tempArr[count]==0){
                    x=i;
                    y=i1;
                    System.out.println(x);
                    System.out.println(y);
                }else {
                    arr[i][i1] = tempArr[count];
                }
                count++;
            }
        }
    }

    //初始化图片
    private void startImage() {
        //先将界面内的图片清除,用以更新新的图片位置
        this.getContentPane().removeAll();
        //样板:方便理解
//        //初始化图片
//        //将图片交给ImageIcon
//        ImageIcon imageIcon = new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\girl\\girl1\\1.jpg");
//        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
//        JLabel jLabel = new JLabel(imageIcon);
//
//        //指定图片位置
//        jLabel.setBounds(0,0,105,105);
//        //将JLabel对象交给页面
        this.add(jLabel);
//        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
//        this.getContentPane().add(jLabel);

        //显示图片之前先判断游戏是否结束
        if (winer()){
            //游戏结束
            //将结束图标引入
        //将图片交给ImageIcon
        ImageIcon imageIcon = new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\win.png");
        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
        JLabel jLabel = new JLabel(imageIcon);
        //指定图片位置
        jLabel.setBounds(203,280,197,73);
        //将JLabel对象交给页面
        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
        this.getContentPane().add(jLabel);
        }

        //一共方四行
        for (int i = 0;i<4;i++) {
            //表示在一行方四个图片
            for (int j = 0; j < 4; j++) {
                int number =arr[i][j];
                JLabel jLabel1 = new JLabel(new ImageIcon("javaseday16\\素材\\素材\\image\\animal\\animal3\\"+number+".jpg"));
                jLabel1.setBounds(j*105+83,i*105+134,105,105);
                //添加边框
                //BevelBorder.LOWERED,1表示图片下陷
                //0 表示图片上凸
                jLabel1.setBorder(new BevelBorder(BevelBorder.LOWERED));
                this.getContentPane().add(jLabel1);
            }
        }
        //添加背景图,先添加的在上面
        //将图片交给ImageIcon
        ImageIcon imageIcon = new ImageIcon("javaseday16\\素材\\素材\\image\\background.png");
        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
        JLabel jLabel = new JLabel(imageIcon);

        //指定图片位置
        jLabel.setBounds(40,40,508,560);
        //将JLabel对象交给页面
//        this.add(jLabel);
        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
        this.getContentPane().add(jLabel);

        //刷新界面
        this.getContentPane().repaint();
    }

    //初始化界面
    private void initialize_interface() {
        //设置长宽
        this.setSize(603,680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置画面置顶
        this.setAlwaysOnTop(true);
        //设置画面居中
        this.setLocationRelativeTo(null);

        //设置关闭模式,任意个界面关闭则关闭虚拟机
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//        //关闭默认的布局,将布局设置为空
        this.setLayout(null);
        //将界面和键盘监视器绑定
        this.addKeyListener(this);
    }

    //初始化菜单
    private void initialize() {
        JMenuBar jMenuBar = new JMenuBar();

        JMenu functionjMenuBar = new JMenu("功能");
        JMenu aboutjMenuBar = new JMenu("关于我们");

        JMenuItem RestartjMenuItem = new JMenuItem("重新开始");
        JMenuItem SignjMenuItem = new JMenuItem("重新登录");
        JMenuItem ColosjMenuItem = new JMenuItem("关闭游戏");
        JMenuItem AccountjMenuItem = new JMenuItem("公众号");

        //将这些组件联系起来
        functionjMenuBar.add(RestartjMenuItem);
        functionjMenuBar.add(SignjMenuItem);
        functionjMenuBar.add(ColosjMenuItem);
        aboutjMenuBar.add(AccountjMenuItem);

        jMenuBar.add(functionjMenuBar);
        jMenuBar.add(aboutjMenuBar);

        //将菜单组件交给界面

        this.setJMenuBar(jMenuBar);
    }

    @Override
    public void keyTyped(KeyEvent e) {}


    //按下是显示图片
    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if (code == 65){
            //显示完整图片
            //删除所有图片
            this.getContentPane().removeAll();
            //写入完整图片
        //将图片交给ImageIcon
        ImageIcon imageIcon = new ImageIcon("javaseday16\\素材\\素材\\image\\animal\\animal3\\all.jpg");
        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
        JLabel jLabel = new JLabel(imageIcon);
        //指定图片位置
        jLabel.setBounds(83,134,420,420);
        //将JLabel对象交给页面
        this.getContentPane().add(jLabel);

            //添加背景图,先添加的在上面
            //将图片交给ImageIcon
            ImageIcon imageIcon1 = new ImageIcon("javaseday16\\素材\\素材\\image\\background.png");
            //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
            JLabel jLabel1 = new JLabel(imageIcon1);

            //指定图片位置
            jLabel1.setBounds(40,40,508,560);
            //将JLabel对象交给页面
//        this.add(jLabel);
            //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
            this.getContentPane().add(jLabel1);

            //刷新页面
            //刷新界面
            this.getContentPane().repaint();
        }
    }

    //当按键抬起来时才执行
    @Override
    public void keyReleased(KeyEvent e) {
        int code = e.getKeyCode();
        System.out.println(code);
        //如果游戏结束则不可以移动
        if (winer()){
            //结束方法
            return;
        }
        if (code==37){
            System.out.println("向左移动");
            //添加校验防止数组越界
            if (y==3){
                return;
            }
            //逻辑:空白块右方的向左移动
            arr[x][y] = arr[x][y+1];
            arr[x][y+1] = 0;
            y++;
            //更新图片位置
            startImage();
        } else if (code == 38) {
            System.out.println("向上移动");
            //添加校验防止数组越界
            if (x==3){
                return;
            }
            //逻辑:空白块下方的向上移动
            //获取下方数组值与空格互换
            arr[x][y] = arr[x+1][y];
            arr[x+1][y] = 0;
            x++;
            //更新图片位置
            startImage();

        } else if (code == 39) {
            System.out.println("向右移动");
            //添加校验防止数组越界
            if (y==0){
                return;
            }
            //逻辑:空白块左方的向右移动
            arr[x][y] = arr[x][y-1];
            arr[x][y-1] = 0;
            y--;
            //更新图片位置
            startImage();
        } else if (code == 40) {
            System.out.println("向下移动");
            //添加校验防止数组越界
            if (x==0){
                return;
            }
            //逻辑:空白块上方的向下移动
            arr[x][y] = arr[x-1][y];
            arr[x-1][y] = 0;
            x--;
            //更新图片位置
            startImage();
        } else if (code == 65) {
            //抬起按键后显示本来的图片
            startImage();
        } else if (code == 66) {
            //作弊码按下后将数组修改
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[i].length; j++) {
                    arr[i][j] = win[i][j];
                }
            }
            //更新图片位置
            startImage();
        }
    }
    //用于判断游戏是否成功
    public Boolean winer(){
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] != win[i][j]){
                    return false;
                }
            }
        }
        return true;
    }
}

计步功能

完善游戏主页面的其他功能

课后作业

练习一:

自行完成切换美女图片的功能。

需求如下:

需求详解:

1,在功能选项中添加更换图片,在更换图片里面再添加美女,动物,运动。

代码中功能是JMenu,更换图片也是JMenu,美女,动物,运动是三个JMenuItem

代码如下:

//创建菜单并添加到界面当中
//1.创建菜单JMenuBar的对象
JMenuBar jMenuBar = new JMenuBar();
//2.创建菜单上面的两个选项JMenu
JMenu functionJMenu = new JMenu("功能");
JMenu aboutJMenu = new JMenu("关于我们");

//创建更换图片
JMenu changeImage = new JMenu("更换图片");

//3.创建JMenuItem的对象
JMenuItem girl = new JMenuItem("美女");
JMenuItem animal = new JMenuItem("动物");
JMenuItem sport = new JMenuItem("运动");
JMenuItem repalyItem = new JMenuItem("重新游戏");
JMenuItem reLoginItem = new JMenuItem("重新登录");
JMenuItem closeItem = new JMenuItem("关闭游戏");
JMenuItem accountItem = new JMenuItem("公众号");



//4.把美女,动物,运动添加到更换图片当中
changeImage.add(girl);
changeImage.add(animal);
changeImage.add(sport);

//5.把更换图片,重新游戏,重新登录,关闭游戏添加到功能当中
functionJMenu.add(changeImage);
functionJMenu.add(repalyItem);
functionJMenu.add(reLoginItem);
functionJMenu.add(closeItem);
//6.把公众号添加到关于我们当中
aboutJMenu.add(accountItem);

//5.把功能,关于我们添加到JMenuBar当中
jMenuBar.add(functionJMenu);
jMenuBar.add(aboutJMenu);

//6.把整个菜单JMenuBar添加到整个界面当中
this.setJMenuBar(jMenuBar);

2,当我们点击了美女之后,就会从13组美女图片中随机选择一组。

3,当我们点击了动物之后,就会从8组动物图片中随机选择一组。

4,当我们点击了运动之后,就会从10组运动图片中随机选择一组。

5,细节1:选择完毕之后,游戏界面中需要加载所有的小图片并且打乱顺序

6,细节2:按A的时候显示的是选择之后的图片

答案

将图片的地址值看做String字符串,不同的图片只有个别位置不同且有规律,按照规律进行拼接

package com.czk.ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener, ActionListener {
    Random r = new Random();
    //存出地址
    String bf = "\\animal\\animal3\\";


    //菜单中的条目
    JMenu xuanze = new JMenu("选择类型");
    JMenuItem meinv = new JMenuItem("美女");
    JMenuItem fengjing = new JMenuItem("风景");
    JMenuItem dongwu = new JMenuItem("动物");
    JMenuItem RestartjMenuItem = new JMenuItem("重新开始");
    JMenuItem SignjMenuItem = new JMenuItem("重新登录");
    JMenuItem ColosjMenuItem = new JMenuItem("关闭游戏");
    JMenuItem AccountjMenuItem = new JMenuItem("公众号");

    //定义一个4*4的二维数组
    //用来管理数据
    int[][] arr = new int[4][4];
    //记录正确的条件
    int[][] win = {
         {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12},
        {13,14,15,16}
    };
    //定义一个变量记录步数
    int count = 0;

    //记录空白块的位置
    int x =0;
    int y = 0;
    public GameJFrame() {
        //初始化界面
        initialize_interface();

        //初始化菜单
        initialize();

        //初始化数据
        initeDate();

        //初始化图片
        startImage();


        //设置显示效果,一般放在最后
        this.setVisible(true);
    }

    //初始化数据
    private void initeDate() {
        //定义一个一维数组
        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[index];
            tempArr[index] = tempArr[i];
            tempArr[i] = temp;
        }
        for (int i = 0; i < tempArr.length; i++) {
            System.out.print(tempArr[i] +", ");
        }
        System.out.println();
        //四个一组添加到二维数组中
        //解法一:
//        int[][] date = new int[4][4];
//        for (int i = 0; i < tempArr.length; i++) {
//            date[i/4][i%4] = tempArr[i];
//        }
        //定义count用于记录tempArr数字的角标
        int count = 0;

        for (int i = 0; i < arr.length; i++) {
            for (int i1 = 0; i1 < arr[i].length; i1++) {
                if (tempArr[count]==0){
                    x=i;
                    y=i1;
                    System.out.println(x);
                    System.out.println(y);
                }
                    arr[i][i1] = tempArr[count];
                count++;
            }
        }
    }

    //初始化图片
    private void startImage() {
        //先将界面内的图片清除,用以更新新的图片位置
        this.getContentPane().removeAll();
        //样板:方便理解
//        //初始化图片
//        //将图片交给ImageIcon
//        ImageIcon imageIcon = new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\girl\\girl1\\1.jpg");
//        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
//        JLabel jLabel = new JLabel(imageIcon);
//
//        //指定图片位置
//        jLabel.setBounds(0,0,105,105);
//        //将JLabel对象交给页面
        this.add(jLabel);
//        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
//        this.getContentPane().add(jLabel);

        //显示图片之前先判断游戏是否结束
        if (winer()){
            //游戏结束
            //将结束图标引入
        //将图片交给ImageIcon
        ImageIcon imageIcon = new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\win.png");
        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
        JLabel jLabel = new JLabel(imageIcon);
        //指定图片位置
        jLabel.setBounds(203,280,197,73);
        //将JLabel对象交给页面
        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
        this.getContentPane().add(jLabel);
        }

        //将步数写入
        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
        JLabel jLabel2 = new JLabel("步数: "+ count);
        //指定图片位置
        jLabel2.setBounds(30,30,200,50);
        //将JLabel对象交给页面
        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
        this.getContentPane().add(jLabel2);

        //一共方四行
        for (int i = 0;i<4;i++) {
            //表示在一行方四个图片
            for (int j = 0; j < 4; j++) {
                int number =arr[i][j];
                String imgaddress = "javaseday16\\素材\\素材\\image"+bf;
                System.out.println(imgaddress);
                System.out.println(imgaddress+""+number+".jpg");
                JLabel jLabel1 = new JLabel(new ImageIcon(imgaddress+""+number+".jpg"));
                jLabel1.setBounds(j*105+83,i*105+134,105,105);
                //添加边框
                //BevelBorder.LOWERED,1表示图片下陷
                //0 表示图片上凸
                jLabel1.setBorder(new BevelBorder(BevelBorder.LOWERED));
                this.getContentPane().add(jLabel1);
            }
        }
        //添加背景图,先添加的在上面
        //将图片交给ImageIcon
        ImageIcon imageIcon = new ImageIcon("javaseday16\\素材\\素材\\image\\background.png");
        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
        JLabel jLabel = new JLabel(imageIcon);

        //指定图片位置
        jLabel.setBounds(40,40,508,560);
        //将JLabel对象交给页面
//        this.add(jLabel);
        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
        this.getContentPane().add(jLabel);

        //刷新界面
        this.getContentPane().repaint();
    }

    //初始化界面
    private void initialize_interface() {
        //设置长宽
        this.setSize(603,680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置画面置顶
        this.setAlwaysOnTop(true);
        //设置画面居中
        this.setLocationRelativeTo(null);

        //设置关闭模式,任意个界面关闭则关闭虚拟机
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//        //关闭默认的布局,将布局设置为空
        this.setLayout(null);
        //将界面和键盘监视器绑定
        this.addKeyListener(this);
    }

    //初始化菜单
    private void initialize() {
        JMenuBar jMenuBar = new JMenuBar();

        JMenu functionjMenuBar = new JMenu("功能");
        JMenu aboutjMenuBar = new JMenu("关于我们");

//        JMenu xuanze = new JMenu("选择类型");
//        JMenuItem meinv = new JMenuItem("美女");
//        JMenuItem fengjing = new JMenuItem("风景");
//        JMenuItem dongwu = new JMenuItem("动物");

        //将这些组件联系起来
        functionjMenuBar.add(xuanze);
        functionjMenuBar.add(RestartjMenuItem);
        functionjMenuBar.add(SignjMenuItem);
        functionjMenuBar.add(ColosjMenuItem);
        aboutjMenuBar.add(AccountjMenuItem);

        xuanze.add(meinv);
        xuanze.add(fengjing);
        xuanze.add(dongwu);

        jMenuBar.add(functionjMenuBar);
        jMenuBar.add(aboutjMenuBar);

        //将几个菜单绑定单击事件
        RestartjMenuItem.addActionListener(this);
        SignjMenuItem.addActionListener(this);
        ColosjMenuItem.addActionListener(this);
        AccountjMenuItem.addActionListener(this);
        meinv.addActionListener(this);
        fengjing.addActionListener(this);
        dongwu.addActionListener(this);

        //将菜单组件交给界面

        this.setJMenuBar(jMenuBar);
    }

    @Override
    public void keyTyped(KeyEvent e) {}


    //按下是显示图片
    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if (code == 65){
            //显示完整图片
            //删除所有图片
            this.getContentPane().removeAll();
            //写入完整图片
        //将图片交给ImageIcon
        String imgaddress = "javaseday16\\素材\\素材\\image"+bf;
        ImageIcon imageIcon = new ImageIcon(imgaddress+"all.jpg");
        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
        JLabel jLabel = new JLabel(imageIcon);
        //指定图片位置
        jLabel.setBounds(83,134,420,420);
        //将JLabel对象交给页面
        this.getContentPane().add(jLabel);

            //添加背景图,先添加的在上面
            //将图片交给ImageIcon

            ImageIcon imageIcon1 = new ImageIcon("javaseday16\\素材\\素材\\image\\background.png");
            //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
            JLabel jLabel1 = new JLabel(imageIcon1);

            //指定图片位置
            jLabel1.setBounds(40,40,508,560);
            //将JLabel对象交给页面
//        this.add(jLabel);
            //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
            this.getContentPane().add(jLabel1);

            //刷新页面
            //刷新界面
            this.getContentPane().repaint();
        }
    }

    //当按键抬起来时才执行
    @Override
    public void keyReleased(KeyEvent e) {
        int code = e.getKeyCode();
        System.out.println(code);
        //如果游戏结束则不可以移动
        if (winer()){
            //结束方法
            return;
        }
        if (code==37){
            System.out.println("向左移动");
            //添加校验防止数组越界
            if (y==3){
                return;
            }
            //逻辑:空白块右方的向左移动
            arr[x][y] = arr[x][y+1];
            arr[x][y+1] = 0;
            y++;
            count++;
            //更新图片位置
            startImage();
        } else if (code == 38) {
            System.out.println("向上移动");
            //添加校验防止数组越界
            if (x==3){
                return;
            }
            //逻辑:空白块下方的向上移动
            //获取下方数组值与空格互换
            arr[x][y] = arr[x+1][y];
            arr[x+1][y] = 0;
            x++;
            count++;
            //更新图片位置
            startImage();

        } else if (code == 39) {
            System.out.println("向右移动");
            //添加校验防止数组越界
            if (y==0){
                return;
            }
            //逻辑:空白块左方的向右移动
            arr[x][y] = arr[x][y-1];
            arr[x][y-1] = 0;
            y--;
            count++;
            //更新图片位置
            startImage();
        } else if (code == 40) {
            System.out.println("向下移动");
            //添加校验防止数组越界
            if (x==0){
                return;
            }
            //逻辑:空白块上方的向下移动
            arr[x][y] = arr[x-1][y];
            arr[x-1][y] = 0;
            x--;
            count++;
            //更新图片位置
            startImage();
        } else if (code == 65) {
            //抬起按键后显示本来的图片
            startImage();
        } else if (code == 66) {
            //作弊码按下后将数组修改
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[i].length; j++) {
                    arr[i][j] = win[i][j];
                }
            }
            //更新图片位置
            startImage();
        }
    }
    //用于判断游戏是否成功
    public Boolean winer(){
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] != win[i][j]){
                    return false;
                }
            }
        }
        return true;
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        Object source = e.getSource();
        if (source == RestartjMenuItem){
            System.out.println("重新开始");
            //归零计数
            count = 0;
            //随机数据
            initeDate();
            //输入图片
            startImage();

        } else if (source==SignjMenuItem) {
            System.out.println("重新登录");
            //隐藏游戏界面
            this.setVisible(false);
            //开启登录界面
            new LoginJFrame();
        }else if (source==ColosjMenuItem) {
            System.out.println("关闭游戏");
            //只需要关闭虚拟机
            System.exit(0);
        }else if (source==AccountjMenuItem) {
            System.out.println("公众号");
            //创建一个弹窗对象
            JDialog jDialog = new JDialog();
            //创建一个对象管理容器
            JLabel jLabel = new JLabel(new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\about.png"));
//            JLabel jLabel = new JLabel(new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\girl\\girl2\\all.jpg"));
            //设置位置
            jLabel.setBounds(0,0,258,258);
            jDialog.getContentPane().add(jLabel);
            //设置弹窗的大小
            jDialog.setSize(344,344);
            //弹窗置顶
            jDialog.setAlwaysOnTop(true);
            //弹窗居中
            jDialog.setLocationRelativeTo(null);
            //弹窗不关闭则无法操作
            jDialog.setModal(true);
            //弹窗显示
            jDialog.setVisible(true);
        } else if (source == meinv) {
            System.out.println("美女");
            //随机数据显示的位置
            int i = r.nextInt(11)+1;
            //将地址值的位置修改
            bf = "\\girl\\girl"+i+"\\";
            System.out.println("改后的bf"+bf);
            //归零计数
            count = 0;
            //随机数据
            initeDate();
            //输入图片
            startImage();

        }else if (source == fengjing) {
            System.out.println("风景");
            //随机数据显示的位置
            int i = r.nextInt(11)+1;
            //将地址值的位置修改
            bf = "\\sport\\sport"+i+"\\";
//            System.out.println("改后的bf"+bf);
            //归零计数
            count = 0;
            //随机数据
            initeDate();
            //输入图片
            startImage();
        }else if (source == dongwu) {
            System.out.println("动物");
            //随机数据显示的位置
            int i = r.nextInt(11)+1;
            //将地址值的位置修改
            bf = "\\animal\\animal"+i+"\\";
//            System.out.println("改后的bf"+bf);
            //归零计数
            count = 0;
            //随机数据
            initeDate();
            //输入图片
            startImage();
        }
    }
}

练习二:

练习二(扩展题):

独立完成登录界面,此题为附加扩展题。

​​​​​​​

需求详解:

public class LoginJFrame extends JFrame {
    //创建一个集合存储正确的用户名和密码
    static ArrayList<User> list = new ArrayList<>();
    static {
        list.add(new User("zhangsan","123"));
        list.add(new User("lisi","1234"));
    }
    
    
    public LoginJFrame() {
        //初始化界面
        initJFrame();

        //在这个界面中添加内容
        initView();

        //让当前界面显示出来
        this.setVisible(true);
    }

    public void initView() {
        //1. 添加用户名文字
        JLabel usernameText = new JLabel(new ImageIcon("puzzlegame\\image\\login\\用户名.png"));
        usernameText.setBounds(116, 135, 47, 17);
        this.getContentPane().add(usernameText);

        //2.添加用户名输入框
        JTextField username = new JTextField();
        username.setBounds(195, 134, 200, 30);
        this.getContentPane().add(username);

        //3.添加密码文字
        JLabel passwordText = new JLabel(new ImageIcon("puzzlegame\\image\\login\\密码.png"));
        passwordText.setBounds(130, 195, 32, 16);
        this.getContentPane().add(passwordText);

        //4.密码输入框
        JTextField password = new JTextField();
        password.setBounds(195, 195, 200, 30);
        this.getContentPane().add(password);

        //验证码提示
        JLabel codeText = new JLabel(new ImageIcon("puzzlegame\\image\\login\\验证码.png"));
        codeText.setBounds(133, 256, 50, 30);
        this.getContentPane().add(codeText);

        //验证码的输入框
        JTextField code = new JTextField();
        code.setBounds(195, 256, 100, 30);
        this.getContentPane().add(code);

        String codeStr = CodeUtil.getCode();
        JLabel rightCode = new JLabel();
        //设置内容
        rightCode.setText(codeStr);
        //位置和宽高
        rightCode.setBounds(300, 256, 50, 30);
        //添加到界面
        this.getContentPane().add(rightCode);

        //5.添加登录按钮
        JButton login = new JButton();
        login.setBounds(123, 310, 128, 47);
        login.setIcon(new ImageIcon("puzzlegame\\image\\login\\登录按钮.png"));
        //去除按钮的默认边框
        login.setBorderPainted(false);
        //去除按钮的默认背景
        login.setContentAreaFilled(false);
        this.getContentPane().add(login);

        //6.添加注册按钮
        JButton register = new JButton();
        register.setBounds(256, 310, 128, 47);
        register.setIcon(new ImageIcon("puzzlegame\\image\\login\\注册按钮.png"));
        //去除按钮的默认边框
        register.setBorderPainted(false);
        //去除按钮的默认背景
        register.setContentAreaFilled(false);
        this.getContentPane().add(register);

        //7.添加背景图片
        JLabel background = new JLabel(new ImageIcon("puzzlegame\\image\\login\\background.png"));
        background.setBounds(0, 0, 470, 390);
        this.getContentPane().add(background);
    }


    public void initJFrame() {
        this.setSize(488, 430);//设置宽高
        this.setTitle("拼图游戏 V1.0登录");//设置标题
        this.setDefaultCloseOperation(3);//设置关闭模式
        this.setLocationRelativeTo(null);//居中
        this.setAlwaysOnTop(true);//置顶
        this.setLayout(null);//取消内部默认布局
    }

    
    //要展示用户名或密码错误
    public void showJDialog(String content) {
        //创建一个弹框对象
        JDialog jDialog = new JDialog();
        //给弹框设置大小
        jDialog.setSize(200, 150);
        //让弹框置顶
        jDialog.setAlwaysOnTop(true);
        //让弹框居中
        jDialog.setLocationRelativeTo(null);
        //弹框不关闭永远无法操作下面的界面
        jDialog.setModal(true);

        //创建Jlabel对象管理文字并添加到弹框当中
        JLabel warning = new JLabel(content);
        warning.setBounds(0, 0, 200, 150);
        jDialog.getContentPane().add(warning);

        //让弹框展示出来
        jDialog.setVisible(true);
    }
}

JTextField用到的方法解释:

//设置位置和宽高
setBounds(x,y,宽,高);
//返回输入框中用户输入的数据
//细节:如果用户没有输入,返回的是一个长度为0的字符串
getText();
//修改数据
setText(要修改的内容);

JButton用到的方法解释:

//给按钮设置背景图片,方法中传递ImageIcon的对象即可
setIcon();

答案

package com.czk.ui;

import com.czk.Pojo.User;
import com.czk.Utile.Code;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class LoginJFrame extends JFrame implements ActionListener {
    //5.添加登录按钮
    JButton login = new JButton();
    //6.添加注册按钮
    JButton register = new JButton();

    //验证码的输入框
    JTextField code = new JTextField();

    //4.密码输入框
    JTextField password = new JTextField();

    //2.添加用户名输入框
    JTextField username = new JTextField();

    //定义验证码
    String code1 = "";
    //定义一个集合用以存储用户信息
    ArrayList<User> users = new ArrayList<>();

    public LoginJFrame() {
        //界面初始化
        initialize_interface();
        //初始化数据
        initeDate();

        //初始化图片
        startImage();
    }

    //初始化图片
    private void startImage() {
        //先将界面内的图片清除,用以更新新的图片位置
        this.getContentPane().removeAll();
        //1. 添加用户名文字
        JLabel usernameText = new JLabel(new ImageIcon("javaseday16\\素材\\素材\\image\\login\\用户名.png"));
        usernameText.setBounds(116, 135, 47, 17);
        this.getContentPane().add(usernameText);


        username.setBounds(195, 134, 200, 30);
        this.getContentPane().add(username);
        System.out.println(username.getText());

        //3.添加密码文字
        JLabel passwordText = new JLabel(new ImageIcon("javaseday16\\素材\\素材\\image\\login\\密码.png"));
        passwordText.setBounds(130, 195, 32, 16);
        this.getContentPane().add(passwordText);


        password.setBounds(195, 195, 200, 30);
        this.getContentPane().add(password);

        //验证码提示

        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
        JLabel codeText = new JLabel("验证码");


//        JLabel codeText = new JLabel(new ImageIcon("javaseday16\\素材\\素材\\image\\login\\验证码.png"));
        codeText.setBounds(133, 256, 50, 30);
        this.getContentPane().add(codeText);


        code.setBounds(195, 256, 100, 30);
        this.getContentPane().add(code);
        String codeStr = code1;
        JLabel rightCode = new JLabel();
        //设置内容
        rightCode.setText(codeStr);
        //位置和宽高
        rightCode.setBounds(300, 256, 50, 30);
        //添加到界面
        this.getContentPane().add(rightCode);


        login.setBounds(123, 310, 128, 47);
        login.setIcon(new ImageIcon("javaseday16\\素材\\素材\\image\\login\\登录按钮.png"));
        //去除按钮的默认边框
        login.setBorderPainted(false);
        //去除按钮的默认背景
        login.setContentAreaFilled(false);
        this.getContentPane().add(login);

        //将登录和注册按钮绑定单击事件、
        login.addActionListener(this);


        register.setBounds(256, 310, 128, 47);
        register.setIcon(new ImageIcon("javaseday16\\素材\\素材\\image\\login\\注册按钮.png"));
        //去除按钮的默认边框
        register.setBorderPainted(false);
        //去除按钮的默认背景
        register.setContentAreaFilled(false);
        this.getContentPane().add(register);

        //
        register.addActionListener(this);

        //7.添加背景图片
        JLabel background = new JLabel(new ImageIcon("javaseday16\\素材\\素材\\image\\login\\background.png"));
        background.setBounds(0, 0, 470, 390);
        this.getContentPane().add(background);
    }

    //初始化数据
    private void initeDate() {
        //获取验证码
        code1 = Code.code();
        //给用户集合赋初值
        User user = new User("小李","123456");
        users.add(user);
    }

    private void initialize_interface() {
        this.setSize(488,430);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0 登录");
        //设置画面置顶
        this.setAlwaysOnTop(true);
        //设置画面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式,任意个界面关闭则关闭虚拟机
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //设置显示效果,一般放在最后
        this.setVisible(true);
    }

    //要展示用户名或密码错误
    public void showJDialog(String content) {
        //创建一个弹框对象
        JDialog jDialog = new JDialog();
        //给弹框设置大小
        jDialog.setSize(200, 150);
        //让弹框置顶
        jDialog.setAlwaysOnTop(true);
        //让弹框居中
        jDialog.setLocationRelativeTo(null);
        //弹框不关闭永远无法操作下面的界面
        jDialog.setModal(true);

        //创建Jlabel对象管理文字并添加到弹框当中
        JLabel warning = new JLabel(content);
        warning.setBounds(0, 0, 200, 150);
        jDialog.getContentPane().add(warning);

        //让弹框展示出来
        jDialog.setVisible(true);
    }

    //事件监听
    @Override
    public void actionPerformed(ActionEvent e) {
        //判断是点击的哪个按钮
        Object source = e.getSource();
        if (source == login){
            System.out.println("点击了登录按钮");
            //获取各个数据并比对
            //获取验证码数据
            String codeText = code.getText();
            //获取用户名
            String usernameText = username.getText();
            //获取密码
            String passwordText = password.getText();
            //判断密码是否正确
            if (codeText.equalsIgnoreCase(code1)){
                //遍历判断是否有这个用户
                for (int i = 0; i < users.size(); i++) {
                   User getuser = users.get(i);
                    if (getuser.getUsername().equals(usernameText)){
                        //判断密码
                        if (getuser.getPassword().equals(passwordText)){
                            //对应成功
                            //开始登录
                            //隐藏游戏界面
                            this.setVisible(false);
                            //开启注册界面
                            new GameJFrame();
                            return;
                        }
                    }
                }
                showJDialog("账号密码错误,请确认后登录");
            }else{
                showJDialog("验证码错误,请重新输入");
            }
        } else if (source == register) {
            System.out.println("点击了注册按钮");
            //隐藏游戏界面
            this.setVisible(false);
            //开启注册界面
            new RegisterJFrame();
        }
    }
}

小游戏的全部代码(基本功能都实现了)

实体类(用于存储数据)

package com.czk.Pojo;

public class User {
   private String username;
   private String password;


    public User() {
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    /**
     * 获取
     * @return username
     */
    public String getUsername() {
        return username;
    }

    /**
     * 设置
     * @param username
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * 获取
     * @return password
     */
    public String getPassword() {
        return password;
    }

    /**
     * 设置
     * @param password
     */
    public void setPassword(String password) {
        this.password = password;
    }

    public String toString() {
        return "User{username = " + username + ", password = " + password + "}";
    }
}

工具类(生成验证码)csdn上复制的

package com.czk.Utile;

import java.util.Random;

public class Code {
    public static String code(){
    Random yzm = new Random();                          //定义一个随机生成数技术,用来生成随机数
    //2,用String常用API-charAit生成验证码
    String yzm1 = "1234567890abcdefghijklmnopqrstuvwxwzABCDEFGHIJKLMNOPQRSTUVWXYZ";//定义一个String变量存放需要的数据,一共58位
    String yzm3 = "";//定义一个空的Atring变量用来接收生成的验证码
        for (int i = 0; i < 5; i++) {
        int a = yzm.nextInt(58);//随机生成0-57之间的数,提供索引位置
        yzm3+=yzm1.charAt(a);//用get 和提供的索引找到相应位置的数据给变量
    }
        System.out.println("用String常用API-charAit生成的验证码为:"+yzm3);
        return yzm3;
    }
}

三个ui组件

游戏主界面

package com.czk.ui;

import com.czk.Pojo.User;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener, ActionListener {
    //定义一个集合用以存储用户信息
    ArrayList<User> users = new ArrayList<>();
    Random r = new Random();
    //存出地址
    String bf = "\\animal\\animal3\\";


    //菜单中的条目
    JMenu xuanze = new JMenu("选择类型");
    JMenuItem meinv = new JMenuItem("美女");
    JMenuItem fengjing = new JMenuItem("风景");
    JMenuItem dongwu = new JMenuItem("动物");
    JMenuItem RestartjMenuItem = new JMenuItem("重新开始");
    JMenuItem SignjMenuItem = new JMenuItem("重新登录");
    JMenuItem ColosjMenuItem = new JMenuItem("关闭游戏");
    JMenuItem AccountjMenuItem = new JMenuItem("公众号");

    //定义一个4*4的二维数组
    //用来管理数据
    int[][] arr = new int[4][4];
    //记录正确的条件
    int[][] win = {
         {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12},
        {13,14,15,16}
    };
    //定义一个变量记录步数
    int count = 0;

    //记录空白块的位置
    int x =0;
    int y = 0;
    public GameJFrame() {
        //初始化界面
        initialize_interface();

        //初始化菜单
        initialize();

        //初始化数据
        initeDate();

        //初始化图片
        startImage();


        //设置显示效果,一般放在最后
        this.setVisible(true);
    }

    //初始化数据
    private void initeDate() {
        //定义一个一维数组
        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[index];
            tempArr[index] = tempArr[i];
            tempArr[i] = temp;
        }
        for (int i = 0; i < tempArr.length; i++) {
            System.out.print(tempArr[i] +", ");
        }
        System.out.println();
        //四个一组添加到二维数组中
        //解法一:
//        int[][] date = new int[4][4];
//        for (int i = 0; i < tempArr.length; i++) {
//            date[i/4][i%4] = tempArr[i];
//        }
        //定义count用于记录tempArr数字的角标
        int count = 0;

        for (int i = 0; i < arr.length; i++) {
            for (int i1 = 0; i1 < arr[i].length; i1++) {
                if (tempArr[count]==0){
                    x=i;
                    y=i1;
                    System.out.println(x);
                    System.out.println(y);
                }
                    arr[i][i1] = tempArr[count];
                count++;
            }
        }
    }

    //初始化图片
    private void startImage() {
        //先将界面内的图片清除,用以更新新的图片位置
        this.getContentPane().removeAll();
        //样板:方便理解
//        //初始化图片
//        //将图片交给ImageIcon
//        ImageIcon imageIcon = new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\girl\\girl1\\1.jpg");
//        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
//        JLabel jLabel = new JLabel(imageIcon);
//
//        //指定图片位置
//        jLabel.setBounds(0,0,105,105);
//        //将JLabel对象交给页面
        this.add(jLabel);
//        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
//        this.getContentPane().add(jLabel);

        //显示图片之前先判断游戏是否结束
        if (winer()){
            //游戏结束
            //将结束图标引入
        //将图片交给ImageIcon
        ImageIcon imageIcon = new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\win.png");
        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
        JLabel jLabel = new JLabel(imageIcon);
        //指定图片位置
        jLabel.setBounds(203,280,197,73);
        //将JLabel对象交给页面
        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
        this.getContentPane().add(jLabel);
        }

        //将步数写入
        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
        JLabel jLabel2 = new JLabel("步数: "+ count);
        //指定图片位置
        jLabel2.setBounds(30,30,200,50);
        //将JLabel对象交给页面
        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
        this.getContentPane().add(jLabel2);

        //一共方四行
        for (int i = 0;i<4;i++) {
            //表示在一行方四个图片
            for (int j = 0; j < 4; j++) {
                int number =arr[i][j];
                String imgaddress = "javaseday16\\素材\\素材\\image"+bf;
                System.out.println(imgaddress);
                System.out.println(imgaddress+""+number+".jpg");
                JLabel jLabel1 = new JLabel(new ImageIcon(imgaddress+""+number+".jpg"));
                jLabel1.setBounds(j*105+83,i*105+134,105,105);
                //添加边框
                //BevelBorder.LOWERED,1表示图片下陷
                //0 表示图片上凸
                jLabel1.setBorder(new BevelBorder(BevelBorder.LOWERED));
                this.getContentPane().add(jLabel1);
            }
        }
        //添加背景图,先添加的在上面
        //将图片交给ImageIcon
        ImageIcon imageIcon = new ImageIcon("javaseday16\\素材\\素材\\image\\background.png");
        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
        JLabel jLabel = new JLabel(imageIcon);

        //指定图片位置
        jLabel.setBounds(40,40,508,560);
        //将JLabel对象交给页面
//        this.add(jLabel);
        //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
        this.getContentPane().add(jLabel);

        //刷新界面
        this.getContentPane().repaint();
    }

    //初始化界面
    private void initialize_interface() {
        //设置长宽
        this.setSize(603,680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置画面置顶
        this.setAlwaysOnTop(true);
        //设置画面居中
        this.setLocationRelativeTo(null);

        //设置关闭模式,任意个界面关闭则关闭虚拟机
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//        //关闭默认的布局,将布局设置为空
        this.setLayout(null);
        //将界面和键盘监视器绑定
        this.addKeyListener(this);
    }

    //初始化菜单
    private void initialize() {
        JMenuBar jMenuBar = new JMenuBar();

        JMenu functionjMenuBar = new JMenu("功能");
        JMenu aboutjMenuBar = new JMenu("关于我们");

//        JMenu xuanze = new JMenu("选择类型");
//        JMenuItem meinv = new JMenuItem("美女");
//        JMenuItem fengjing = new JMenuItem("风景");
//        JMenuItem dongwu = new JMenuItem("动物");

        //将这些组件联系起来
        functionjMenuBar.add(xuanze);
        functionjMenuBar.add(RestartjMenuItem);
        functionjMenuBar.add(SignjMenuItem);
        functionjMenuBar.add(ColosjMenuItem);
        aboutjMenuBar.add(AccountjMenuItem);

        xuanze.add(meinv);
        xuanze.add(fengjing);
        xuanze.add(dongwu);

        jMenuBar.add(functionjMenuBar);
        jMenuBar.add(aboutjMenuBar);

        //将几个菜单绑定单击事件
        RestartjMenuItem.addActionListener(this);
        SignjMenuItem.addActionListener(this);
        ColosjMenuItem.addActionListener(this);
        AccountjMenuItem.addActionListener(this);
        meinv.addActionListener(this);
        fengjing.addActionListener(this);
        dongwu.addActionListener(this);

        //将菜单组件交给界面

        this.setJMenuBar(jMenuBar);
    }

    @Override
    public void keyTyped(KeyEvent e) {}


    //按下是显示图片
    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if (code == 65){
            //显示完整图片
            //删除所有图片
            this.getContentPane().removeAll();
            //写入完整图片
        //将图片交给ImageIcon
        String imgaddress = "javaseday16\\素材\\素材\\image"+bf;
        ImageIcon imageIcon = new ImageIcon(imgaddress+"all.jpg");
        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
        JLabel jLabel = new JLabel(imageIcon);
        //指定图片位置
        jLabel.setBounds(83,134,420,420);
        //将JLabel对象交给页面
        this.getContentPane().add(jLabel);

            //添加背景图,先添加的在上面
            //将图片交给ImageIcon

            ImageIcon imageIcon1 = new ImageIcon("javaseday16\\素材\\素材\\image\\background.png");
            //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
            JLabel jLabel1 = new JLabel(imageIcon1);

            //指定图片位置
            jLabel1.setBounds(40,40,508,560);
            //将JLabel对象交给页面
//        this.add(jLabel);
            //将JLabel对象交给ContentPane即菜单条下面的界面空间的操作
            this.getContentPane().add(jLabel1);

            //刷新页面
            //刷新界面
            this.getContentPane().repaint();
        }
    }

    //当按键抬起来时才执行
    @Override
    public void keyReleased(KeyEvent e) {
        int code = e.getKeyCode();
        System.out.println(code);
        //如果游戏结束则不可以移动
        if (winer()){
            //结束方法
            return;
        }
        if (code==37){
            System.out.println("向左移动");
            //添加校验防止数组越界
            if (y==3){
                return;
            }
            //逻辑:空白块右方的向左移动
            arr[x][y] = arr[x][y+1];
            arr[x][y+1] = 0;
            y++;
            count++;
            //更新图片位置
            startImage();
        } else if (code == 38) {
            System.out.println("向上移动");
            //添加校验防止数组越界
            if (x==3){
                return;
            }
            //逻辑:空白块下方的向上移动
            //获取下方数组值与空格互换
            arr[x][y] = arr[x+1][y];
            arr[x+1][y] = 0;
            x++;
            count++;
            //更新图片位置
            startImage();

        } else if (code == 39) {
            System.out.println("向右移动");
            //添加校验防止数组越界
            if (y==0){
                return;
            }
            //逻辑:空白块左方的向右移动
            arr[x][y] = arr[x][y-1];
            arr[x][y-1] = 0;
            y--;
            count++;
            //更新图片位置
            startImage();
        } else if (code == 40) {
            System.out.println("向下移动");
            //添加校验防止数组越界
            if (x==0){
                return;
            }
            //逻辑:空白块上方的向下移动
            arr[x][y] = arr[x-1][y];
            arr[x-1][y] = 0;
            x--;
            count++;
            //更新图片位置
            startImage();
        } else if (code == 65) {
            //抬起按键后显示本来的图片
            startImage();
        } else if (code == 66) {
            //作弊码按下后将数组修改
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[i].length; j++) {
                    arr[i][j] = win[i][j];
                }
            }
            //更新图片位置
            startImage();
        }
    }
    //用于判断游戏是否成功
    public Boolean winer(){
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] != win[i][j]){
                    return false;
                }
            }
        }
        return true;
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        Object source = e.getSource();
        if (source == RestartjMenuItem){
            System.out.println("重新开始");
            //归零计数
            count = 0;
            //随机数据
            initeDate();
            //输入图片
            startImage();

        } else if (source==SignjMenuItem) {
            System.out.println("重新登录");
            //隐藏游戏界面
            this.setVisible(false);
            //开启登录界面
            new LoginJFrame(users);
        }else if (source==ColosjMenuItem) {
            System.out.println("关闭游戏");
            //只需要关闭虚拟机
            System.exit(0);
        }else if (source==AccountjMenuItem) {
            System.out.println("公众号");
            //创建一个弹窗对象
            JDialog jDialog = new JDialog();
            //创建一个对象管理容器
            JLabel jLabel = new JLabel(new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\about.png"));
//            JLabel jLabel = new JLabel(new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\girl\\girl2\\all.jpg"));
            //设置位置
            jLabel.setBounds(0,0,258,258);
            jDialog.getContentPane().add(jLabel);
            //设置弹窗的大小
            jDialog.setSize(344,344);
            //弹窗置顶
            jDialog.setAlwaysOnTop(true);
            //弹窗居中
            jDialog.setLocationRelativeTo(null);
            //弹窗不关闭则无法操作
            jDialog.setModal(true);
            //弹窗显示
            jDialog.setVisible(true);
        } else if (source == meinv) {
            System.out.println("美女");
            //随机数据显示的位置
            int i = r.nextInt(11)+1;
            //将地址值的位置修改
            bf = "\\girl\\girl"+i+"\\";
            System.out.println("改后的bf"+bf);
            //归零计数
            count = 0;
            //随机数据
            initeDate();
            //输入图片
            startImage();

        }else if (source == fengjing) {
            System.out.println("风景");
            //随机数据显示的位置
            int i = r.nextInt(11)+1;
            //将地址值的位置修改
            bf = "\\sport\\sport"+i+"\\";
//            System.out.println("改后的bf"+bf);
            //归零计数
            count = 0;
            //随机数据
            initeDate();
            //输入图片
            startImage();
        }else if (source == dongwu) {
            System.out.println("动物");
            //随机数据显示的位置
            int i = r.nextInt(11)+1;
            //将地址值的位置修改
            bf = "\\animal\\animal"+i+"\\";
//            System.out.println("改后的bf"+bf);
            //归零计数
            count = 0;
            //随机数据
            initeDate();
            //输入图片
            startImage();
        }
    }
}

注册界面

package com.czk.ui;

import com.czk.Pojo.User;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class RegisterJFrame extends JFrame implements ActionListener {
    //5.添加重置按钮
    JButton reset = new JButton();
    //6.添加注册按钮
    JButton register = new JButton();

    //4.密码输入框
    JTextField password = new JTextField();

    //4.密码输入框
    JTextField passwordRe = new JTextField();

    //2.添加用户名输入框
    JTextField username = new JTextField();

    //定义验证码
    String code1 = "";
    //定义一个集合用以存储用户信息
    ArrayList<User> users = new ArrayList<>();



    public RegisterJFrame(ArrayList<User> users) {
        this.users = users;
        extracted();
        //初始化界面
        startImage();
    }

    private void extracted() {
        this.setSize(488,500);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0 注册");
        //设置画面置顶
        this.setAlwaysOnTop(true);
        //设置画面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式,任意个界面关闭则关闭虚拟机
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //设置显示效果,一般放在最后
        this.setVisible(true);
    }

    private void startImage() {
        //先将界面内的图片清除,用以更新新的图片位置
        this.getContentPane().removeAll();
        //1. 添加用户名文字
        JLabel usernameText = new JLabel(new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\register\\注册用户名.png"));
        usernameText.setBounds(100, 135, 80, 17);
        this.getContentPane().add(usernameText);

        //用户名的输入框
        username.setBounds(195, 134, 200, 30);
        this.getContentPane().add(username);
        System.out.println(username.getText());

        //3.添加密码文字
        JLabel passwordText = new JLabel(new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\register\\注册密码.png"));
        passwordText.setBounds(100, 195, 64, 16);
        this.getContentPane().add(passwordText);


        password.setBounds(195, 195, 200, 30);
        this.getContentPane().add(password);

        //3.确认密码文字
        JLabel passwordTextRest = new JLabel(new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\register\\再次输入密码.png"));
        passwordTextRest.setBounds(80, 256, 100, 16);
        this.getContentPane().add(passwordTextRest);


        passwordRe.setBounds(195, 256, 200, 30);
        this.getContentPane().add(passwordRe);



        //重置按钮
        reset.setBounds(123, 310, 128, 47);
        reset.setIcon(new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\register\\重置按钮.png"));
        //去除按钮的默认边框
        reset.setBorderPainted(false);
        //去除按钮的默认背景
        reset.setContentAreaFilled(false);
        this.getContentPane().add(reset);

        //将登录和注册按钮绑定单击事件、
        reset.addActionListener(this);


        register.setBounds(256, 310, 128, 47);
        register.setIcon(new ImageIcon("C:\\Users\\20724\\Desktop\\demo\\javase2day01\\javaseday16\\素材\\素材\\image\\register\\注册按钮.png"));
        //去除按钮的默认边框
        register.setBorderPainted(false);
        //去除按钮的默认背景
        register.setContentAreaFilled(false);
        this.getContentPane().add(register);

        //
        register.addActionListener(this);

        //7.添加背景图片
        JLabel background = new JLabel(new ImageIcon("javaseday16\\素材\\素材\\image\\login\\background.png"));
        background.setBounds(0, 0, 470, 390);
        this.getContentPane().add(background);
    }

    //要展示出现的问题
    public void showJDialog(String content) {
        //创建一个弹框对象
        JDialog jDialog = new JDialog();
        //给弹框设置大小
        jDialog.setSize(200, 150);
        //让弹框置顶
        jDialog.setAlwaysOnTop(true);
        //让弹框居中
        jDialog.setLocationRelativeTo(null);
        //弹框不关闭永远无法操作下面的界面
        jDialog.setModal(true);

        //创建Jlabel对象管理文字并添加到弹框当中
        JLabel warning = new JLabel(content);
        warning.setBounds(0, 0, 200, 150);
        jDialog.getContentPane().add(warning);

        //让弹框展示出来
        jDialog.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
        if (source == reset){
            reset();
        } else if (source == register) {
            //开始注册
            //判断两次密码是否一致
            String passwordReText = passwordRe.getText();
            String passwordText = password.getText();
            String usernameText = username.getText();
            if (passwordText.equals(passwordReText)){
                boolean flag = true;
                //判断用户名是否存在
                for (int i = 0; i < users.size(); i++) {
                    User user = users.get(i);
                    if (user.getUsername().equals(usernameText)){
                        showJDialog("账户已存在,请重新输入");
                        reset();
                        flag = false;
                    }
                }
                if (flag){
                    //进行注册
                    User user = new User();
                    user.setUsername(usernameText);
                    user.setPassword(passwordText);

                    users.add(user);
                    //跳转登录界面
                    //隐藏游戏界面
                    this.setVisible(false);
                    //开启注册界面
                    new LoginJFrame(users);
                }
            }else {
                showJDialog("两次密码输入不一致,请重新输入");
                //将两个密码重置
                password.setText("");
                passwordRe.setText("");
            }


        }

    }

    private void reset() {
        //开始重置
        System.out.println("开始重置");
        password.setText("");
        passwordRe.setText("");
        username.setText("");
    }
}

登录界面

package com.czk.ui;

import com.czk.Pojo.User;
import com.czk.Utile.Code;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class LoginJFrame extends JFrame implements ActionListener {
    //5.添加登录按钮
    JButton login = new JButton();
    //6.添加注册按钮
    JButton register = new JButton();

    //验证码的输入框
    JTextField code = new JTextField();

    //4.密码输入框
    JTextField password = new JTextField();

    //2.添加用户名输入框
    JTextField username = new JTextField();

    //定义验证码
    String code1 = "";
    //定义一个集合用以存储用户信息
    ArrayList<User> users = new ArrayList<>();

    public LoginJFrame(ArrayList<User> users) {
        this.users = users;
        //界面初始化
        initialize_interface();
        //初始化数据
        initeDate();

        //初始化图片
        startImage();
    }

    //初始化图片
    private void startImage() {
        //先将界面内的图片清除,用以更新新的图片位置
        this.getContentPane().removeAll();
        //1. 添加用户名文字
        JLabel usernameText = new JLabel(new ImageIcon("javaseday16\\素材\\素材\\image\\login\\用户名.png"));
        usernameText.setBounds(116, 135, 47, 17);
        this.getContentPane().add(usernameText);


        username.setBounds(195, 134, 200, 30);
        this.getContentPane().add(username);
        System.out.println(username.getText());

        //3.添加密码文字
        JLabel passwordText = new JLabel(new ImageIcon("javaseday16\\素材\\素材\\image\\login\\密码.png"));
        passwordText.setBounds(130, 195, 32, 16);
        this.getContentPane().add(passwordText);


        password.setBounds(195, 195, 200, 30);
        this.getContentPane().add(password);

        //验证码提示

        //将ImageIcon交给JLabel对象(管理容器,默认出现在界面的正中央)
        JLabel codeText = new JLabel("验证码");


//        JLabel codeText = new JLabel(new ImageIcon("javaseday16\\素材\\素材\\image\\login\\验证码.png"));
        codeText.setBounds(133, 256, 50, 30);
        this.getContentPane().add(codeText);


        code.setBounds(195, 256, 100, 30);
        this.getContentPane().add(code);
        String codeStr = code1;
        JLabel rightCode = new JLabel();
        //设置内容
        rightCode.setText(codeStr);
        //位置和宽高
        rightCode.setBounds(300, 256, 50, 30);
        //添加到界面
        this.getContentPane().add(rightCode);


        login.setBounds(123, 310, 128, 47);
        login.setIcon(new ImageIcon("javaseday16\\素材\\素材\\image\\login\\登录按钮.png"));
        //去除按钮的默认边框
        login.setBorderPainted(false);
        //去除按钮的默认背景
        login.setContentAreaFilled(false);
        this.getContentPane().add(login);

        //将登录和注册按钮绑定单击事件、
        login.addActionListener(this);


        register.setBounds(256, 310, 128, 47);
        register.setIcon(new ImageIcon("javaseday16\\素材\\素材\\image\\login\\注册按钮.png"));
        //去除按钮的默认边框
        register.setBorderPainted(false);
        //去除按钮的默认背景
        register.setContentAreaFilled(false);
        this.getContentPane().add(register);

        //
        register.addActionListener(this);

        //7.添加背景图片
        JLabel background = new JLabel(new ImageIcon("javaseday16\\素材\\素材\\image\\login\\background.png"));
        background.setBounds(0, 0, 470, 390);
        this.getContentPane().add(background);
    }

    //初始化数据
    private void initeDate() {
        //获取验证码
        code1 = Code.code();
        //给用户集合赋初值
        User user = new User("小李","123456");
        users.add(user);
    }

    private void initialize_interface() {
        this.setSize(488,430);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0 登录");
        //设置画面置顶
        this.setAlwaysOnTop(true);
        //设置画面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式,任意个界面关闭则关闭虚拟机
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //设置显示效果,一般放在最后
        this.setVisible(true);
    }

    //要展示用户名或密码错误
    public void showJDialog(String content) {
        //创建一个弹框对象
        JDialog jDialog = new JDialog();
        //给弹框设置大小
        jDialog.setSize(200, 150);
        //让弹框置顶
        jDialog.setAlwaysOnTop(true);
        //让弹框居中
        jDialog.setLocationRelativeTo(null);
        //弹框不关闭永远无法操作下面的界面
        jDialog.setModal(true);

        //创建Jlabel对象管理文字并添加到弹框当中
        JLabel warning = new JLabel(content);
        warning.setBounds(0, 0, 200, 150);
        jDialog.getContentPane().add(warning);

        //让弹框展示出来
        jDialog.setVisible(true);
    }

    //事件监听
    @Override
    public void actionPerformed(ActionEvent e) {
        //判断是点击的哪个按钮
        Object source = e.getSource();
        if (source == login){
            System.out.println("点击了登录按钮");
            //获取各个数据并比对
            //获取验证码数据
            String codeText = code.getText();
            //获取用户名
            String usernameText = username.getText();
            //获取密码
            String passwordText = password.getText();
            //判断密码是否正确
            if (codeText.equalsIgnoreCase(code1)){
                boolean flag = true;
                //遍历判断是否有这个用户
                for (int i = 0; i < users.size(); i++) {
                   User getuser = users.get(i);
                    if (getuser.getUsername().equals(usernameText)){
                        //判断密码
                        if (getuser.getPassword().equals(passwordText)){
                            //对应成功
                            //开始登录
                            //隐藏游戏界面
                            flag = false;
                            this.setVisible(false);
                            //开启登录界面
                            new GameJFrame();
                        }
                    }
                }
                if (flag){
                    showJDialog("账号密码错误,请确认后登录");
                }
            }else{
                showJDialog("验证码错误,请重新输入");
            }
        } else if (source == register) {
            System.out.println("点击了注册按钮");
            //隐藏游戏界面
            this.setVisible(false);
            //开启注册界面
            new RegisterJFrame(users);
        }
    }
}

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值