极其low的java版扫雷...
内容包括基础的点击,周围雷数,翻到0时将相连的0全部翻开,以及标记按钮
github地址:https://github.com/jnxxhzz/java-winmine 单独下载saolei.rar解压import即可
以下正文
_______________________________________________________________________________________________________
这里使用swing.frame ,swing.jbutton等 及mouselistener进行鼠标动作监听
1.首先生成基础界面
1)加载重新开始按钮
2)加载记录剩余雷数的计数器
3)加载游戏区域的所有按钮
2.添加游戏内容
1)随机选择游戏区域内的某些块变成“雷”,同时让周围的所有非雷块计数器+1
2)添加openButton方法,在翻开计数为0的块时递归翻开所有相连的0块
3)使用mouselistener监听鼠标,加载mouseclicked的方法判断当前鼠标左键及右键的所有触发情况
3.添加游戏胜利,游戏失败等内容
1)添加游戏胜利的显示内容,并且翻开所有方块
2)添加游戏失败的显示内容,并且翻开所有方块
3)添加重新开始按钮的操作,重载所有游戏内容
全局变量
JFrame frame = new JFrame("扫雷");
JButton reset = new JButton("Again");
Container container = new Container();
JPanel Header=new JPanel();
final int dirx[]= {-1, 0, 1,0, 1,-1,-1,1};
final int diry[]= { 0,-1, 0,1,-1,-1, 1,1};
final int dirn = 8;
Config config = new Config();
final int Mine = -1;
JButton border[][] = new JButton[config.row][config.col]; //按钮
int score[][] = new int[config.row][config.col]; //数字
int sign[][] = new int[config.row][config.col]; //标记
int nowsigns = config.Minenumber;
JButton scoreborder = new JButton();
以及重构类config
public class Config {
final int row = 20;
final int col = 20;
final int Minenumber = 50;
Color Minecolor = Color.RED;
Color Signcolor = Color.BLACK;
Color Opencolor = Color.GREEN;
Color Nocolor = Color.YELLOW;
final int signed = 1;
final int notsigned = 0;
}
首先需要生成一个基础界面
public Saolei() {
//设置界面大小
frame.setSize(600,700);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
//加载reset
addOtherButton();
//加载主界面按钮
addborder();
//加载雷
addMine();
frame.setVisible(true);
}
接下来加载重新开始与标记雷数的两个按钮 reset 和 scoreborder
void addOtherButton() {
//加载重新开始按钮
reset.setBackground(config.Nocolor);
reset.setOpaque(false); //透明度
reset.addMouseListener(this);
//加载分数面板
scoreborder.setEnabled(false);
scoreborder.setOpaque(true); //透明度
Header.add(reset);
Header.add(scoreborder);
frame.add(Header,BorderLayout.NORTH);
}
然后加载属于游戏区域的按钮
void addborder() {
frame.add(container,BorderLayout.CENTER);
container.setLayout(new GridLayout(config.row,config.col));
for (int i = 0; i < config.row ; i++)
for (int j = 0; j < config.col ; j++) {
JButton x = new JButton();
x.setMargin(new Insets(0,0,0,0));
x.setBackground(config.Nocolor);
x.setOpaque(false);
x.addMouseListener(this);
border[i][j] = x;
container.add(x);
}
}
将游戏区域内的按钮部分修改为雷,并在雷的周围九宫格的计数器+1
void addMine() {
scoreborder.setText("雷数:" + nowsigns);
Random rand = new Random();
nowsigns = config.Minenumber;
for (int i = 0 ; i < config.Minenumber; i++) {
int x = rand.nextInt(config.row);
int y = rand.nextInt(config.col);
if (score[x][y] == Mine) i--;
else {
score[x][y] = Mine;
for (int k=0;k=0 && gx=0 && gy
添加openButton翻开块的动作方法,若翻开的是0块则递归继续翻开所有相连的0块
void openButton(int x,int y) {
border[x][y].setText( "" + score[x][y]);
border[x][y].setBackground(config.Opencolor);
border[x][y].setEnabled(false);
border[x][y].setOpaque(true);
if (score[x][y] !=0 ) return;
for (int i=0;i=0 && gy>=0 && gx
使用mouselistener监听鼠标操作
首先获取被点击的button
若点击的是reset按钮则重新开始游戏
否则点击的就是游戏区域内的按钮
此时需要判断是右键点击还是左键点击
若是左键点击
则判断当前块是否被标记
若被标记过则无响应
若没有被标记,则使用openButton方法翻开当前块
若是右键点击
判断是当前快否被翻开
若没有翻开则判断当前块是否被标记
若被标记则取消标记
若没有标记则标记当前块
若被翻开则无响应
public void mouseClicked(MouseEvent xx) {
//获取点击button
JButton button = (JButton)xx.getSource();
int tx = 0,ty = 0;
for (int i=0;i
加载wingame,losegame,againgame,showall四个方法
void checkWin() {
for (int i=0;i