当前位置:首页 > 开发教程 > java教程 >

Java实现简单扫雷程序

时间:2022-06-06 12:31 来源:未知 作者:谢谢你给的幸福 收藏

这篇文章主要为大家详细介绍了Java实现简单扫雷程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

用Java实现简单扫雷程序,供大家参考,具体内容如下

页面设置:框架是borderlayout,在上中下加入外面要加入的组件(左边和右边不加)。扫雷用的布局是gridlayout即网格布局,与扫雷界面天然契合。

组件:使用panel,button,frame,label等组件,最后集中到frame中形成整体。并对其加入适当的监听,监听算法的实现如下。

扫雷算法:一共要考虑三种情况,第一种是点到雷的情况,第二种是点到空的格的情况,第三种是点到有数字的情况。下面我们对这些情况一一进行考虑,完成算法的设计。首先随机生成一个扫雷的图,上面包含有随机生成的雷,雷旁边的数字和空白组成的矩阵matrix,之后所有的监听都依照这个矩阵matrix为参照。

①点到空的时候,调用递归算法寻找旁边空格(周围一圈)的将其显示(这里笔者就是帮他换了一个颜色,即完成了
显示工作,读者也可以将点击的button组件换成label),直到找到是数字的格就停止对这个方向上的显示。
②点到数字的时候,就将格子显示。
③点到雷的时候,显示全部matrix中的值,即结束游戏。

递归算法:当点击空白格时,对其周围一圈的格子进行查找,当它是隔空的时候就将它显示,如果不是就停止对这个格子上的递归算法。

参照矩阵matrix的生成:随机使用random函数随机生成1-size(扫雷的规模)的随机数,形成雷的横纵坐标,并加入matrix中,这里的矩阵是string类型的,雷用“*”表示,根据雷的位置,分别对其周围的格子上的数字加1,即形成参照矩阵。

算法的改进:加入菜单栏,实时计时器,改变扫雷游戏规模,及代码比较冗余(毕竟完成大于完美),这里为读者提供一个模板,读者可以以此参照做进一步修改。

下面是成品的展示图和源码

Java实现简单扫雷程序

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/*
* 扫雷
*/
class newJButton extends JButton {
 // 新建组合JButton类
 int axisx;
 int axisy;

 newJButton(String s, int axisx, int axisy) {
  super(s);
  this.axisx = axisx;
  this.axisy = axisy;
 }

 public int getaxisx() {
  return axisx;
 }

 public int getaxisy() {
  return axisy;
 }
}
public class MineTest implements ActionListener {
 // 组件定义
 static final int size = 10; // 扫雷游戏规模
 int time; // 计算雷的个数
 JFrame frame = new JFrame("扫雷");
 JPanel panel1 = new JPanel(); // 计时器
 JPanel panel2 = new JPanel(); // 笑脸
 JPanel panel3 = new JPanel(); // 初级扫雷
 newJButton t;
 newJButton t2;
 long programStart = System.currentTimeMillis();
 long programOver;
 String[][] matrix = new String[size][size]; // 扫雷信息记录矩阵
 newJButton[][] buttons = new newJButton[size][size]; // 创建扫雷按钮矩阵
 int[][] tip = new int[size][size]; // 判断是否可以显示按钮

 // 提示
 public void inittime() {
  t = new newJButton("进行中", 101, 101);
  t2 = new newJButton("/", 102, 102);
  panel2.add(t);
  panel2.add(t2);
 }

 // 笑脸
 public void initsmile() {
  newJButton b = new newJButton("O", 100, 100); // 将归零按键"O"的坐标设置为(100,100)
  b.addActionListener(this);
  panel1.add(b);
 }

 // 初级扫雷
 public void initmine() {
  panel3.setLayout(new GridLayout(10, 10, 1, 1));
  // panel3.setSize(250,250);
  for (int i = 0; i < size; i++) {
   for (int j = 0; j < size; j++) {
    // button.setSize(25,25);
    panel3.add(buttons[i][j]);
   }
  }

 }

 // 总界面的组合
 public void initcombine() {
  frame.setLayout(new BorderLayout());
  frame.add(panel1, BorderLayout.NORTH);
  frame.add(panel2, BorderLayout.CENTER);
  frame.add(panel3, BorderLayout.SOUTH);
  // frame.add(panel4);
 }

