代码编织梦想

项目完成 用时两天

public class GameJFrame extends JFrame implements KeyListener, ActionListener {
    //创建一个二维数组
    //用来管理数据
    //加载数据的时候会根据二维数组中的数据进行加载
    int[][] data=new int[4][4];
    int[][] win=new int[][]{
            {1,2,3,4},
            {5,6,7,8},
            {9,10,11,12},
            {13,14,15,0}
    };
    //记录步数
    int step=0;
    //记录空白坐标
    int x;
    int y;
    String path="../JavaGUI/image/animal/animal3/";
    //初始化选项下面的条目对象
    JMenuItem animal=new JMenuItem("动物");
    JMenuItem girl=new JMenuItem("美女");
    JMenuItem sprot=new JMenuItem("风景");
    JMenuItem replayItem=new JMenuItem("重新游戏");

    JMenuItem closeItem=new JMenuItem("关闭游戏");
    JMenuItem accountItem=new JMenuItem("联系作者");
    public GameJFrame() {
       //初始化界面
        initJFram();
        //初始化菜单
        initJMenuBar();
        //初始化数据
        initData();
        //初始化图片
        initImage();

        //让窗口显示出来
        this.setVisible(true);
    }

    private void initData() {
        int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
        Random ra = new Random();
        int temp;
        int index;
        for (int i = 0; i < arr.length; i++) {
            temp = arr[i];
            index = arr[ra.nextInt(arr.length)];
            arr[i] = arr[index];
            arr[index] = temp;
        }

        //将一位数组存入到二维数组中
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == 0) {
                x = i / 4;
                y = i % 4;
            }
            data[i / 4][i % 4] = arr[i];

        }
    }

    private void initImage() {
        //刷新图片 去掉原有的
        this.getContentPane().removeAll();
        //判断是否还原成功
        if(victory())
        {
            //显示胜利的图标
            ImageIcon imageIcon=new ImageIcon("../JavaGUI/image/win.png");
            JLabel jLabel=new JLabel(imageIcon);
            jLabel.setBounds(203,293,197,73);
            this.getContentPane().add(jLabel);
        }
        JLabel jLabelstep=new JLabel("步数"+step);
        jLabelstep.setBounds(50,30,100,20);
        this.getContentPane().add(jLabelstep);
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                int index=data[i][j];
                //创建一个管理容器
                JLabel jLabel=new JLabel(new ImageIcon(path+index+".jpg"));
                //设定位置
                jLabel.setBounds(105*j+83,105*i+134,105,105);
                //给图片添加边框
                //0 凸起
                //1 凹
                jLabel.setBorder(new BevelBorder(0));
                //加到隐藏内容上
                this.getContentPane().add(jLabel);
            }
        }
        JLabel jb=new JLabel(new ImageIcon("../JavaGUI/image/background.png"));
        jb.setBounds(40,40,508,560);
        this.getContentPane().add(jb);
        //刷新一下界面
        this.getContentPane().repaint();
    }

    private void initJMenuBar() {
        JMenuBar jMenuBar=new JMenuBar();
        //初始化菜单上面的选项对象
        JMenu functionJMenu=new JMenu("功能");
        JMenu aboutJMenu=new JMenu("关于我们");
        JMenu reimgItem=new JMenu("更换图片");
        //将每一个选项下面的条目对象添加到选项对象中
        reimgItem.add(animal);
        reimgItem.add(girl);
        reimgItem.add(sprot);
        functionJMenu.add(reimgItem);

        functionJMenu.add(replayItem);
        functionJMenu.add(closeItem);
        aboutJMenu.add(accountItem);
        //讲选项对象添加到菜单中
        jMenuBar.add(functionJMenu);
        jMenuBar.add(aboutJMenu);
        //给条目绑定时间
        replayItem.addActionListener(this);
        closeItem.addActionListener(this);
        accountItem.addActionListener(this);
        animal.addActionListener(this);
        girl.addActionListener(this);
        sprot.addActionListener(this);

       this.setJMenuBar(jMenuBar);
    }

    private void initJFram() {
        //设置窗口大小(像素)
        this.setSize(603,680);
        //设置界面标题
        this.setTitle("单机拼图游戏 V1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //位置居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(3);
        //取消默认的居中方式,只有取消了才会按照X,Y轴
        this.setLayout(null);
        this.addKeyListener(this);
    }


    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        if(victory())
        {
            return;
        }
        int code=e.getKeyCode();
        if(code==65)
        {
            this.getContentPane().removeAll();
            JLabel jLabel=new JLabel(new ImageIcon(path+"all.jpg"));
            jLabel.setBounds(83,134,420,420);
            this.getContentPane().add(jLabel);
            JLabel jb=new JLabel(new ImageIcon("../JavaGUI/image/background.png"));
            jb.setBounds(40,40,508,560);
            this.getContentPane().add(jb);
            this.getContentPane().repaint();

        }

    }



    @Override
    public void keyReleased(KeyEvent e) {
        if(victory())
        {
            return;
        }
        int code=e.getKeyCode();

        if(code==37)
        {
            if(y==3)
            {
                return;
            }
            step++;
            System.out.println("向左移动");
            data[x][y]=data[x][y+1];
            data[x][y+1]=0;
            y++;
            initImage();
        }
        else if(code==38)
        {
            if(x==3)
            {
                return;
            }
            step++;
            System.out.println("向上移动");
            data[x][y]=data[x+1][y];
            data[x+1][y]=0;
            x++;
            initImage();
        }
        else if(code==39)
        {
            if(y==0)
            {
                return;
            }
            step++;
            System.out.println("向右移动");

            data[x][y]=data[x][y-1];
            data[x][y-1]=0;
            y--;
            initImage();
        }
        else if(code==40)
        {
            if(x==0)
            {
                return;
            }
            step++;
            System.out.println("向下移动");
            data[x][y]=data[x-1][y];
            data[x-1][y]=0;
            x--;
            initImage();
        }
        else if (code==65) {
            initImage();

        }
        else if(code==123)
        {
            data=new int[][]{
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0}
            };
            initImage();
            x=3;
            y=3;
        }

    }
    public boolean victory()
    {
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
                if(data[i][j]!=win[i][j])
                {
                    return false;
                }
            }
        }
        return true;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
            Object obj=e.getSource();

             if(obj==replayItem)
            {
                System.out.println("重新玩");

                step=0;
                initData();
                initImage();


            }
            else if(obj==closeItem)
            {
                System.out.println("关闭游戏");
                System.exit(0);
            }
            else if (obj==accountItem)
            {
                System.out.println("联系作者");
                JDialog jDialog=new JDialog();
                JLabel jLabel=new JLabel(new ImageIcon("../JavaGUI/image/wxchat.jpg"));
                jLabel.setBounds(0,0,262,259);
                JLabel jLabel1=new JLabel("大连民族大学软件213班");
                jLabel1.setBounds(0,0,200,40);
                jDialog.getContentPane().add(jLabel1);
                jDialog.getContentPane().add(jLabel);
                jDialog.setSize(270,350);
                jDialog.setAlwaysOnTop(true);
                jDialog.setLocationRelativeTo(null);
                //弹窗不关闭无法操作下面的界面
                jDialog.setModal(true);
                jDialog.setVisible(true);

            }
            else if(obj==animal)
            {
                Random rd=new Random();
            path="../JavaGUI/image/animal/animal"+(rd.nextInt(8)+1)+"/";
                step=0;
                initData();
            initImage();
            }
            else if(obj==girl)
            {
                Random rd=new Random();
                path="../JavaGUI/image/girl/girl"+(rd.nextInt(14)+1)+"/";
                step=0;
                initData();
                initImage();
            }
            else if(obj==sprot)
        {
            Random rd=new Random();
            path="../JavaGUI/image/sport/sport"+(rd.nextInt(10)+1)+"/";
            step=0;
            initData();
            initImage();
        }

    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Haenu0317/article/details/126983302

