详细代码见我的相应github仓库:
https://github.com/29DCH/Mine-Sweeper
欢迎fork源码到你自己的仓库下面。
效果图:
java awt以及swing实现的扫雷游戏,实现了基本逻辑.主要用到了floodfill(漫水填充)算法和knuth-shuffling-algorithm(Fisher–Yates也被称作高纳德(Knuth)随机置乱算法,随机洗牌算法)
代码如下:
AlgoFrame.java
package Test;
import java.awt.*;
import javax.swing.*;
public class AlgoFrame extends JFrame{
private int canvasWidth;
private int canvasHeight;
public AlgoFrame(String title, int canvasWidth, int canvasHeight){
super(title);
this.canvasWidth = canvasWidth;
this.canvasHeight = canvasHeight;
AlgoCanvas canvas = new AlgoCanvas();
setContentPane(canvas);
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setVisible(true);
}
public AlgoFrame(String title){
this(title, 1024, 768);
}
public int getCanvasWidth(){
return canvasWidth;}
public int getCanvasHeight(){
return canvasHeight;}
// data
private MineSweeperData data;
public void render(MineSweeperData data){
this.data = data;
repaint();
}
private class AlgoCanvas extends JPanel{
public AlgoCanvas(){
// 双缓存
super(true);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
// 抗锯齿
RenderingHints hints = new RenderingHints(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2d.addRenderingHints(hints);
// 具体绘制
int w = canvasWidth/data.M();
int h = canvasHeight/data.N();
for(int i = 0 ; i < data.N() ; i ++)
for(int j = 0 ; j < data.M() ; j ++){
if(data.open[i][j]){
if(data.isMine(i, j))
AlgoVisHelper.putImage(g2d, j*w, i*h, MineSweeperData.mineImageURL);
else
AlgoVisHelper.putImage(g2d, j*w, i*h, MineSweeperData.numberImageURL(data.getNumber(i, j)));
}
else{
if(data.flags[i][j])
AlgoVisHelper.putImage(g2d, j*w, i*h, MineSweeperData.flagImageURL);
else
AlgoVisHelper.putImage(g2d, j*w, i*h, MineSweeperData.blockImageURL);
}
}
}
@Override
public Dimension getPreferredSize(){
return new Dimension(canvasWidth, canvasHeight);
}
}
}
AlgoVisHelper.java
package Test;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.lang.InterruptedException;
public