 // 扫雷页面初始化
 MineTest() {

  // 产生按钮
  for (int i = 0; i < size; i++) {
   for (int j = 0; j < size; j++) {
    newJButton jb = new newJButton(" ", i, j);
    jb.setBackground(Color.WHITE);
    jb.addActionListener(this);
    buttons[i][j] = jb;
   }
  }

  inittime();
  initsmile();
  initmine();
  initcombine();
  frame.setVisible(true);
  frame.setSize(500, 500);
  frame.setLocation(700, 300);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 可以关闭
  // frame.pack();

  // 产生size个雷并加入到矩阵中
  do {
   time = 0;
   pmatrix(); // 初始化原始矩阵
   boom(); // 加入雷
   for (int i = 0; i < size; i++) {
    for (int j = 0; j < size; j++) {
     if (matrix[i][j] == "*") {
      time = time + 1;
     }
    }
   }
  } while (time != 10);
  caculate(); // 计算扫雷矩阵中的距离

  // 形成改变颜色的状态矩阵
  for (int i = 0; i < size; i++) {
   for (int j = 0; j < size; j++) {
    if (matrix[i][j] == "0") {
     tip[i][j] = 0;
    } else {
     tip[i][j] = 1;
    }
   }
  }

  // 打印
  for (int i = 0; i < size; i++) {
   for (int j = 0; j < size; j++) {
    System.out.print(matrix[i][j] + " ");
   }
   System.out.println("\n");
  }

 }

 private void pmatrix() {
  // 扫雷矩阵初始化
  for (int i = 0; i < size; i++) {
   for (int j = 0; j < size; j++) {
    matrix[i][j] = "0";
   }
  }
 }

 private void boom() {
  // 产生炸弹;
  int num = 0;
  while (num < size) {
   int i = (int) (Math.random() * size);
   int j = (int) (Math.random() * size);
   matrix[i][j] = "*";
   num = num + 1;
  }
 }

 @Override
 public void actionPerformed(ActionEvent e) {
  // 按钮响应事件
  newJButton temp = (newJButton) e.getSource();
  if (temp.getText() == "O") {
   // 产生size个雷并加入到矩阵中
   do {
    time = 0;
    pmatrix(); // 初始化原始矩阵
    boom(); // 加入雷
    for (int i = 0; i < size; i++) {
     for (int j = 0; j < size; j++) {
      if (matrix[i][j] == "*") {
       time = time + 1;
      }
     }
    }
   } while (time != 10);
   caculate(); // 计算扫雷矩阵中的距离

   // 形成改变颜色的状态矩阵
   for (int i = 0; i < size; i++) {
    for (int j = 0; j < size; j++) {
     if (matrix[i][j] == "0") {
      tip[i][j] = 0;
     } else {
      tip[i][j] = 1;
     }
    }
   }

   // 打印
   for (int i = 0; i < size; i++) {
    for (int j = 0; j < size; j++) {
     System.out.print(matrix[i][j] + " ");
    }
    System.out.println("\n");
   }
   for (int i = 0; i < size; i++) {
    for (int j = 0; j < size; j++) {
     buttons[i][j].setText(" ");
     buttons[i][j].setBackground(Color.WHITE);
    }
   }
   t.setLabel("进行中");
   t2.setLabel("/");
   programStart = System.currentTimeMillis();
   // System.out.println("smile");
  } else if (matrix[temp.getaxisx()][temp.getaxisy()] == "*") {
   for (int i = 0; i < size; i++) {
    for (int j = 0; j < size; j++) {
     if (matrix[i][j] != "0") {
      buttons[i][j].setText(matrix[i][j]);
      if (matrix[i][j] == "*") {
       buttons[i][j].setBackground(Color.RED);
      }
     }
    }
   }
   t.setLabel("失败");
   programOver = System.currentTimeMillis();
   t2.setLabel("" + (programOver - programStart) / 1000 + "s");
  } else if (matrix[temp.getaxisx()][temp.getaxisy()] != "0") {
   buttons[temp.getaxisx()][temp.getaxisy()].setText(matrix[temp.getaxisx()][temp.getaxisy()]);
   buttons[temp.getaxisx()][temp.getaxisy()].setBackground(Color.gray);
  } else if (matrix[temp.getaxisx()][temp.getaxisy()] == "0") {
   digui(temp.getaxisx(), temp.getaxisy());
  }
 }

