java做一个打地鼠小游戏

想起了了大学那会做过这个小游戏,今天重新写一下

首先准备几个素材图片,搜了半天没有,只好自己找了个图片截了一下(如果侵权了联系我删除)。

JFrame画一个主页面,设置了全局的行、列和总数,循环添加所有的地鼠洞并注册点击事件,我把所有的洞存在了一个ArrayList里面(随机访问,减少循环判断)

开一个线程用于地鼠钻出的事件,生成随机数,此位置是空洞的话(否则重新生成),添加地鼠,等设置时间结束,如果没有改变就消失,如此循环执行

添加点击事件,打中地鼠,调用一个线程,执行地鼠消失的事件

/**
 * 打地鼠页面
 * Created by will on 2020/7/27.
 */
public class MouseFrame extends JFrame implements MouseListener {

    // 行,列,总数
    private int row = 6;
    private int column = 8;
    private int count = row * column;
    // 存储每个画面
    List<JLabel> labelList = new ArrayList();
    //
    private JPanel mainPanel = new JPanel(new GridLayout(row, column));
    // 图片
    ImageIcon hole = new ImageIcon("./src/main/resources/images/hole.png");
    ImageIcon mouse1 = new ImageIcon("./src/main/resources/images/mouse1.png");
    ImageIcon mouse2 = new ImageIcon("./src/main/resources/images/mouse2.png");
    ImageIcon hit = new ImageIcon("./src/main/resources/images/hit.png");

    /**
     * 打地鼠主页面
     */
    public MouseFrame() {
        // 窗口大小
        this.setSize(800, 600);
        // 把窗口位置设置到屏幕中心
        this.setLocationRelativeTo(null);
        // 关闭窗口时退出程序
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setTitle("打地鼠");

        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                JLabel holeLabel = new JLabel(hole);
                holeLabel.addMouseListener(this);
                labelList.add(holeLabel);
                mainPanel.add(holeLabel);
            }
        }
        // 地鼠刷新
        new Thread(new MouseThread()).start();

        this.setContentPane(mainPanel);
        this.setVisible(true);
    }

    /**
     * 鼠标点击事件
     *
     * @param e
     */
    @Override
    public void mouseClicked(MouseEvent e) {
        JLabel holeLabel = (JLabel) e.getSource();
        // 存在地鼠,调用消失事件
        if (holeLabel.getIcon() == mouse2) {
            new Thread(new MouseDisThread(holeLabel)).start();
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }

    /**
     * 地鼠钻出的事件
     */
    class MouseThread implements Runnable {

        @Override
        public void run() {
            while (true) {
                // 生成随机位置
                int num = new Random().nextInt(count);
                // 此位置如果是空的才进行出现的动作,否则生成新位置
                while (labelList.get(num).getIcon() != hole) {
                    num = new Random().nextInt(count);
                }
                // 地鼠出现的动作
                try {
                    labelList.get(num).setIcon(mouse1);
                    Thread.sleep(100);
                    labelList.get(num).setIcon(mouse2);
                    Thread.sleep(1500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // 时间结束还是未点击的装态,设置为消失
                if (labelList.get(num).getIcon() == mouse2) {
                    labelList.get(num).setIcon(hole);
                }
            }
        }
    }

    /**
     * 被打消失
     */
    class MouseDisThread implements Runnable {

        JLabel holeLabel;

        public MouseDisThread(JLabel holeLabel) {
            this.holeLabel = holeLabel;
        }

        @Override
        public void run() {
            holeLabel.setIcon(hit);
            try {
                Thread.sleep(800);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            } finally {
                holeLabel.setIcon(hole);
            }
        }
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值