Java实现简单扫雷程序

网友投稿 290 2022-07-26


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

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

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

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

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

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

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

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

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

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]SZcBLxM[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);

http:// 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);

}

}

}

}

}

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java将本地项目部署到Linux服务器的实践
下一篇:Java 开启多线程常见的4种方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~