Java学习笔记------拼图游戏

图形化界面GUI

GUI:Graphical User Interface(图像用户接口),指采用图形化的方式显示操作界面

两套体系:AWT包中和Swing包中

组件

JFrame:最外层的窗体

JMenuBar:最上层菜单

JLaber:管理文字和图片的容器

ImageIcon:图片

事件

可以被组件识别的操作

代码游戏界面

java 复制代码
package cn.puzzlegame.ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
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 {
    //创建二维数组用以管理数据
    int[][]date=new int[4][4];
    //定义变量,用来记录图片路径
    String path="C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\image\\girl\\girl1\\";
    //定义一个储存正确的数组
    int[][]win=new int[][]{
            {1,2,3,4},
            {5,6,7,8},
            {9,10,11,12},
            {13,14,15,0}
    };
    public GameJFrame(){
        //创建主界面
        creatGameJFrame();

         //创建菜单
        creatJmenuBar();
        //初始化数据(打乱)
        creatdate();
        //初始化图片
        createImage();
        //打开界面
        setVisible(true);
    }
    //记录空白块位置
    int x=0;
    int y=0;
    //记录步数
    int step=0;

    private void creatdate() {
        //创建数组
        int[]tem={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< tem.length;i++){
            int index=r.nextInt(tem.length);
            int temp=tem[i];
            tem[i]=tem[index];
            tem[index]=temp;
        }
        //添加到二维数组中
        for (int i = 0; i<tem.length;i++) {
            if(tem[i]==0){
                x=i/4;
                y=i%4;
            }else {
            date[i/4][i%4]=tem[i];}
        }

    }

    //初始化图片
    private void createImage() {
        //清空
        this.getContentPane().removeAll();
        //判断是否成功
        if (victory()){
            JLabel winJLabel=new JLabel(new ImageIcon("C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\image\\win.png"));
            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);

        //循环改进
        //图片已经做了操作
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
            //创建ImageIcon对象
            //ImageIcon icon=new ImageIcon("C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\image\\girl\\girl1\\1.jpg");
            //创建JLaber对象
            //JLabel jLabel=new JLabel(icon);
            //合并
            int number=date[i][j];
            JLabel jLabel=new JLabel(new ImageIcon(path+number+".jpg"));
            //指定图片位置+38+134使图片整体位于中间
            jLabel.setBounds(105*j+83,105*i+134,105,105);
            //添加边框BevelBorder 0凸起 1凹陷
            jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
            //添加到界面
            getContentPane().add(jLabel);
            }
        }
        //背景图片
        JLabel background=new JLabel(new ImageIcon("C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\image\\background.png"));
        //设置背景图片位置
        background.setBounds(40,40,508,560);
        getContentPane().add(background);
        //刷新界面
        this.getContentPane().repaint();
        //创建ImageIcon对象
        //ImageIcon icon=new ImageIcon("C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\image\\girl\\girl1\\1.jpg");
        //创建JLaber对象
        //JLabel jLabel=new JLabel(icon);
        //合并
        //JLabel jLabel=new JLabel(new ImageIcon("C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\image\\girl\\girl1\\1.jpg"));
        //指定图片位置
        //jLabel.setBounds(0,0,105,105);
        //添加到界面
        //getContentPane().add(jLabel);
    }

    //创建菜单
    private void creatJmenuBar() {
        //初始化菜单
        JMenuBar jMenuBar=new JMenuBar();
        //主菜单
        JMenu functionJmenu=new JMenu("功能");
        JMenu ahoutJmenu=new JMenu("关于我们");
        JMenu rewardJmenu=new JMenu("打赏");
        //菜单下选项
        JMenuItem replayItem=new JMenuItem("重新游戏");
        JMenuItem reLoginItem=new JMenuItem("重新登录");
        JMenuItem chagepictureItem=new JMenuItem("更换图片");
        JMenuItem closeItem=new JMenuItem("关闭游戏");
        JMenuItem wechatItem=new JMenuItem("微信号");
        JMenuItem PaymentItem=new JMenuItem("收款码");
        //给条目绑定事件
        replayItem.addActionListener(this);
        reLoginItem.addActionListener(this);
        chagepictureItem.addActionListener(this);
        closeItem.addActionListener(this);

        //添加
        jMenuBar.add(functionJmenu);
        jMenuBar.add(ahoutJmenu);
        jMenuBar.add(rewardJmenu);
        functionJmenu.add(replayItem);
        functionJmenu.add(reLoginItem);
        functionJmenu.add(chagepictureItem);
        functionJmenu.add(closeItem);
        ahoutJmenu.add(wechatItem);
        rewardJmenu.add(PaymentItem);
        setJMenuBar(jMenuBar);
    }
    //创建游戏窗口
    private void creatGameJFrame() {
        //设置页面大小
        setSize(603,680);
        //设置标题
        setTitle("拼图游戏1.0");
        //设置页面置顶
        setAlwaysOnTop(true);
        //设置居中
        setLocationRelativeTo(null);
        //设置关闭
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //取消默认居中
        setLayout(null);
        //整个界面添加键盘监听事件
        this.addKeyListener(this);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }
    //按下不松手调用
    @Override
    public void keyPressed(KeyEvent e) {
        int code=e.getKeyCode();
        if(code==65){
            //按a显示完整图片
            //清空界面图片
            getContentPane().removeAll();
            //加载完整图片
            JLabel all=new JLabel(new ImageIcon(path+"all.jpg"));
            //设置 all大小,添加图片
            all.setBounds(83,134,420,420);
            getContentPane().add(all);
            //添加背景图片
            JLabel background=new JLabel(new ImageIcon("C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\image\\background.png"));
            //设置背景图片位置
            background.setBounds(40,40,508,560);
            getContentPane().add(background);
            //刷新
            this.getContentPane().repaint();
        }

    }

    @Override
    public void keyReleased(KeyEvent e) {
        //判断游戏是否胜利
        if(victory()){return;}
        //判断上下左右
        int code =e.getKeyCode();
        //左37,右39,上38,下40,a65,w87
        if(code==37){
            if(y==3){return;}
            date[x][y]=date[x][y+1];
            date[x][y+1]=0;
            y++;
            step++;
            createImage();

        } else if (code==38) {
            if(x==3){return;}
            date[x][y]=date[x+1][y];
            date[x+1][y]=0;
            x++;
            step++;
            createImage();
        } else if (code==39) {
            if(y==0){return;}
            date[x][y]=date[x][y-1];
            date[x][y-1]=0;
            y--;
            step++;
            createImage();

        }else if(code==40){
            if(x==0){return;}
            date[x][y]=date[x-1][y];
            date[x-1][y]=0;
            x--;
            step++;
            createImage();
        } else if (code==65) {
            createImage();
        } else if (code==87) {
            //创建新二维数组,一键通过
            date=new int[][]{
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0}
            };
            createImage();
        }

    }
    //判断是否与win数组数据相同
    public boolean victory(){
        for(int i=0;i< 4;i++){
            for (int j=0;j< 4;j++){
                if(date[i][j]!=win[i][j])
                    //一个不同即失败
                {return false;}
            }
        }
        return true;
    }



    }

效果:

相关推荐
无敌最俊朗@1 小时前
stm32学习之路——八种GPIO口工作模式
c语言·stm32·单片机·学习
EterNity_TiMe_2 小时前
【论文复现】STM32设计的物联网智能鱼缸
stm32·单片机·嵌入式硬件·物联网·学习·性能优化
L_cl2 小时前
Python学习从0到1 day28 Python 高阶技巧 ⑤ 多线程
学习
前端SkyRain2 小时前
后端Node学习项目-用户管理-增删改查
后端·学习·node.js
青椒大仙KI112 小时前
24/11/13 算法笔记<强化学习> DQN算法
笔记·算法
提笔惊蚂蚁2 小时前
结构化(经典)软件开发方法: 需求分析阶段+设计阶段
后端·学习·需求分析
DDDiccc2 小时前
JAVA学习日记(十五) 数据结构
数据结构·学习
promise-render2 小时前
npm、yarn、pnpm 切换查看镜像源笔记
前端·笔记·npm
夜流冰3 小时前
知识见闻 - 苹果手机拨号键长按
笔记
腾科张老师4 小时前
为什么要使用Ansible实现Linux管理自动化?
linux·网络·学习·自动化·ansible