拼图游戏。

一.制作主界面
首先创建一个Java项目命名为puzzlegame。

再在src中创建一个包,用来制作主界面

导入所需的图片,

代码:

结果:

二.设置界面
代码:

三.初始化界面
代码:

优化代码:

结果:

四.添加图片
先在Java项目中创建图片文件夹,将图片导入其中

初始化图片:

管理图片:

合并:

五.打乱图片顺序


六.事件


七.美化界面


八.移动图片


九.总体代码
package com.itheima.ui;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
 
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.border.BevelBorder;
 
public class GameJFrame extends JFrame implements KeyListener,ActionListener{
//GameJFrame游戏的主界面
    //4.创建二维数组,用来管理数据
    int[][] data = new int[4][4];
    int x=0;
    int y=0;
    
    //定义一个变量,展示图片路径
    String path="images\\\\";
    
    
    //定义一个二维数组
    int[][] win = {
            {1,2,3,4},
            {5,6,7,8},
            {9,10,11,12},
            {13,14,15,0}
    };
    
    int step=0;
    //创建选项下面的对象
            JMenuItem replayItem = new JMenuItem("重新游戏");
            JMenuItem reLoginItem = new JMenuItem("重新登入");
            JMenuItem closeItem = new JMenuItem("关闭游戏");
            
            JMenuItem accountItem = new JMenuItem("公众号");
    public GameJFrame() {
        //设置宽高
        this.setSize(640, 700);
        //设置界面的标题
        this.setTitle("拼图单机版1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(3);
        //取消默认中间放置
        this.setLayout(null);
        //监听事件
        this.addKeyListener(this);
        
        
        
        //初始化菜单
        //创建菜单对象
        JMenuBar jMenuBar = new JMenuBar();
        //创建菜单上面的选项
        JMenu functionJMenu = new JMenu("功能");
        JMenu aboutJMenu = new JMenu("关于我们");
        
        //将每一个选项下面的条目添加到选项当中
        functionJMenu.add(replayItem);
        functionJMenu.add(reLoginItem);
        functionJMenu.add(closeItem);
        
        aboutJMenu.add(accountItem);
        
        //绑定事件
        replayItem.addActionListener(this);
        reLoginItem.addActionListener(this);
        closeItem.addActionListener(this);
        accountItem.addActionListener(this);
        
        //将菜单里面的两个选项添加到菜单中
        jMenuBar.add(functionJMenu);
        jMenuBar.add(aboutJMenu);
        
        //给整个界面设置菜单
        this.setJMenuBar(jMenuBar);
        
        //初始化数据
        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.打乱数组中的数据顺序
                //遍历数组
                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;
                }
                
                //遍历一维数组给二维数组
                for(int i=0;i<tempArr.length;i++) {
                    if(tempArr[i]== 0) {
                        x=i/4;
                        y=i%4;
                    }
                    data[i /4][i%4] = tempArr[i];
                }
                }
                
                
 
    //初始化图片
    //添加图片
private void initImage() {
    //清空原本已经出现的所有图片
    this.getContentPane().removeAll();
    
    if(victory()) {
        JLabel winJLabel = new JLabel(new ImageIcon("C:\\Users\\徐梦\\Desktop\\images\\s.png"));
        winJLabel.setBounds(60, 59, 500, 500);
        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++) {
            //获取当前图片的序号
            int num=data[i][j];
            JLabel jLabel = new JLabel(new ImageIcon(path+num+".gif"));
            //创建一个图片JLabel对象(管理容器)
            //指定图片位=位置
            jLabel.setBounds(151 * j+10, 121 *i+110, 151, 121);
            //添加边框0/1都可以
            jLabel.setBorder(new BevelBorder(1));
            //把管理容器添加到界面中
            this.getContentPane().add(jLabel);
            
        }
    }
        
        this.getContentPane().repaint();
        
        
    
}
@Override
public void keyTyped(KeyEvent e) {
    // TODO Auto-generated method stub
    
}//按下不松时
@Override
public void keyPressed(KeyEvent e) {
    // TODO Auto-generated method stub
    int code = e.getKeyCode();
    if(code == 65) {
        //清空原本已经出现的所有图片
        this.getContentPane().removeAll();
        //加载完整图片
        JLabel all = new JLabel(new ImageIcon("C:\\Users\\徐梦\\Desktop\\images\\all.png"));
        all.setBounds(10, 110, 603, 485);
        this.getContentPane().add(all);
        //刷新界面
        this.getContentPane().repaint();
    }
}
@Override
public void keyReleased(KeyEvent e) {
    //判断游戏是否胜利
    if(victory()) {
        return;
    }
    
    
    
    //对上下左右进行判断
    int code = e.getKeyCode();
    if(code == 37) {
    System.out.println("向左");
    if(y == 3) {
        //表示空白方块已经在最下方了,不能在移动了
        return;
    }
    //把空白方块下面的数字赋值给上面
            data[x][y] = data[x ][y-1];
            data[x][y-1]=0;
            y++;
            step++;
            initImage();
            
}else if(code == 38) {
    System.out.println("向上");
    if(x == 3) {
        //表示空白方块已经在最下方了,不能在移动了
        return;
    }
    //把空白方块下面的数字赋值给上面
    data[x][y] = data[x + 1][y];
    data[x+1][y]=0;
    x++;
    step++;
    initImage();
    
    
    
}else if(code == 39) {
    System.out.println("向右");
    if(y == 0) {
        //表示空白方块已经在最下方了,不能在移动了
        return;
    }
    //把空白方块下面的数字赋值给上面
        data[x][y] = data[x ][y-1];
        data[x][y-1]=0;
        y--;
        step++;
        initImage();
}else if(code == 40) {
    System.out.println("向下");
    if(x == 0) {
        //表示空白方块已经在最下方了,不能在移动了
        return;
    }
    //把空白方块下面的数字赋值给上面
        data[x][y] = data[x - 1][y];
        data[x-1][y]=0;
        x--;
        step++;
        initImage();
}else if(code == 65) {
    initImage();
}else if(code == 87) {
    data = new int[][] {
        {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12},
        {13,14,15,0}
    };
    initImage();
}
    }
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 == reLoginItem) {
        System.out.println("重新登入");
        this.setVisible(false);
        new LoginJFrame();
        
        
        
    }else if(obj == closeItem) {
        System.out.println("关闭游戏");
        
        System.exit(0);
    }else if(obj == accountItem) {
        System.out.println("公众号");
    }
    
}
}

package com.itheima.ui;
public class App {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
//程序的启动入口
        
        //想要开启谁的界面,就创建谁的对象
    
 
 
        new GameJFrame();
    }
 
}
package com.itheima.ui;
 
public class LoginJFrame {
 
}
十.结果呈现

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值