java后端开发day25--阶段项目(二)

在这里插入图片描述
(以下内容全部来自上述课程)
在这里插入图片描述

1.美化界面

请添加图片描述

private void initImage() {
        //路径分两种:
        //1.绝对路径:从盘符开始写的路径   D:\\aaa\\bbb\\ccc.jpg
        //2.相对路径:从当前项目开始写的路径  aaa\\bbb\\ccc.jpg
        
        
        //添加图片的时候,就需要按照二维数组中管理的数据添加图片
        //外循环----把内循环的代码重复执行4次
        for (int i = 0; i < 4; i++) {
            //内循环----表示在一行中放4个图片
            for (int j = 0; j < 4; j++) {
                //获取二维数组中每个索引对应的数字
                int number = arr[i][j];
                //创建一个图片ImageIcon对象     参数:图片的路径(没加图片,意思一下得了)
                //这里的图片最好命名为数字
                ImageIcon icon = new ImageIcon("image\\background\\"+number+".jpg");
                //创建一个JLabel对象(管理容器)
                JLabel jLabel = new JLabel(icon);
                //设置图片的位置
                jLabel.setBounds(105*j+83,105*i+134,105,105);
                //给图片添加边框
                jLabel.setBorder(new BevelBorder(1));
                //把JLabel对象添加到界面中
                this.getContentPane().add(jLabel);
                //添加一次后number自增1,表示下一次加载后面一张图片
            }
        }

        //细节:
        //先加载的图片在上方,后加载的图片在下方
        //添加背景图片
        ImageIcon background = new ImageIcon("image\\background\\background.jpg");
        JLabel backgroundJLabel = new JLabel(background);
        backgroundJLabel.setBounds(40,40,508,560);
        //把背景图片添加到界面中
        this.getContentPane().add(backgroundJLabel);
    }

2.上下移动

上移动:
向上移动实际上就是把空白方块下方的图片上移。
请添加图片描述
(新加代码,非完整)


public class GameJFrame extends javax.swing.JFrame implements KeyListener {
  
    //记录空白方块的位置
    int x = 0;
    int y = 0;

    private void initImage() {
        //清空原本已经出现的图片
        this.getContentPane().removeAll();
       }

    private void initJFrame() {
 
        //给整个界面添加键盘监听
        this.addKeyListener(this);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {
        //对应键盘上的上下左右键
        //获取键盘上的键码
        int keyCode = e.getKeyCode();
        System.out.println(keyCode);
        if (keyCode == 38) {
            System.out.println("上");
            if (x == 3) {
                //已经到底了,什么都不做
                return;
            }
            //逻辑:
            //把空白方块下方的数字往上移动
            //x,y  表示空白方块
            //x+1,y  表示空白方块上的位置
            //把x+1,y位置上的数字赋值给x,y位置
            arr[x][y] = arr[x+1][y];
            arr[x+1][y] = 0;
            //空白方块的位置发生了改变
            x++;
            //重新初始化图片
            initImage();

        } else if (keyCode == 40) {
            if (x == 0) {
                //已经到底了,什么都不做
                return;
            }
            System.out.println("下");
            arr[x][y] = arr[x-1][y];
            arr[x-1][y] = 0;
            //空白方块的位置发生了改变
            x--;
            //重新初始化图片
            initImage();

        } else if (keyCode == 37) {
            if (y == 3) {
                //已经到底了,什么都不做
                return;
            }
            System.out.println("左");
            arr[x][y] = arr[x][y+1];
            arr[x][y+1] = 0;
            //空白方块的位置发生了改变
            y++;
            //重新初始化图片
            initImage();

        } else if (keyCode == 39) {
            if (y == 0) {
                //已经到底了,什么都不做
                return;
            }
            System.out.println("右");
            arr[x][y] = arr[x][y-1];
            arr[x][y-1] = 0;
            //空白方块的位置发生了改变
            y--;
            //重新初始化图片
            initImage();

        } else {
            System.out.println("其他");
        }

    }
}

3.查看完整图片的功能

按住A不松开,显示完整图片
松开A显示随机打乱的图片
(新加代码,非完整)