 private void digui(int i, int j) {
  // 递归调用该函数,处理按钮是“0”的情况
  if (i == 0 && j == 0) {
   if (tip[i][j] == 0) {
    buttons[i][j].setBackground(Color.gray);
    tip[i][j] = 1;
    digui(i, j + 1);
    digui(i + 1, j + 1);
    digui(i + 1, j);
   } else {
    if (matrix[i][j] == "0") {
     buttons[i][j].setBackground(Color.gray);
     tip[i][j] = 1;
    } else {
     buttons[i][j].setText(matrix[i][j]);
     buttons[i][j].setBackground(Color.gray);
     tip[i][j] = 1;
    }
   }
  } else if (i == 0 && j == size-1) {
   if (tip[i][j] == 0) {
    buttons[i][j].setBackground(Color.gray);
    tip[i][j] = 1;
    digui(i, j - 1);
    digui(i + 1, j - 1);
    digui(i + 1, j);
   } else {
    if (matrix[i][j] == "0") {
     buttons[i][j].setBackground(Color.gray);
     tip[i][j] = 1;
    } else {
     buttons[i][j].setText(matrix[i][j]);
     buttons[i][j].setBackground(Color.gray);
     tip[i][j] = 1;
    }
   }
  } else if (i == size-1 && j == 0) {
   if (tip[i][j] == 0) {
    buttons[i][j].setBackground(Color.gray);
    tip[i][j] = 1;
    digui(i, j + 1);
    digui(i - 1, j + 1);
    digui(i - 1, j);
   } else {
    if (matrix[i][j] == "0") {
     buttons[i][j].setBackground(Color.gray);
     tip[i][j] = 1;
    } else {
     buttons[i][j].setText(matrix[i][j]);
     buttons[i][j].setBackground(Color.gray);
     tip[i][j] = 1;
    }
   }
  } else if (i == size-1 && j == size-1) {
   if (tip[i][j] == 0) {
    buttons[i][j].setBackground(Color.gray);
    tip[i][j] = 1;
    digui(i, j - 1);
    digui(i - 1, j - 1);
    digui(i - 1, j);
   } else {
    if (matrix[i][j] == "0") {
     buttons[i][j].setBackground(Color.gray);
     tip[i][j] = 1;
    } else {
     buttons[i][j].setText(matrix[i][j]);
     buttons[i][j].setBackground(Color.gray);
     tip[i][j] = 1;
    }
   }
  } else if (i == 0) {
   if (tip[i][j] == 0) {
    buttons[i][j].setBackground(Color.gray);
    tip[i][j] = 1;
    digui(i, j - 1);
    digui(i, j + 1);
    digui(i + 1, j - 1);
    digui(i + 1, j);
    digui(i + 1, j + 1);
   } else {
    if (matrix[i][j] == "0") {
     buttons[i][j].setBackground(Color.gray);
     tip[i][j] = 1;
    } else {
     buttons[i][j].setText(matrix[i][j]);
     buttons[i][j].setBackground(Color.gray);
     tip[i][j] = 1;
    }
   }
  } else if (j == 0) {
   if (tip[i][j] == 0) {
    buttons[i][j].setBackground(Color.gray);
    tip[i][j] = 1;
    digui(i - 1, j);
    digui(i + 1, j);
    digui(i - 1, j + 1);
    digui(i, j + 1);
    digui(i + 1, j + 1);
   } else {
    if (matrix[i][j] == "0") {
     buttons[i][j].setBackground(Color.gray);
     tip[i][j] = 1;
    } else {
     buttons[i][j].setText(matrix[i][j]);
     buttons[i][j].setBackground(Color.gray);
     tip[i][j] = 1;
    }
   }
  } else if (i == size-1) {
   if (tip[i][j] == 0) {
    buttons[i][j].setBackground(Color.gray);
    tip[i][j] = 1;
    digui(i - 1, j - 1);
    digui(i - 1, j);
    digui(i - 1, j + 1);
    digui(i, j - 1);
    digui(i, j + 1);
   } else {
    if (matrix[i][j] == "0") {
     buttons[i][j].setBackground(Color.gray);
     tip[i][j] = 1;
    } else {
     buttons[i][j].setText(matrix[i][j]);
     buttons[i][j].setBackground(Color.gray);
     tip[i][j] = 1;
    }
   }
  } else if (j == size-1) {
   if (tip[i][j] == 0) {
    buttons[i][j].setBackground(Color.gray);
    tip[i][j] = 1;
    digui(i - 1, j);
    digui(i + 1, j);
    digui(i - 1, j - 1);
    digui(i - 1, j);
    digui(i - 1, j);
   } else {
    if (matrix[i][j] == "0") {
     buttons[i][j].setBackground(Color.gray);
     tip[i][j] = 1;
    } else {
     buttons[i][j].setText(matrix[i][j]);
     buttons[i][j].setBackground(Color.gray);
     tip[i][j] = 1;
    }
   }
  } else {
   if (tip[i][j] == 0) {
    buttons[i][j].setBackground(Color.gray);
    tip[i][j] = 1;
    digui(i - 1, j - 1);
    digui(i - 1, j);
    digui(i - 1, j + 1);
    digui(i, j - 1);
    digui(i, j + 1);
    digui(i + 1, j - 1);
    digui(i + 1, j);
    digui(i + 1, j + 1);
   } else {
    if (matrix[i][j] == "0") {
     buttons[i][j].setBackground(Color.gray);
     tip[i][j] = 1;
    } else {
     buttons[i][j].setText(matrix[i][j]);
     buttons[i][j].setBackground(Color.gray);
     tip[i][j] = 1;
    }
   }
  }
 }