努力打卡 每天学习 不浪费每一天 day7_haenu0317的博客-爱代码爱编程

今天学习JAVA的知识 一:学会利用SimpleDateFormat解析字符串时间为日期对象 String dateStr="2022年8月19日 20:41:04"; SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); D

努力打卡 每天学习 不浪费每一天 day8_haenu0317的博客-爱代码爱编程

  public static void main(String[] args) { // 1、获取本地日期对象。 LocalDate nowDate = LocalDate.now(); System.out.println("今天的日期:" + nowDate);//今天的日期:

努力打卡 每天学习 不浪费每一天 day17_haenu0317的博客-爱代码爱编程

Collection集合存储自定义类型的对象 常见数据结构(浅识): ●栈 ●队列 ●数组 ●链表●二叉树●二叉查找树平●衡二叉树●红黑树 等等 ●栈 ●队列 ●数组   ●链表    ●二叉树     ●平衡二叉树      List集合特点 特有API public static v

努力打卡 每天学习 不浪费每一天 day18_haenu0317的博客-爱代码爱编程

双链表 #include<cstdio> #include<cstdlib> typedef struct Node { struct Node* prior; int data; struct Node* next; }DNode,*DLinkList; //双向链表的创建 bool InitDLinkList(DLin

努力打卡 每天学习 不浪费每一天 day19_haenu0317的博客-爱代码爱编程

泛型深入 泛型的概述和优势  泛型类的概述 Set集合  HashSet    可变参数:   public static void main(String[] args) { //1.不传参数 sum(); //2. 1个参数 sum(10);

努力打卡 每天学习 不浪费每一天 day20_haenu0317的博客-爱代码爱编程

Map集合体系 Map集合体系的概述   Map集合的键是无序 不重复的  但是它的值是可以重复的   Set<String> keys= maps.keySet() 把map集合的键放到Set集合中 获取全部值的集合 Collection<Integer> values=maps.values(); Map集

努力打卡 每天学习 不浪费每一天 day26_haenu0317的博客-爱代码爱编程

package run; import dlnu.bean.Business; import dlnu.bean.Customer; import dlnu.bean.Movie; import dlnu.bean.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import

努力打卡 每天学习 不浪费每一天 day27_haenu0317的博客-爱代码爱编程

File public static void main(String[] args) { File f=new File("C:\\Users\\Haenu0317\\Desktop\\关系第一部分.pdf"); //绝对路径 f.length();//字节长度 f.delete();//居

努力打卡 每天学习 不浪费每一天 day28_haenu0317的博客-爱代码爱编程

文件的创建与删除 File f2=new File("C:/Users/Haenu0317/Desktop/aaa"); //创建一级目录 System.out.println(f2.mkdir()); //创建多级目录 File f3=new File("C:/Users/Haenu0

努力打卡 每天学习 不浪费每一天 day30_haenu0317的博客-爱代码爱编程

public static void main(String[] args)throws Exception { InputStream is=new FileInputStream("D:\\Code\\javasepro\\hello-app\\hello-app\\src\\nihao.txt"); byte[

努力打卡 每天学习 不浪费每一天 day34_haenu0317的博客-爱代码爱编程

对象序列化 注意 :必须实现Serializable借口 在那个对象的类中,当一种信号     对象反序列化  ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\Code\\javasepro\\hello-app\\hello-app\\

努力打卡 每天学习 不浪费每一天 day35_haenu0317的博客-爱代码爱编程

续接昨天  IO框架 //完成文件的复制 IOUtils.copy(new FileInputStream("C:\\Users\\Haenu0317\\Desktop\\docs\\cc7204e9880411ebb6edd017c2d2eca2.jpg"), new FileOutputS

努力打卡 每天学习 不浪费每一天 day36_haenu0317的博客-爱代码爱编程

Thread常用API 给线程起名字  方式一: 在主线程里用Thread 对象名.setName(); 在Thread子类的run方法里调用Thread.currentThread().getname();   方式二: 在Thread子类中创建有参构造  Thread类的线程休眠模式 public static void ma

努力打卡 每天学习 不浪费每一天 day24-爱代码爱编程

package run; import dlnu.bean.Business; import dlnu.bean.Customer; import dlnu.bean.Movie; import dlnu.bean.User; import java.util.*; public class MovieSystem { public s

努力打卡 每天学习 不浪费每一天 day31-爱代码爱编程

文件拷贝 public static void main(String[] args) throws Exception { try { InputStream is=new FileInputStream("C:\\Users\\Haenu0317\\Desktop\\testCopy\\吴昊20202502

努力打卡 每天学习 不浪费每一天 day32-爱代码爱编程

缓冲流 字节缓冲流      public static void main(String[] args) { try ( InputStream is=new FileInputStream("C:\\Users\\Haenu0317\\Desktop\\57e77b74009afe5baa8e

努力打卡 每天学习 不浪费每一天 day37-爱代码爱编程

线程安全问题    如何解决? 线程同步 加锁 方式一: 同步代码块    synchronized ("dlnu") { if(this.money-money>=0) { System.out.println(name+"正在取钱中"+