Java版的扫雷游戏源码

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();
    }
    
}

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

posted @ 2019-07-25 10:12  坐看云起时_雨宣  阅读(2494)  评论(0编辑  收藏  举报