阶段综合项目,拼图小游戏(含有完整代码)

临时储备的知识点 

  • ctrl+B查看源代码
  • 源代码里面的英文可以添加翻译插件(plugin)搜索translate安装插件,然后选择想翻译的内容,右键,翻译
  • ctrl+alt+m 是把选中的模块而代码抽取成方法
  • alt+enter 写一个还没写好的方法,选中名称点击这个快捷键自动生成方法体
  • CTRL+B  选中方法名,点击它跟进方法体

主界面分析

效果图

创建主界面

 菜单制作

添加图片

照片地址可以通过改变数字的方式

我一开始一个一个打进去的,用一个循环,提高效率

打乱图片循序

事件

 游戏逻辑实现

目录:

 美化界面

移动图片

按照这个坐标实现坐标位置

 

查看完整图片功能

 

作弊码

 

判断胜利

 记录步数

重新开始

到目前位置该游戏基本已完成,注册,登录代码,可以去看我以前发布的博客,有详细步骤以及源代码 

完整代码

因为拼图用的照片是我自己的个人照片,没有在这里分享给你们,你们可以参考代码里面的照片数据,能做出自己的拼图小游戏,以下代码中,我把不同包类下的代码一起放进去了,依******号隔开

xiaoguo

里面放进你自己的图片就可以

没有照片情况下的图示

 

import UI.GameJframe;
import UI.LoginJfarame;
import UI.RegisterJframe;

import javax.swing.*;
import javax.swing.border.BevelBorder;
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 App {
    public static void main(String[] args) {

        //如果我们想开启一个界面就要新建谁的界面

        //主页面
        new GameJframe();

        //登录页面
//        new LoginJfarame();

        //注册页面
//        new RegisterJframe();



    }
}


//*************************************************************
package UI;

        import javax.swing.*;