    //定义一个变量,记录当前展示图片的路径
    String path = "";
    
    private void initImage() {
        //清空原本已经出现的图片
        this.getContentPane().removeAll();
        //..........

        //刷新界面
        this.getContentPane().repaint();
    }
        //监听上一步添加过了,直接用,修改方法即可

    //按下不松,一直触发
    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if (code == 65) {
            //把界面中的所有图片全部删除
            this.getContentPane().removeAll();
            //加载第一张完整的图片
           JLabel allJLabel = new JLabel(new ImageIcon(path+"all.jpg"));
            //设置图片的位置
            allJLabel.setBounds(83,134,420,420);
            //把图片添加到界面中
            this.getContentPane().add(allJLabel);
            //加载背景图片
            ImageIcon background = new ImageIcon("image\\background\\background.jpg");
            JLabel backgroundJLabel = new JLabel(background);
            backgroundJLabel.setBounds(40,40,508,560);

            //把背景图片添加到界面中
            this.getContentPane().add(backgroundJLabel);
            //刷新界面
            this.getContentPane().repaint();
        }

    }

    @Override
    public void keyReleased(KeyEvent e) {
		//...........
        } else if( keyCode == 65){
            initImage();
        }

    }
}

4.作弊码

按一下W,直接胜利
keyReleased方法体中添加:
(新加代码,非完整)

else if (keyCode == 87) {
             arr = new int[][]{
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0}
            };
             initImage();

5.判断胜利

其实就是判断二维数组中的数字是否按照顺序进行排列
如果按照顺序进行排列的,那么显示胜利的图片

实现步骤:

  1. 定义一个正确的二维数组win
  2. 在加载图片之前,先判断一下二维数组中的数字跟win数组中是否相同
  3. 如果相同展示正确图标
  4. 如果不同则不展示正确图标

(新加代码,非完整)

//定义一个二维数组,存储正确的数据
    int[][] win = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};

private void initImage() {
//....

//判断游戏是否结束
        if (isWin()) {
            //显示胜利的图片
            ImageIcon winIcon = new ImageIcon("image\\win.jpg");
            JLabel winJLabel = new JLabel(winIcon);
            winJLabel.setBounds(203,283,197,73);
            this.getContentPane().add(winJLabel);
        }

//........
}

public void keyReleased(KeyEvent e) {
        //判断游戏是否胜利,如果胜利,此方法直接结束
        if (isWin()) {
            //1.返回结果
            //2.结束方法
            return;
//........
        }
}

 //判断游戏是否胜利
    public boolean isWin(){
        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;
    }

6.计步功能

//定义变量,记录步数
    int step = 0;

private void initImage() {
//........
JLabel stepCount = new JLabel("步数:"+step);
        stepCount.setBounds(50,30,100,20);
        this.getContentPane().add(stepCount);

//........
}