 public static void main(String[] args) {
  new MineTest();
 }

 private void caculate() {
  // 计算扫雷矩阵中的距离
  for (int i = 0; i < size; i++) {
   for (int j = 0; j < size; j++) {
    if (matrix[i][j] == "*") {
     if (i == 0 && j == 0) {
      if (matrix[i + 1][j] != "*") {
       matrix[i + 1][j] = String.valueOf(Integer.parseInt(matrix[i + 1][j]) + 1);
      }
      if (matrix[i + 1][j + 1] != "*") {
       matrix[i + 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j + 1]) + 1);
      }
      if (matrix[i][j + 1] != "*") {
       matrix[i][j + 1] = String.valueOf(Integer.parseInt(matrix[i][j + 1]));
      }
     } else if (i == 9 && j == 0) {
      if (matrix[i - 1][j] != "*") {
       matrix[i - 1][j] = String.valueOf(Integer.parseInt(matrix[i - 1][j]) + 1);
      }
      if (matrix[i - 1][j + 1] != "*") {
       matrix[i - 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j + 1]) + 1);
      }
      if (matrix[i][j + 1] != "*") {
       matrix[i][j + 1] = String.valueOf(Integer.parseInt(matrix[i][j + 1]) + 1);
      }
     } else if (i == 0 && j == 9) {
      if (matrix[i + 1][j] != "*") {
       matrix[i + 1][j] = String.valueOf(Integer.parseInt(matrix[i + 1][j]) + 1);
      }
      if (matrix[i + 1][j - 1] != "*") {
       matrix[i + 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j - 1]) + 1);
      }
      if (matrix[i][j - 1] != "*") {
       matrix[i][j - 1] = String.valueOf(Integer.parseInt(matrix[i][j - 1]) + 1);
      }
     } else if (i == 9 && j == 9) {
      if (matrix[i][j - 1] != "*") {
       matrix[i][j - 1] = String.valueOf(Integer.parseInt(matrix[i][j - 1]) + 1);
      }
      if (matrix[i - 1][j] != "*") {
       matrix[i - 1][j] = String.valueOf(Integer.parseInt(matrix[i - 1][j]) + 1);
      }
      if (matrix[i - 1][j - 1] != "*") {
       matrix[i - 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j - 1]) + 1);
      }
     } else if (i == 0) {
      if (matrix[i][j - 1] != "*") {
       matrix[i][j - 1] = String.valueOf(Integer.parseInt(matrix[i][j - 1]) + 1);
      }
      if (matrix[i][j + 1] != "*") {
       matrix[i][j + 1] = String.valueOf(Integer.parseInt(matrix[i][j + 1]) + 1);
      }
      if (matrix[i + 1][j - 1] != "*") {
       matrix[i + 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j - 1]) + 1);
      }
      if (matrix[i + 1][j] != "*") {
       matrix[i + 1][j] = String.valueOf(Integer.parseInt(matrix[i + 1][j]) + 1);
      }
      if (matrix[i + 1][j + 1] != "*") {
       matrix[i + 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j + 1]) + 1);
      }
     } else if (j == 0) {
      if (matrix[i - 1][j] != "*") {
       matrix[i - 1][j] = String.valueOf(Integer.parseInt(matrix[i - 1][j]) + 1);
      }
      if (matrix[i - 1][j + 1] != "*") {
       matrix[i - 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j + 1]) + 1);
      }
      if (matrix[i][j + 1] != "*") {
       matrix[i][j + 1] = String.valueOf(Integer.parseInt(matrix[i][j + 1]) + 1);
      }
      if (matrix[i + 1][j] != "*") {
       matrix[i + 1][j] = String.valueOf(Integer.parseInt(matrix[i + 1][j]) + 1);
      }
      if (matrix[i + 1][j + 1] != "*") {
       matrix[i + 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j + 1]) + 1);
      }
     } else if (i == 9) {
      if (matrix[i][j - 1] != "*") {
       matrix[i][j - 1] = String.valueOf(Integer.parseInt(matrix[i][j - 1]) + 1);
      }
      if (matrix[i][j + 1] != "*") {
       matrix[i][j + 1] = String.valueOf(Integer.parseInt(matrix[i][j + 1]) + 1);
      }
      if (matrix[i - 1][j - 1] != "*") {
       matrix[i - 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j - 1]) + 1);
      }
      if (matrix[i - 1][j] != "*") {
       matrix[i - 1][j] = String.valueOf(Integer.parseInt(matrix[i - 1][j]) + 1);
      }
      if (matrix[i - 1][j + 1] != "*") {
       matrix[i - 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j + 1]) + 1);
      }
     } else if (j == 9) {
      if (matrix[i - 1][j] != "*") {
       matrix[i - 1][j] = String.valueOf(Integer.parseInt(matrix[i - 1][j]) + 1);
      }
      if (matrix[i + 1][j] != "*") {
       matrix[i + 1][j] = String.valueOf(Integer.parseInt(matrix[i + 1][j]) + 1);
      }
      if (matrix[i - 1][j - 1] != "*") {
       matrix[i - 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j - 1]) + 1);
      }
      if (matrix[i][j - 1] != "*") {
       matrix[i][j - 1] = String.valueOf(Integer.parseInt(matrix[i][j - 1]) + 1);
      }
      if (matrix[i + 1][j - 1] != "*") {
       matrix[i + 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j - 1]) + 1);
      }
     } else {
      if (matrix[i - 1][j - 1] != "*") {
       matrix[i - 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j - 1]) + 1);
      }
      if (matrix[i - 1][j] != "*") {
       matrix[i - 1][j] = String.valueOf(Integer.parseInt(matrix[i - 1][j]) + 1);
      }
      if (matrix[i - 1][j + 1] != "*") {
       matrix[i - 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j + 1]) + 1);
      }
      if (matrix[i][j - 1] != "*") {
       matrix[i][j - 1] = String.valueOf(Integer.parseInt(matrix[i][j - 1]) + 1);
      }
      if (matrix[i][j + 1] != "*") {
       matrix[i][j + 1] = String.valueOf(Integer.parseInt(matrix[i][j + 1]) + 1);
      }
      if (matrix[i + 1][j - 1] != "*") {
       matrix[i + 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j - 1]) + 1);
      }
      if (matrix[i + 1][j] != "*") {
       matrix[i + 1][j] = String.valueOf(Integer.parseInt(matrix[i + 1][j]) + 1);
      }
      if (matrix[i + 1][j + 1] != "*") {
       matrix[i + 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j + 1]) + 1);
      }
     }
    }
   }
  }

 }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持源码搜藏网。


下一篇:没有了

java教程阅读排行

最新文章