想起了了大学那会做过这个小游戏,今天重新写一下
首先准备几个素材图片,搜了半天没有,只好自己找了个图片截了一下(如果侵权了联系我删除)。
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);
}
}
}
}