// keyReleased  截止到现在的完整代码

 @Override
    public void keyReleased(KeyEvent e) {
        //判断游戏是否胜利,如果胜利,此方法直接结束
        if (isWin()) {
            //1.返回结果
            //2.结束方法
            return;
        }

        //对应键盘上的上下左右键
        //获取键盘上的键码
        int keyCode = e.getKeyCode();
        System.out.println(keyCode);
        if (keyCode == 38) {
            System.out.println("上");
            if (x == 3) {
                //已经到底了,什么都不做
                return;
            }
            //逻辑:
            //把空白方块下方的数字往上移动
            //x,y  表示空白方块
            //x+1,y  表示空白方块上的位置
            //把x+1,y位置上的数字赋值给x,y位置
            arr[x][y] = arr[x+1][y];
            arr[x+1][y] = 0;
            //空白方块的位置发生了改变
            x++;
            step++;
            //重新初始化图片
            initImage();

        } else if (keyCode == 40) {
            if (x == 0) {
                //已经到底了,什么都不做
                return;
            }
            System.out.println("下");
            arr[x][y] = arr[x-1][y];
            arr[x-1][y] = 0;
            //空白方块的位置发生了改变
            x--;
            step++;
            //重新初始化图片
            initImage();

        } else if (keyCode == 37) {
            if (y == 3) {
                //已经到底了,什么都不做
                return;
            }
            System.out.println("左");
            arr[x][y] = arr[x][y+1];
            arr[x][y+1] = 0;
            //空白方块的位置发生了改变
            y++;
            step++;
            //重新初始化图片
            initImage();

        } else if (keyCode == 39) {
            if (y == 0) {
                //已经到底了,什么都不做
                return;
            }
            System.out.println("右");
            arr[x][y] = arr[x][y-1];
            arr[x][y-1] = 0;
            //空白方块的位置发生了改变
            y--;
            step++;
            //重新初始化图片
            initImage();

        } else if( keyCode == 65){
            initImage();
        } else if (keyCode == 87) {
             arr = new int[][]{
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0}
            };
             initImage();
        }

    }

7.菜单功能

1.重新开始

  1. 给重新游戏绑定点击事件---------->ActionListener
  2. 重新打乱二维数组中的数字
  3. 加载图片
  4. 计步器清零

2.关闭游戏

  1. 给关闭游戏绑定事件
  2. 结束虚拟机,关闭所有

3.关于我们

请添加图片描述

4.代码

(新加代码,非完整)

public class GameJFrame extends javax.swing.JFrame implements KeyListener , ActionListener {
 		//把条目添加到选项中  -----   移到成员位置
        functionJMenu.add(replayJMenuItem);
        functionJMenu.add(reLoginJMenuItem);
        functionJMenu.add(closeJMenuItem);
        aboutJMenu.add(accountItem);

}

 private void initJMenuBar() {
 //.........
 		//给条目绑定事件
        replayJMenuItem.addActionListener(this);
        reLoginJMenuItem.addActionListener(this);
        closeJMenuItem.addActionListener(this);
        accountItem.addActionListener(this);
}
//initData  截止到现在的完整代码
 private void initData() {

                //1.定义一个一维数组
                int[] tempArr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

                //2.随机打乱一维数组中的数据
                for (int i = 0; i < tempArr.length; i++) {
                    //获取随机索引
                    int randomIndex = (int)(Math.random()*tempArr.length);
                    //拿着随机索引对应的值和i索引对应的值进行交换
                    int temp = tempArr[i];
                    tempArr[i] = tempArr[randomIndex];
                    tempArr[randomIndex] = temp;
                }

                //3.遍历一维数组
                for (int i = 0; i < tempArr.length; i++) {
                    if (tempArr[i] == 0) {
                        x = i / 4;
                        y = i % 4;
                    } 
                        arr[i / 4][i % 4] = tempArr[i];
                }
                System.out.println();
            }

 @Override
    public void actionPerformed(ActionEvent e) {

        //获取被点击的条目对象
        Object obj = e.getSource();
        if (obj == replayJMenuItem) {
            System.out.println("重新游戏");

            //步数清零
            step = 0;
            //重新打乱数据
            initData();
            //重新初始化图片
            initImage();

        } else if (obj == reLoginJMenuItem) {
            System.out.println("重新登录");
            //关闭当前登录的界面
            this.setVisible(false);
            //打开登录界面
            new LoginJFrame();

        } else if (obj == closeJMenuItem) {
            System.out.println("关闭游戏");
            System.exit(0);

        } else if (obj == accountItem) {
            System.out.println("公众号");
            //创建一个弹窗对象
            JDialog jDialog = new JDialog();
            //创建一个管理图片的容器
            JLabel jLabel = new JLabel(new ImageIcon("image\\account.jpg"));
            //设置位置和宽高
            jLabel.setBounds(0,0,258,258);
            //把图片添加到弹窗中
            jDialog.getContentPane().add(jLabel);
            //设置弹窗的宽高
            jDialog.setSize(280,316);
            //设置弹窗置顶
            jDialog.setAlwaysOnTop(true);
            //设置弹窗居中
            jDialog.setLocationRelativeTo(null);
            //弹框不关闭无法操作下面的界面
            jDialog.setModal(true);
            //让弹窗显示出来
            jDialog.setVisible(true);
        }
    }