public class LoginJfarame extends JFrame {
    public LoginJfarame (){
        setSize(488,430);
        //设置界面的标题
        this.setTitle("拼图  登录");

        //置顶设置
        this.setAlwaysOnTop(true);

        //设置界面居中
        this.setLocationRelativeTo(null);

        //设置关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        //显示界面程序,建议写到最后
        setVisible(true);
    }
}
//**********************************************************
package UI;

        import javax.swing.*;
        import javax.swing.border.BevelBorder;
        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, ActionListener {

    //        创建一个二维数组,用来管理数据,加载图片的时候会根据二维数组中的进行加载
    int [][]date=new int[3][3];
    //定义一个变量名,记录当前展示图片的路径
    int []tempAtt={0,1,2,3,4,5,6,7,8};
    String path="E:\\E\\IDEA代码\\interface\\puzzleGame\\";

    //定义一个二维数组,里面存储正确的数据
    int [][] win= {{1,2,3},{4,5,6},{7,8,0}};
    //定义一个变量,用来计步数
    int step=0;
    //创建下面的条目对象
    JMenuItem replayItem=new JMenuItem("重新游戏");
    JMenuItem reloginItem=new JMenuItem("重新登陆");
    JMenuItem closeItem=new JMenuItem("关闭游戏");
    JMenuItem accountItem=new JMenuItem("关于我们 ");

    public GameJframe() {


        //初始化界面
        initJframe();
        //初始化菜单
        initJmenuBar();

        //初始化数据
        intDate();

        //初始化图片
        initImage();


        //显示界面程序,建议写到最后
        setVisible(true);



    }
    //记录空白方块儿在二维数组中的位置
    int x=0;
    int y=0;
    //初始化数据,(打乱)
    private void intDate() {
        //需求,打乱0~9的一维数组
//        然后再按照三个一起存放
//        定义一个一位数组
        int []tempAtt={0,1,2,3,4,5,6,7,8};
//        打乱数组中的数字
        Random r=new Random();
        for (int i = 0; i < tempAtt.length; i++) {
//            获取到随即索引
            int index= r.nextInt(tempAtt.length);
//            拿着遍历到的没一个数组跟随即索引的数据进行交换
            int temp=tempAtt[i];
            tempAtt[i]=tempAtt[index];
            tempAtt[index]=temp;
        }
//        给二维数组添加数据,每一行三个数据
        for (int i = 0; i < tempAtt.length; i++) {
            if (tempAtt[i]==0){
                x=i/3;
                y=i%3;
            }
            date[i/3][i%3]=tempAtt[i];

        }
    }

    //初始化图片
    private void initImage() {

        //清空原本已经出现的所有图片
        this.getContentPane().removeAll();
        //显示胜利的图标
        if (victory()){
            //   int dat=date[x][y];
            JLabel winLabel1=new JLabel(new ImageIcon(path+"胜利-4.jpg"));
            winLabel1.setBounds(124*3-40,124*3+10,124,124);
            this.getContentPane().add(winLabel1);
        }

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

        //创建一个图片ImageIcon的对象
     /*   ImageIcon icon1 =new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\1.jpg");
        //创建一个Jlabel的对象(管理容器)
        JLabel Jlabel1=new JLabel(icon1);
        //置顶图片位置
        Jlabel1.setBounds(0,0,140,140);
        //把管理容器添加到桌面中
        //this.add(Jlabel1);
        this.getContentPane().add(Jlabel1);

        //2张
        //创建一个图片ImageIcon的对象
        ImageIcon icon2 =new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\2.jpg");
        //创建一个Jlabel的对象(管理容器)
        JLabel Jlabel2=new JLabel(icon2);
        //置顶图片位置
        Jlabel2.setBounds(140,0,140,140);
        //把管理容器添加到桌面中
        this.getContentPane().add(Jlabel2);

        //3张
        //创建一个图片ImageIcon的对象
        ImageIcon icon3 =new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\3.jpg");
        //创建一个Jlabel的对象(管理容器)
        JLabel Jlabel3=new JLabel(icon3);
        //置顶图片位置
        Jlabel3.setBounds(280,0,140,140);
        //把管理容器添加到桌面中
        this.getContentPane().add(Jlabel3);

        //4张
        //创建一个图片ImageIcon的对象
        ImageIcon icon4 =new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\4.jpg");
        //创建一个Jlabel的对象(管理容器)
        JLabel Jlabel4=new JLabel(icon4);
        //置顶图片位置
        Jlabel4.setBounds(0,140,140,140);
        //把管理容器添加到桌面中
        this.getContentPane().add(Jlabel4);

        //5张
        //创建一个图片ImageIcon的对象
        ImageIcon icon5 =new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\5.jpg");
        //创建一个Jlabel的对象(管理容器)
        JLabel Jlabel5=new JLabel(icon5);
        //置顶图片位置
        Jlabel5.setBounds(140,140,140,140);
        //把管理容器添加到桌面中
        this.getContentPane().add(Jlabel5);

        //2张
        //创建一个图片ImageIcon的对象
        ImageIcon icon6 =new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\6.jpg");
        //创建一个Jlabel的对象(管理容器)
        JLabel Jlabel6=new JLabel(icon6);
        //置顶图片位置
        Jlabel6.setBounds(280,140,140,140);
        //把管理容器添加到桌面中
        this.getContentPane().add(Jlabel6);

        //2张
        //创建一个图片ImageIcon的对象
        ImageIcon icon7 =new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\7.jpg");
        //创建一个Jlabel的对象(管理容器)
        JLabel Jlabel7=new JLabel(icon7);
        //置顶图片位置
        Jlabel7.setBounds(0,280,140,140);
        //把管理容器添加到桌面中
        this.getContentPane().add(Jlabel7);

        //2张
        //创建一个图片ImageIcon的对象
        ImageIcon icon8 =new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\8.jpg");
        //创建一个Jlabel的对象(管理容器)
        JLabel Jlabel8=new JLabel(icon8);
        //置顶图片位置
        Jlabel8.setBounds(140,280,140,140);
        //把管理容器添加到桌面中
        this.getContentPane().add(Jlabel8);

        //创建一个图片ImageIcon的对象
        ImageIcon icon9 =new ImageIcon();
        //创建一个Jlabel的对象(管理容器)
        JLabel Jlabel9=new JLabel(icon9);
        //置顶图片位置
        Jlabel9.setBounds(280,280,140,140);
        //把管理容器添加到桌面中
        this.getContentPane().add(Jlabel9);*/
        //外循环,把内循环重复执行了3次
        //int number=1;
        for (int i = 0; i < 3; i++) {
            //内循环 ,表示在一个行里面添加三张图片
            for (int j = 0; j < 3; j++) {
                //获取当前要加载图片的序号
                int num=date[i][j];
                //创建一个Jlabel对象(管理容器)
                JLabel jLabel1=new JLabel(new ImageIcon(path+num+".jpg"));
                //置顶图片位置
                jLabel1.setBounds(124*j+83,124*i+134,124,124);
                //给图片添加边框
                //0,表示凸起,1表示凹下
                jLabel1.setBorder(new BevelBorder(1));

                //把管理容器添加到界面中
                this.getContentPane().add(jLabel1);
                // number++;
            }

        }
        //添加背景图片
        JLabel background=new JLabel(new ImageIcon(path+"未标题-2.jpg"));
        background.setBounds(20,40,508,560);
        this.getContentPane().add(background);

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

    }
    //初始化菜单
    private void initJmenuBar() {

        //创建整个菜单对象
        JMenuBar jMenuBar = new JMenuBar();
        //创建菜单上的两个选项的对象(功能,关于我们)
        JMenu FunctiomMenu = new JMenu("功能");
        JMenu AboutMenue = new JMenu("关于我们");



        //将每一个选项下面的条目到选项当中
        FunctiomMenu.add(replayItem);
        FunctiomMenu.add(reloginItem);
        FunctiomMenu.add(closeItem);



        AboutMenue.add(accountItem);
        //给条目绑定事件
        replayItem.addActionListener(this);
        reloginItem.addActionListener(this);
        closeItem.addActionListener(this);
        accountItem.addActionListener(this);

        //将菜单里面的两个选项添加到菜单当中
        jMenuBar.add(FunctiomMenu);
        jMenuBar.add(AboutMenue);

        //给整个界面设置菜单
        this.setJMenuBar(jMenuBar);
    }

    private void initJframe() {
        //this 关键字在这里科协可不写
        this.setSize(603, 680);//括号内的表示像素
        this.setVisible(true);//用于显示创建的主界面(默认是处于隐藏状态)

        //设置界面的标题
        this.setTitle("拼图单机版,对象BMY v.0");

        //置顶设置
        this.setAlwaysOnTop(true);

        //设置界面居中
        this.setLocationRelativeTo(null);

        //设置关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//修改.后面的内容可以修改关闭模式
        //取消默认的居中设置,只要取消了才会按照xy的值来放指定的位置
        this.setLayout(null);
        //给整个界面添加键盘监听事件
        this.addKeyListener(this);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }
    //按下不松时会调用这个方法
    @Override
    public void keyPressed(KeyEvent e) {
        int code=e.getKeyCode();
        //快捷键a查看原图
        if (code==65){
            //先把界面中的所有图片全部删除
            this.getContentPane().removeAll();
            //加载完整的图片
            JLabel all=new JLabel(new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\未标题-1.jpg"));
            all.setBounds(83,134,372,372);
            this.getContentPane().add(all);
            //加载背景图片
            //添加背景图片
            JLabel background=new JLabel(new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\未标题-2.jpg"));
            background.setBounds(20,40,508,560);
            this.getContentPane().add(background);
            //刷新界面
            this.getContentPane().repaint();
            //然后想调回原来的那个拼图界面,就要用下面的(keyReleased)接口
        }
    }
    //松开时
    @Override
    public void keyReleased(KeyEvent e) {
        //判断有没有成功,如果成功结束游戏
        if (victory()){
            return;
        }

        //对上下左右进行判断
        //左37,上,38,右39,上,40(忘记了可以打印code的值获取
        int code=e.getKeyCode();
        if (code==37){
            if (y==0){
                return;
            }
            System.out.println("向←移动");
            date[x][y]=date[x][y-1];
            date[x][y-1]=0;
            y--;
            //记步数
            step++;
            initImage();
        } else if (code==38) {
            if (x==0){
                return;
            }
            System.out.println("向上移动");
            //逻辑:把空白方块儿下方的数字向上移动,xy表示空白方块儿,x+1,y表示空白方块儿下方的数字
            date[x][y]=date[x-1][y];
            date[x-1][y]=0;
            x--;
            //记步数
            step++;
            //调用方法按照最新的数字加载图片
            initImage();

        } else if (code==39) {
            if (y==2){
                return;
            }
            System.out.println("向右移动");
            date[x][y]=date[x][y+1];
            date[x][y+1]=0;
            y++;
            //记步数
            step++;
            initImage();
        } else if (code==40) {
            //下移动
            if (x==2){
                return;
            }
            System.out.println("向下移动");
            date[x][y]=date[x+1][y];
            date[x+1][y]=0;
            x++;
            //记步数
            step++;
            initImage();
            //快捷键w一件获胜
        } else if (code==65) {
            initImage();
        } else if (code==87) {
            date =new int[][]{{1,2,3},{4,5,6},{7,8,0}};


            initImage();
        }
    }

    //判断date数组中的数据是否和win数组中相通
    //如果全部相通,返回true,否则返回false
    public boolean victory(){
        for (int i = 0; i < date.length; i++) {
            for (int j = 0; j < date.length; j++) {
                if (date[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;
            //再次打乱图像
            intDate();
            //重新加载图片
            initImage();

        } else if (obj==reloginItem) {
            System.out.println("重新登录游戏");
            //关闭当前游戏界面
            this.setVisible(false);
            //打开登录界面
            new UI.LoginJfarame();
            //计数
            step=0;
        } else if (obj==closeItem) {
            System.out.println("关闭游戏");
            System.exit(0);
        } else if (obj==accountItem) {
            System.out.println("公众号");
            //创建一个弹窗对象
            JDialog jDialog=new JDialog();
            //创建一个管理图片容器对象Jlabel
            JLabel jLabel=new JLabel(new ImageIcon(path+"弹窗00.png"));
            //设置位置和宽高
            jLabel.setBounds(0,0,500,500);
            //把图片添加到弹窗当中
            jDialog.getContentPane().add(jLabel);
            //设置弹窗大小
            jDialog.setSize(520,520);
            //让弹窗置顶
            jDialog.setAlwaysOnTop(true);
            //让弹窗居中
            jDialog.setLocationRelativeTo(null);
            //弹窗不关闭无法操作下面的界面
            jDialog.setModal(true);
            //让弹窗显示出来
            jDialog.setVisible(true);

        }

    }
}

//******************************************************
package UI;

        import javax.swing.*;

public class RegisterJframe extends JFrame {
    public RegisterJframe (){
        setSize(488,500);
        //设置界面的标题
        this.setTitle("拼图  注册");

        //置顶设置
        this.setAlwaysOnTop(true);

        //设置界面居中
        this.setLocationRelativeTo(null);

        //设置关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        setVisible(true);
    }
}

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这是一个 Java 写的拼图小游戏完整代码示例: ``` import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Collections; public class PuzzleGame extends JFrame implements ActionListener { private JButton startButton; // 开始按钮 private JPanel gamePanel; // 游戏面板 private JButton[] buttons; // 拼图按钮 private ImageIcon[] icons; // 拼图图片 private int blankLocation; // 空白块位置 public PuzzleGame() { // 初始化窗口 setTitle("拼图小游戏"); setSize(400, 400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new BorderLayout()); // 初始化开始按钮 startButton = new JButton("开始游戏"); startButton.addActionListener(this); add(startButton, BorderLayout.NORTH); // 初始化游戏面板 gamePanel = new JPanel(); gamePanel.setLayout(new GridLayout(3, 3)); add(gamePanel, BorderLayout.CENTER); // 初始化拼图按钮和图片 buttons = new JButton[9]; icons = new ImageIcon[9]; for (int i = 0; i < 9; i++) { icons[i] = new ImageIcon("image" + i + ".jpg"); buttons[i] = new JButton(); buttons[i].addActionListener(this); } setVisible(true); } public void startGame() { // 随机打乱拼图顺序 ArrayList<Integer> list = new ArrayList<>(); for (int i = 0; i < 9; i++) { list.add(i); } Collections.shuffle(list); // 将拼图加入游戏面板 for (int i = 0; i < 9; i++) { gamePanel.add(buttons[list.get(i)]); buttons[list.get(i)].setIcon(icons[list.get(i)]); if (list.get(i) == 0) { blankLocation = i; } } } @Override public void actionPerformed(ActionEvent e) { // 点击开始按钮 if (e

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值