拼图游戏(上)

阶段小项目(上)

主界面搭建

知识了解:JFrame属于一个类,专门用于做窗体的

使用的时候,就需要导包使用

package ui;

import javax.swing.*;

public class Test {
    public static void main(String[] args) {
        //1.创建游戏主界面
        JFrame gameJFrame=new JFrame();
        gameJFrame.setSize(603,680);
        gameJFrame.setVisible(true);

        //2.创建登陆界面
        JFrame loginJFrame=new JFrame();
        loginJFrame.setSize(488,430);
        loginJFrame.setVisible(true);

        //3.创建注册界面
        JFrame registerJFrame=new JFrame();
        registerJFrame.setSize(488,500);
        registerJFrame.setVisible(true);
    }
}

由于以上属于测试代码,一般程序的主入口一般不写东西,只需要启动程序使用

import ui.GameJFrame;
import ui.LoginJFrame;
import ui.RegisterJFrame;

public class App {
    public static void main(String[] args) {
        //表示程序的入口

        //如果我们想开启一个界面,就创建谁的对象就可以了
        new LoginJFrame();

        new GameJFrame();

        new RegisterJFrame();
    }
}
package ui;

import javax.swing.*;

public class GameJFrame extends JFrame {
    //JFrame   界面,窗体
    //子类GameJFrame,就是也是窗体
    //规则:GameJFrame代表的是游戏的主界面
    //以后跟游戏相关的所有逻辑都写在这个类中

    public GameJFrame(){
        this.setSize(603,680);
        this.setVisible(true);
    }

}
package ui;

import javax.swing.*;

public class LoginJFrame extends JFrame {
    //JFrame   界面,窗体
    //规则:LoginJFrame代表的是
    //登陆的主界面,以后跟登陆的所有逻辑都写在这个类中

    //书写构造方法
    public LoginJFrame(){
        //在创建登陆界面的时候,同时给这个界面去设置一些信息
        //比如:宽高,展示
        this.setSize(488,430);
        this.setVisible(true);
    }
}
package ui;

import javax.swing.*;

public class RegisterJFrame extends JFrame {
    //JFrame   界面,窗体
    //规则:RegisterJFrame代表的是
    //注册的主界面,以后跟注册的所有逻辑都写在这个类中

    public RegisterJFrame(){
        this.setSize(488,500);
        this.setVisible(true);
    }
}

这时候就可以删除掉Test类了

界面设置

package ui;

import javax.swing.*;

public class LoginJFrame extends JFrame {
    //JFrame   界面,窗体
    //规则:LoginJFrame代表的是
    //登陆的主界面,以后跟登陆的所有逻辑都写在这个类中

    //书写构造方法
    public LoginJFrame(){
        //在创建登陆界面的时候,同时给这个界面去设置一些信息
        //比如:宽高,展示
        this.setSize(488,430);
        //设置界面的标题
        this.setTitle("拼图游戏  登录");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(3);


        this.setVisible(true);
    }
}
package ui;

import javax.swing.*;

public class GameJFrame extends JFrame {
    //JFrame   界面,窗体
    //子类GameJFrame,就是也是窗体
    //规则:GameJFrame代表的是游戏的主界面
    //以后跟游戏相关的所有逻辑都写在这个类中

    public GameJFrame(){
        //设置界面的宽高
        this.setSize(603,680);
        //设置界面的标题
        this.setTitle("拼图游戏单机版 V1.0.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(3);

        //显示界面,写在最后
        this.setVisible(true);
    }

}
import javax.swing.*;

public class RegisterJFrame extends JFrame {
    //JFrame   界面,窗体
    //规则:RegisterJFrame代表的是
    //注册的主界面,以后跟注册的所有逻辑都写在这个类中

    public RegisterJFrame(){
        this.setSize(488,500);

        //设置界面的标题
        this.setTitle("拼图游戏  注册");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(3);



        this.setVisible(true);
    }
}

菜单搭建

把初始化界面和初始化菜单可以用方法包裹,便于日后维护

import javax.swing.*;

public class GameJFrame extends JFrame {
    //JFrame   界面,窗体
    //子类GameJFrame,就是也是窗体
    //规则:GameJFrame代表的是游戏的主界面
    //以后跟游戏相关的所有逻辑都写在这个类中

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

        //初始化菜单
        initJMenuBar();

        //显示界面,写在最后
        this.setVisible(true);
    }

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

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