8.游戏打包exe(概括)

  1. 一定要包含图形化界面
  2. 代码要打包起来
  3. 游戏用到的图片也要打包起来
  4. JDK也要打包起来

步骤:

  1. 把所有代码打包成一个压缩包,jar后缀的压缩包
  2. 把jar包转换成exe安装包
  3. 把第二步的exe,图片,JDK整合在一起,变成最终的exe安装包

9.所有完整代码

1.GameJFrame

package com.woziji.ui;

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


public class GameJFrame extends javax.swing.JFrame implements KeyListener , ActionListener {
    //JFrame 界面,窗体
    //子类呢? 也表示界面,窗体
    //规定:GameJFrame 表示游戏的主界面
    //以后和游戏相关的所有逻辑都写在这个类中

    //用来管理数据
    int[][] arr = new int[4][4];

    //记录空白方块的位置
    int x = 0;
    int y = 0;

    //定义一个变量,记录当前展示图片的路径
    String path = "";

    //定义一个二维数组,存储正确的数据
    int[][] win = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};

    //定义变量,记录步数
    int step = 0;


    //创建选项下面的条目对象
    JMenuItem replayJMenuItem = new JMenuItem("重新游戏");
    JMenuItem reLoginJMenuItem = new JMenuItem("重新登录");
    JMenuItem closeJMenuItem = new JMenuItem("关闭游戏");

    JMenuItem accountItem = new JMenuItem("公众号");


    public GameJFrame() {
        //初始化界面
        initJFrame();

        //初始化菜单
        initJMenuBar();

        //初始化数据(打乱)
        initData();

        //初始化图片
        initImage();

        //让界面显示出来,建议写在最后
        this.setVisible(true);
    }


    private void initData() {

                //1.定义一个一维数组
                int[] tempArr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

                //2.随机打乱一维数组中的数据
                for (int i = 0; i < tempArr.length; i++) {
                    //获取随机索引
                    int randomIndex = (int)(Math.random()*tempArr.length);
                    //拿着随机索引对应的值和i索引对应的值进行交换
                    int temp = tempArr[i];
                    tempArr[i] = tempArr[randomIndex];
                    tempArr[randomIndex] = temp;
                }

                //3.遍历一维数组
                for (int i = 0; i < tempArr.length; i++) {
                    if (tempArr[i] == 0) {
                        x = i / 4;
                        y = i % 4;
                    }
                        arr[i / 4][i % 4] = tempArr[i];
                }
                System.out.println();
            }

    private void initImage() {
        //清空原本已经出现的图片
        this.getContentPane().removeAll();

        //判断游戏是否结束
        if (isWin()) {
            //显示胜利的图片
            ImageIcon winIcon = new ImageIcon("image\\win.jpg");
            JLabel winJLabel = new JLabel(winIcon);
            winJLabel.setBounds(203,283,197,73);
            this.getContentPane().add(winJLabel);
        }


        JLabel stepCount = new JLabel("步数:"+step);
        stepCount.setBounds(50,30,100,20);
        this.getContentPane().add(stepCount);



        //路径分两种:
        //1.绝对路径:从盘符开始写的路径   D:\\aaa\\bbb\\ccc.jpg
        //2.相对路径:从当前项目开始写的路径  aaa\\bbb\\ccc.jpg


        //添加图片的时候,就需要按照二维数组中管理的数据添加图片
        //外循环----把内循环的代码重复执行4次
        for (int i = 0; i < 4; i++) {
            //内循环----表示在一行中放4个图片
            for (int j = 0; j < 4; j++) {
                //获取二维数组中每个索引对应的数字
                int number = arr[i][j];
                //创建一个图片ImageIcon对象     参数:图片的路径(没加图片,意思一下得了)
                //这里的图片最好命名为数字
                ImageIcon icon = new ImageIcon("image\\background\\"+number+".jpg");
                //创建一个JLabel对象(管理容器)
                JLabel jLabel = new JLabel(icon);
                //设置图片的位置
                jLabel.setBounds(105*j+83,105*i+134,105,105);
                //给图片添加边框
                jLabel.setBorder(new BevelBorder(1));
                //把JLabel对象添加到界面中
                this.getContentPane().add(jLabel);
                //添加一次后number自增1,表示下一次加载后面一张图片
            }
        }

        //细节:
        //先加载的图片在上方,后加载的图片在下方
        //添加背景图片
        ImageIcon background = new ImageIcon("image\\background\\background.jpg");
        JLabel backgroundJLabel = new JLabel(background);
        backgroundJLabel.setBounds(40,40,508,560);
        //把背景图片添加到界面中
        this.getContentPane().add(backgroundJLabel);

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

    private void initJMenuBar() {
        //创建整个的菜单对象
        JMenuBar JMenuBar = new JMenuBar();

        //创建菜单上面的两个选项的对象  (功能  关于我们)
        JMenu functionJMenu = new JMenu("功能");
        JMenu aboutJMenu = new JMenu("关于我们");

        //把条目添加到选项中
        functionJMenu.add(replayJMenuItem);
        functionJMenu.add(reLoginJMenuItem);
        functionJMenu.add(closeJMenuItem);

        aboutJMenu.add(accountItem);

        //把选项添加到菜单中
        JMenuBar.add(functionJMenu);
        JMenuBar.add(aboutJMenu);

        //把菜单设置到界面中
        this.setJMenuBar(JMenuBar);

        //给条目绑定事件
        replayJMenuItem.addActionListener(this);
        reLoginJMenuItem.addActionListener(this);
        closeJMenuItem.addActionListener(this);
        accountItem.addActionListener(this);
    }

    private void initJFrame() {
        //设置界面的宽高
        this.setSize(603,680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置界面的关闭方式
        this.setDefaultCloseOperation(3);
        //取消默认的居中放置,只有取消了才可以设置坐标
        this.setLayout(null);
        //给整个界面添加键盘监听
        this.addKeyListener(this);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }
    //按下不松,一直触发
    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if (code == 65) {
            //把界面中的所有图片全部删除
            this.getContentPane().removeAll();
            //加载第一张完整的图片
           JLabel allJLabel = new JLabel(new ImageIcon(path+"all.jpg"));
            //设置图片的位置
            allJLabel.setBounds(83,134,420,420);
            //把图片添加到界面中
            this.getContentPane().add(allJLabel);
            //加载背景图片
            ImageIcon background = new ImageIcon("image\\background\\background.jpg");
            JLabel backgroundJLabel = new JLabel(background);
            backgroundJLabel.setBounds(40,40,508,560);

            //把背景图片添加到界面中
            this.getContentPane().add(backgroundJLabel);
            //刷新界面
            this.getContentPane().repaint();
        }

    }

    @Override
    public void keyReleased(KeyEvent e) {
        //判断游戏是否胜利,如果胜利,此方法直接结束
        if (isWin()) {
            //1.返回结果
            //2.结束方法
            return;
        }

        //对应键盘上的上下左右键
        //获取键盘上的键码
        int keyCode = e.getKeyCode();
        System.out.println(keyCode);
        if (keyCode == 38) {
            System.out.println("上");
            if (x == 3) {
                //已经到底了,什么都不做
                return;
            }
            //逻辑:
            //把空白方块下方的数字往上移动
            //x,y  表示空白方块
            //x+1,y  表示空白方块上的位置
            //把x+1,y位置上的数字赋值给x,y位置
            arr[x][y] = arr[x+1][y];
            arr[x+1][y] = 0;
            //空白方块的位置发生了改变
            x++;
            step++;
            //重新初始化图片
            initImage();

        } else if (keyCode == 40) {
            if (x == 0) {
                //已经到底了,什么都不做
                return;
            }
            System.out.println("下");
            arr[x][y] = arr[x-1][y];
            arr[x-1][y] = 0;
            //空白方块的位置发生了改变
            x--;
            step++;
            //重新初始化图片
            initImage();

        } else if (keyCode == 37) {
            if (y == 3) {
                //已经到底了,什么都不做
                return;
            }
            System.out.println("左");
            arr[x][y] = arr[x][y+1];
            arr[x][y+1] = 0;
            //空白方块的位置发生了改变
            y++;
            step++;
            //重新初始化图片
            initImage();

        } else if (keyCode == 39) {
            if (y == 0) {
                //已经到底了,什么都不做
                return;
            }
            System.out.println("右");
            arr[x][y] = arr[x][y-1];
            arr[x][y-1] = 0;
            //空白方块的位置发生了改变
            y--;
            step++;
            //重新初始化图片
            initImage();

        } else if( keyCode == 65){
            initImage();
        } else if (keyCode == 87) {
             arr = new int[][]{
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0}
            };
             initImage();
        }

    }

    //判断游戏是否胜利
    public boolean isWin(){
        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 obj = e.getSource();
        if (obj == replayJMenuItem) {
            System.out.println("重新游戏");

            //步数清零
            step = 0;
            //重新打乱数据
            initData();
            //重新初始化图片
            initImage();

        } else if (obj == reLoginJMenuItem) {
            System.out.println("重新登录");
            //关闭当前登录的界面
            this.setVisible(false);
            //打开登录界面
            new LoginJFrame();

        } else if (obj == closeJMenuItem) {
            System.out.println("关闭游戏");
            System.exit(0);

        } else if (obj == accountItem) {
            System.out.println("公众号");
            //创建一个弹窗对象
            JDialog jDialog = new JDialog();
            //创建一个管理图片的容器
            JLabel jLabel = new JLabel(new ImageIcon("image\\account.jpg"));
            //设置位置和宽高
            jLabel.setBounds(0,0,258,258);
            //把图片添加到弹窗中
            jDialog.getContentPane().add(jLabel);
            //设置弹窗的宽高
            jDialog.setSize(280,316);
            //设置弹窗置顶
            jDialog.setAlwaysOnTop(true);
            //设置弹窗居中
            jDialog.setLocationRelativeTo(null);
            //弹框不关闭无法操作下面的界面
            jDialog.setModal(true);
            //让弹窗显示出来
            jDialog.setVisible(true);
        }
    }
}

