Java版的扫雷游戏源码
阅读原文时间:2023年07月08日阅读:1

package com.xz.sl;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Saolei extends JFrame{

final int ROW = 20;  
final int COL = 20;  
final int LEI = 30;  
JButton\[\]\[\] buttons = new JButton\[ROW\]\[COL\];  
int\[\]\[\] counts = new int\[ROW\]\[COL\];  
final int LCODE = 11; //雷的编码

Container container = new Container();

public Saolei() {  
    init();

}

private void init() {  
    JButton restBtn = new JButton("重来");  
    restBtn.setOpaque(true);  
    restBtn.setBackground(Color.PINK);  
    restBtn.addActionListener(new ActionListener() {

        @Override  
        public void actionPerformed(ActionEvent e) {  
            for(int i=0;i<ROW;i++) {  
                for(int j=0;j<COL;j++) {  
                 buttons\[i\]\[j\].setText("");  
                 buttons\[i\]\[j\].setEnabled(true);  
                 buttons\[i\]\[j\].setBackground(Color.YELLOW);  
                 counts\[i\]\[j\] = 0;

                }  
            }  
            mailei();  
            jslsl();  
        }  
    });

    setLayout(new BorderLayout());  
    add(restBtn,BorderLayout.NORTH);  
    add(container,BorderLayout.CENTER);  
    container.setLayout(new GridLayout(ROW,COL));  
    for(int i=0;i<ROW;i++) {  
        for(int j=0;j<COL;j++) {  
            JButton button = new JButton();  
            button.setMargin(new Insets(0, 0, 0, 0));  
            button.setBackground(Color.YELLOW);  
            button.setOpaque(true);  
            buttons\[i\]\[j\] = button;  
            button.addActionListener(new ActionListener() {

                @Override  
                public void actionPerformed(ActionEvent e) {  
                    JButton button = (JButton) e.getSource();  
                    if(button.equals(restBtn)) {

                    }else {  
                        int count = 0;  
                        for(int i=0;i<ROW;i++) {  
                            for(int j=0;j<COL;j++) {  
                                if(button.equals(buttons\[i\]\[j\])) {  
                                    count = counts\[i\]\[j\];  
                                    //踩到雷了  
                                    if(count == LEI) {  
                                        clcl();  
                                    }else {  
                                        openCell(i,j);  
                                        checkWin();  
                                    }  
                                    return;  
                                }  
                            }  
                        }  
                    }  
                }

                private void checkWin() {  
                    for(int i=0;i<ROW;i++) {  
                        for(int j=0;j<COL;j++) {  
                            //说明还没有赢  
                            if(buttons\[i\]\[j\].isEnabled() == true && counts\[i\]\[j\] != LEI) {  
                                return;  
                            }  
                        }  
                    }

                    JOptionPane.showMessageDialog(container, "恭喜您赢了...");

                }

                private void openCell(int i,int j ) {

                    //如果格子已经打开,直接返回  
                    if(buttons\[i\]\[j\].isEnabled() == false) {  
                        return ;  
                    }

                    buttons\[i\]\[j\].setText(counts\[i\]\[j\]+"");  
                    buttons\[i\]\[j\].setEnabled(false);  
                    buttons\[i\]\[j\].setBackground(Color.CYAN);

                    if(counts\[i\]\[j\] == 0) {  
                        //左上角  
                        if(i > 0 && j > 0 && counts\[i-1\]\[j-1\] != LEI) {  
                            openCell(i-1, j-1);  
                        }

                        if(i > 0 && j > 0  && counts\[i-1\]\[j\] != LEI) {  
                            openCell(i-1, j);  
                        }

                        if(i > 0 && j < 19  && counts\[i-1\]\[j+1\] != LEI) {  
                            openCell(i-1, j+1);  
                        }

                        if(i > 0 && j > 0  && counts\[i\]\[j-1\] != LEI) {  
                            openCell(i, j-1);  
                        }

                        if(i > 0 && j < 19  && counts\[i\]\[j+1\] != LEI) {  
                            openCell(i, j+1);  
                        }

                        if(i < 19 && j > 0  && counts\[i+1\]\[j-1\] != LEI) {  
                            openCell(i+1, j-1);  
                        }

                        if(i < 19 && j > 0 && counts\[i+1\]\[j\] != LEI) {  
                            openCell(i+1, j);  
                        }

                        if(i < 19 && j < 19  && counts\[i+1\]\[j+1\] != LEI) {  
                            openCell(i+1, j+1);  
                        }  
                    }else {  
                        buttons\[i\]\[j\].setText(counts\[i\]\[j\]+"");  
                    }  
                }

            });  
            container.add(button);  
        }  
    }  
    mailei();  
    //计算周边的雷的数量  
    jslsl();

    setVisible(true);  
    setTitle("扫雷游戏");  
    setResizable(false);  
    setDefaultCloseOperation(JFrame.EXIT\_ON\_CLOSE);  
    setSize(600,700);  
}

private void jslsl() {  
    for(int i=0;i<ROW;i++) {  
        for(int j=0;j<COL;j++) {  
            int count = 0;  
            if(counts\[i\]\[j\] == LEI) {  
                continue;  
            }

            //左上角  
            if(i > 0 && j > 0 && counts\[i-1\]\[j-1\] == LEI) {  
                count++;  
            }

            if(i > 0 && j > 0  && counts\[i-1\]\[j\] == LEI) {  
                count++;  
            }

            if(i > 0 && j < 19  && counts\[i-1\]\[j+1\] == LEI) {  
                count++;  
            }

            if(i > 0 && j > 0  && counts\[i\]\[j-1\] == LEI) {  
                count++;  
            }

            if(i > 0 && j < 19  && counts\[i\]\[j+1\] == LEI) {  
                count++;  
            }

            if(i < 19 && j > 0  && counts\[i+1\]\[j-1\] == LEI) {  
                count++;  
            }

            if(i < 19 && j > 0 && counts\[i+1\]\[j\] == LEI) {  
                count++;  
            }

            if(i < 19 && j < 19  && counts\[i+1\]\[j+1\] == LEI) {  
                count++;  
            }

            counts\[i\]\[j\] = count;  

// buttons[i][j].setText(counts[i][j]+" ");

       }  
    }  
}

private void clcl() {  
    for(int i=0;i<ROW;i++) {  
        for(int j=0;j<COL;j++) {  
            int c = counts\[i\]\[j\];  
            if(c == LEI) {  
                buttons\[i\]\[j\].setText("X");  
                buttons\[i\]\[j\].setBackground(Color.RED);  
                buttons\[i\]\[j\].setEnabled(false);  
            }else {  
                buttons\[i\]\[j\].setText(c+"");  
                buttons\[i\]\[j\].setEnabled(false);  
            }  
        }  
    }  
}

private void mailei() {  
    Random random = new Random();  
    int randRow,randCol;  
    for(int i=0;i<LEI;i++) {  
        randRow = random.nextInt(ROW);  
        randCol = random.nextInt(COL);  
        if(counts\[randRow\]\[randCol\] == LEI) {  
            i--;  
        }else {  
            counts\[randRow\]\[randCol\] = LEI;  

// buttons[randRow][randCol].setText(LEI+"");
}
}
}

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

}

以上代码纯属练习用,没有经过任何的封装,有兴趣的小伙伴可以自行封装一下哦。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章