        //创建选项下面的选项卡
        JMenuItem repalyItem=new JMenuItem("重新游戏");
        JMenuItem reLoginItem=new JMenuItem("重新登录");
        JMenuItem closeItem=new JMenuItem("关闭游戏");

        JMenuItem weiChatItem=new JMenuItem("微信号");

        //将选项卡添加到菜单中
        //添加到功能
        functionJmenu.add(repalyItem);
        functionJmenu.add(reLoginItem);
        functionJmenu.add(closeItem);
        //添加到关于我们
        aboutJmenu.add(weiChatItem);
        //添加到菜单
        jMenuBar.add(functionJmenu);
        jMenuBar.add(aboutJmenu);
        //给整个界面设置菜单
        this.setJMenuBar(jMenuBar);
    }

    private void initJFrame() {
        //设置界面的宽高
        this.setSize(603,680);
        //设置界面的标题
        this.setTitle("拼图游戏单机版 V1.0.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(3);
    }

}

添加图片

初始化图片的代码用方法写了

//初始化图片
private void initImage() {
    int number=1;
    //以4×4的方式加载图片
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
        /*创建一个图片ImageIcon对象
        ImageIcon icon=new ImageIcon("Jigsawgame\\素材\\image\\animal\\animal3\\1.jpg");*/
            //创建一个JLable的对象 (管理容器)
            JLabel jLabel=new JLabel(new ImageIcon("Jigsawgame\\素材\\image\\animal\\animal3\\"+number+".jpg"));
            //指定一下图片的位置
            jLabel.setBounds(105* j,105*i,105,105);
            //把管理容器添加到界面中
            //this.add(jLabel);
            this.getContentPane().add(jLabel);
            number++;
        }
    }
}

打乱图片

根据这个Test知道如何将二维数组数据进行打乱

import java.util.Random;

public class Test {
    public static void main(String[] args) {
        //打乱一维数组中的数据,并且存放到二维数组中

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

        //2.打乱一维数组顺序
        //遍历数组,得到每一个元素,拿着每一个元素和随机索引上的数进行交换
        Random r=new Random();
        for (int i = 0; i < tempArr.length; i++) {
            int index=r.nextInt(tempArr.length);
            int temp=tempArr[i];
            tempArr[i]=tempArr[index];
            tempArr[index]=temp;
        }

        //3.创建二维数组
        int [][] data=new int[4][4];

        //4.将打乱后的一维数组依次存入二维数组中,有两种方法
        //method1
        //将一维数组进行遍历,然后一个一个存入
        for (int i = 0; i < tempArr.length; i++) {
            data[i/4][i%4]=tempArr[i];
        }

        //method2
        //将二维数组遍历,再依次存入一维数组的元素
        /*int index=0;
        for (int i = 0; i <4; i++) {
            for (int j = 0; j <4 ; j++) {
                data[i][j]=tempArr[index];
                index++;
            }
        }*/

        //遍历一下一维数组
        for (int i = 0; i < tempArr.length; i++) {
            System.out.print(tempArr[i]+" ");
        }

        System.out.println();
        //遍历一下二维数组
        for (int i = 0; i <4; i++) {
            for (int j = 0; j <4 ; j++) {
                System.out.print(data[i][j]+" ");
            }
            System.out.println();
        }
    }
}

事件

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

  • 当你对组件干了某件事情之后,就会执行相应的代码

  • 时间源:按钮 图片 窗体

  • 事件:某些操作

    例如:鼠标单击,鼠标划入

  • 绑定监听:当事件源上发生了某个事件,则执行某段代码

键盘监听 KeyListener 鼠标监听:MouseListener 动作监听:ActionListener

动作监听:只能识别鼠标单击和空格的事件

鼠标监听

所有方法 接口方法 抽象方法
Modifier and Type 方法 描述
void mouseClicked(Mouse Event e) 在组件上单击(按下并释放)鼠标按钮时调用
void mouseEnter(Mouse Event e) 当鼠标进入组件时调用
void mouseExisted(Mouse Event e) 当鼠标退出组件时调用
void mousePressed(Mouse Event e) 当鼠标按下组件时调用(按下不松)
void mouseReleased(Mouse Event e) 当鼠标在组件上释放时调用

键盘监听:

所有方法 接口方法 抽象方法
Modifier and Type 方法 描述
void keyPressed(KeyEvent e) 按下时调用
void keyReleased(KeyEvent e) 当键已被释放时调用
void keyTyped(KeyEvent e) 键入键时调用
posted @ 2022-11-09 14:21  喜欢七岁就很浪  阅读(19)  评论(0编辑  收藏  举报