2.LoginJFrame

package com.woziji.ui;

import javax.swing.*;

public class LoginJFrame extends javax.swing.JFrame{
    //登录界面
    //以后和登录相关的所有逻辑都写在这个类中
    public LoginJFrame(){
        //在创建登陆界面的时候,同时给这个界面去设置一些信息
        //比如:宽高,直接展示出来

        this.setSize(488,430);
        this.setVisible(true);
        //设置界面的标题
        this.setTitle("拼图 登录");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置界面的关闭方式
        this.setDefaultCloseOperation(3);
    }
}

3.RegisterJFrame

package com.woziji.ui;

public class RegisterJFrame extends javax.swing.JFrame{
    //注册界面
    //以后和注册相关的所有逻辑都写在这个类中
    public RegisterJFrame(){
        this.setSize(488,500);
        this.setVisible(true);
        //设置界面的标题
        this.setTitle("拼图 注册");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置界面的关闭方式
        this.setDefaultCloseOperation(3);
    }
}

4.主入口

import com.woziji.ui.GameJFrame;
import com.woziji.ui.LoginJFrame;
import com.woziji.ui.RegisterJFrame;

public class App {
    public static void main(String[] args) {
        //表示程序的入口
        //如果我们想开启一个界面,就创建谁的对象
        //new LoginJFrame();
        //new RegisterJFrame();
        new GameJFrame();

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/980557.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Spring Boot + Vue的常规应急物资管理系统设计与实现

大家好&#xff0c;今天要和大家聊的是一款基于Spring Boot Vue的“常规应急物资管理系统”的设计与实现。项目源码以及部署相关事宜请联系我&#xff0c;文末附上联系方式。 项目简介 基于Spring Boot Vue的“常规应急物资管理系统”设计与实现的主要使用者分为管理员、员工…

SpringCloud + Spring AI Alibaba 整合阿里云百炼大模型

一、前言 记录一次自己使用微服务整合阿里云的百炼大模型&#xff0c;需要用到Redis来记录最近五条信息&#xff0c;已能够保证上下文的连通性&#xff0c;Ai和用户之间的对话是使用的MongoDB来进行存储。然后我这篇文章是介绍了两种请求方式&#xff0c;一种是通过Http请求&a…

(贪心 合并区间)leetcode 56

思路来源&#xff1a;代码随想录--代码随想录_合并区间题解 首先用lambda 按照左界值升序排序 建立答案的二维数组&#xff0c;将第一个行区间放入&#xff0c;判断从第二行开始 第i行的左区间一定大于第i-1行的左区间&#xff08;排序过了&#xff09;&#xff0c;所以只判断…

CAN总线通信协议学习4——数据链路层之仲裁规则

CAN总线只有一对差分信号线&#xff0c;同一时间只能有一个设备操作总线发送数据若多个设备同时有发送需求&#xff0c;该如何分配总线资源? 解决问题的思路&#xff1a;制定资源分配规则&#xff0c;依次满足多个设备的发送需求&#xff0c;确保同一时间只有一个设备操作总线…

Kubespray部署企业级高可用K8S指南

目录 前言1 K8S集群节点准备1.1 主机列表1.2 kubespray节点python3及pip3准备1.2.1. 更新系统1.2.2. 安装依赖1.2.3. 下载Python 3.12源码1.2.4. 解压源码包1.2.5. 编译和安装Python1.2.6. 验证安装1.2.7. 设置Python 3.12为默认版本&#xff08;可选&#xff09;1.2.8. 安装pi…

互推机制在开源AI智能名片2+1链动模式S2B2C商城小程序源码推广中的应用探索

摘要&#xff1a; 在数字化营销时代&#xff0c;开源AI智能名片21链动模式S2B2C商城小程序源码作为一种创新的技术解决方案&#xff0c;正逐步成为企业数字化转型的重要工具。然而&#xff0c;面对激烈的市场竞争&#xff0c;如何高效推广这一前沿技术产品&#xff0c;成为开发…

波导阵列天线 学习笔记11双极化全金属垂直公共馈电平板波导槽阵列天线

摘要&#xff1a; 本communicaition提出了一种双极化全金属垂直公共馈电平板波导槽阵列天线。最初提出了一种公共馈电的单层槽平板波导来实现双极化阵列。此设计消除了传统背腔公共馈电的复杂腔体边缘的必要性&#xff0c;提供了一种更简单的天线结构。在2x2子阵列种发展了宽十…

腾讯游戏完成架构调整 IEG新设五大产品事业部

易采游戏网2月28日独家消息&#xff1a;继1月份腾讯天美工作室群完成内部组织架构调整后&#xff0c;腾讯旗下互动娱乐事业群&#xff08;IEG&#xff09;再次宣布对组织架构进行优化调整。此次调整的核心在于新设立了五大产品事业部&#xff0c;包括体育产品部、音舞产品部、V…

Vue3国际化开发实战:i18n-Ally + vue-i18n@next高效配置教程,项目中文显示

本文详解 Vue3 国际化开发全流程&#xff1a;从安装 vue-i18nnext 到配置多语言文件&#xff08;JSON/YAML&#xff09;&#xff0c;结合 i18n-Ally 插件实现高效翻译管理。重点涵盖&#xff1a; 工程配置&#xff1a;创建 i18n 实例、模块化语言文件结构&#xff08;支持命名…

【愚公系列】《Python网络爬虫从入门到精通》036-DataFrame日期数据处理

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…

计算机网络---TCP三握四挥

文章目录 TCPTCP 的核心特点TCP 与 UDP 特性对比TCP 标志位 TCP 的三次握手&#xff08;建立连接&#xff09;TCP 三次握手概述图解 TCP 三次握手为什么需要三次握手&#xff0c;而不是两次为什么要三次握手&#xff0c;而不是四次三次握手连接阶段&#xff0c;最后一次 ACK 包…

ubuntu服务器安装VASP.6.4.3

ubuntu服务器安装VASP.6.4.3 1 安装Intel OneAPI Base Toolkit和Intel OneAPI HPC Toolkit1.1 更新并安装环境变量1.2 下载Intel OneAPI Base Toolkit和Intel OneAPI HPC Toolkit安装包1.3 安装 Intel OneAPI Base Toolkit1.4 安装 Intel OneAPI HPC Toolkit1.5 添加并激活环境…

【大模型系列篇】DeepSeek开源周,解锁AI黑科技

&#x1f525; Day1&#xff1a;FlashMLA —— GPU推理加速器 专为处理长短不一的AI推理请求而生&#xff0c;就像给Hopper GPU装上了智能导航&#xff0c;让数据在芯片上跑出3000GB/s的"磁悬浮"速度。✅ 已支持BF16格式&#xff5c;580万亿次浮点运算/秒FlashMLA G…

【JSON2WEB】15 银河麒麟操作系统下部署JSON2WEB

【JSON2WEB】系列目录 【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSO…

leetcode第40题组合总和Ⅱ

原题出于leetcode第40题https://leetcode.cn/problems/combination-sum-ii/题目如下&#xff1a; 给定一个候选人编号的集合 candidates &#xff08;candidate中有重复的元素&#xff09;和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合…

大语言模型学习--LangChain

LangChain基本概念 ReAct学习资料 https://zhuanlan.zhihu.com/p/660951271 LangChain官网地址 Introduction | &#x1f99c;️&#x1f517; LangChain LangChain是一个基于语言模型开发应用程序的框架。它可以实现以下应用程序&#xff1a; 数据感知&#xff1a;将语言模型…

【Android】类加载器热修复-随记(二)

1. 背景 在【Android】类加载器&热修复-随记一文中了解了类加载,要完成完整的热修复过程,我们需要构建出差量jar包。而这构建差量包分为两个步骤: 原包,注解解析和插桩;变更后,差量包构建;在这两步过程中会涉及到较多的字节码操作,这里我们需要了解下。我们都听过…

SpringBoot高校运动会管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.报名赛事代码2.用户登录代码3.保存成绩代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBoot框架开发的高校运动会管理系统项目。首先&#xff0c;这…

Readability.js 与 Newspaper提取网页内容和元数据

在当今信息爆炸的时代&#xff0c;网页内容的提取和处理变得尤为重要。无论是从新闻网站、博客还是教程网站中提取内容&#xff0c;都需要一个高效、准确的工具来帮助我们去除无关信息&#xff0c;提取出有价值的正文内容。这不仅能够提高我们的工作效率&#xff0c;还能让我们…

Linux中的UDP编程接口基本使用

UDP编程接口基本使用 本篇介绍 在前面网络基础部分已经介绍了网络的基本工作模式&#xff0c;有了这些理论基础之后&#xff0c;下面先从UDP编程开始从操作部分深入网络 在本篇中&#xff0c;主要考虑下面的内容&#xff1a; 创建并封装服务端&#xff1a;了解创建服务端的…