java扫雷游戏代码详解编程语言

CleanMine.java

    import java.awt.BorderLayout;   
    import java.awt.Dimension;   
    import java.awt.event.ActionEvent;   
    import java.awt.event.ActionListener;   
       
    import javax.swing.ButtonGroup;   
    import javax.swing.JButton;   
    import javax.swing.JFrame;   
    import javax.swing.JLabel;   
    import javax.swing.JMenu;   
    import javax.swing.JMenuBar;   
    import javax.swing.JMenuItem;   
    import javax.swing.JOptionPane;   
    import javax.swing.JPanel;   
    import javax.swing.JRadioButtonMenuItem;   
       
    public class CleanMine extends JFrame implements ActionListener{   
        public static int result,showNumb;//result表示标记是雷的个数,而showNumb表示点开的个数   
        private boolean isFirst = true;//设置必须点击新游戏才能开始游戏   
        private JLabel jlbtime,jlbremain;   
        public static JLabel time;//时间   
        public static JLabel remainMine;//剩余雷的个数   
        private JButton start;   
        private JPanel jpane;   
        public static int row,col,mineNumber;//雷的排列,行和列,以及雷的总个数   
        private Dimension dim;   
        private JRadioButtonMenuItem[] difficult;//菜单项   
           
        public CleanMine(){   
            super("扫雷");   
            dim=this.getToolkit().getScreenSize();//获取屏幕分辨率   
            this.setLocation(dim.width*2/5, dim.height/3);//设置位置,根据难易程度做出人性化变动   
            this.setDefaultCloseOperation(EXIT_ON_CLOSE);   
            addMenu();   
            jlbremain=new JLabel("剩余地雷:");   
            time=new JLabel("10");   
            remainMine=new JLabel("0");   
            jlbtime=new JLabel("耗时:");   
            start=new JButton("新游戏");   
            start.setActionCommand("new");   
            start.addActionListener(this);   
            JPanel p=new JPanel();   
            p.add(jlbremain);p.add(remainMine);p.add(start);p.add(jlbtime);p.add(time);   
            this.add(p,BorderLayout.NORTH);   
            this.row=9;this.col=9;this.mineNumber=10;   
            restart();   
        }   
           
        private void restart() {   
            if(jpane!=null){   
                this.remove(jpane);   
            }   
            jpane=new MinePanel(row,col,mineNumber,isFirst);   
            this.add(jpane,BorderLayout.CENTER);   
            this.remainMine.setText(mineNumber+"");   
            this.time.setText("0");   
            this.setSize(col*30, row*30+10);   
            this.setResizable(false);   
               
            this.setVisible(true);   
        }   
       
        public void addMenu(){   
            JMenuBar jbar=new JMenuBar();   
            this.setJMenuBar(jbar);   
            JMenu game = new JMenu("游戏");   
            JMenu help = new JMenu("帮助");   
            JMenuItem jitemexit=new JMenuItem("退出");   
            jitemexit.setActionCommand("exit");   
            ButtonGroup bgp=new ButtonGroup();   
               
            String[] difficults={"复杂","中等","简单"};   
            difficult=new JRadioButtonMenuItem[difficults.length];   
            for(int i=difficults.length-1;i>=0;i--){   
                difficult[i]=new JRadioButtonMenuItem(difficults[i],true);   
                difficult[i].addActionListener(this);   
                bgp.add(difficult[i]);   
                game.add(difficult[i]);   
            }   
            game.addSeparator();jitemexit.addActionListener(this);game.add(jitemexit);   
            jbar.add(game);   
            JMenuItem jitemview=new JMenuItem("关于扫雷");   
            jitemview.setActionCommand("view");   
            jitemview.addActionListener(this);   
            help.add(jitemview);   
            jbar.add(help);   
        }   
           
        public static void main(String[] args){   
            new CleanMine();   
        }   
           
        public void actionPerformed(ActionEvent e) {   
            if(e.getActionCommand().equalsIgnoreCase("new")){   
                this.result=0;   
                this.showNumb=0;   
                this.isFirst=false;   
                restart();   
                return ;   
            }   
            if(e.getActionCommand().equals("简单")){   
                this.row=9;this.col=9;this.mineNumber=10;   
                this.setLocation(dim.width*2/5, dim.height/3);   
                restart();   
                return ;   
            }   
            if(e.getActionCommand().equals("中等")){   
                this.row=16;this.col=16;this.mineNumber=40;   
                this.setLocation(dim.width*2/5, dim.height/5);   
                restart();   
                return ;   
            }   
            if(e.getActionCommand().equals("复杂")){   
                this.row=16;this.col=30;this.mineNumber=99;   
                this.setLocation(dim.width/7, dim.height/7);   
                restart();   
                return ;   
            }   
            if(e.getActionCommand().equalsIgnoreCase("exit")){   
                System.exit(0);   
            }   
            if(e.getActionCommand().equalsIgnoreCase("view")){   
                JOptionPane.showMessageDialog(this,"扫雷的规则:/n/t尽快找到雷区中的所有不是地雷的格子,而不许踩到地雷。" +   
                        "点开的数字是几,/n则说明该数字旁边的8个位置中有几个雷,如果挖开的是地雷,则会输掉游戏。");   
            }   
        }   
       
    }   
 
 
MinePanel.java 
 
[java] view plaincopyprint? 
 
    package xjj;   
       
    import java.awt.Color;   
    import java.awt.GridLayout;   
    import java.awt.event.ActionEvent;   
    import java.awt.event.ActionListener;   
    import java.awt.event.MouseAdapter;   
    import java.awt.event.MouseEvent;   
       
    import javax.swing.JButton;   
    import javax.swing.JOptionPane;   
    import javax.swing.JPanel;   
       
    public class MinePanel extends JPanel implements ActionListener{   
        private boolean isFirst;   
        private int row,col,mineNumber;   
        private JButton[][] mine;   
        private int[][] mark;   
        Thread t;   
       
        public MinePanel(int row,int col,int mineNumber,boolean isFirst){   
            this.isFirst=isFirst;   
            this.row=row;   
            this.col=col;   
            this.mineNumber=mineNumber;   
            mine=new JButton[this.row][this.col];   
            mark=new int[this.row][this.col];   
            this.setLayout(new GridLayout(row,col));   
            createMine();   
            createButtons();   
            if(isFirst){   
                firstinist();   
            }else{   
                init();//初始化   
            }   
        }   
        private void firstinist(){   
            for(int i=0;i<mine.length;i++){   
                for(int j=0;j<mine[i].length;j++){   
                    mine[i][j]=new JButton();   
                    this.add(mine[i][j]);   
                }   
            }   
        }   
        private void init() {   
            this.setLayout(new GridLayout(row,col));   
            for(int i=0;i<mine.length;i++){   
                for(int j=0;j<mine[i].length;j++){   
                    this.add(mine[i][j]);   
                }   
            }   
               
        }   
       
        private void createButtons() {   
            for(int i=0;i<mine.length;i++){   
                for(int j=0;j<mine[i].length;j++){   
                    mine[i][j]=new MineButton(i,j);   
                    mine[i][j].setSize(6, 6);   
                    mine[i][j].addActionListener(this);   
                    mine[i][j].addMouseListener(   
                            new MouseAdapter(){   
                                public void mouseClicked(MouseEvent e){   
                                    if(e.getButton()==MouseEvent.BUTTON3){   
                                        int remain=Integer.parseInt(CleanMine.remainMine.getText());   
                                        JButton b=(JButton)e.getSource();   
                                        if(b.getText().equals("")&&remain>0){   
                                            CleanMine.result++;//System.out.println(CleanMine.showNumb+" "+CleanMine.result);   
                                            if(CleanMine.result==CleanMine.row*CleanMine.col-CleanMine.showNumb){   
                                                JOptionPane.showMessageDialog(b, "congratulations ! xjj万岁 !");   
                                            }   
                                            remain--;   
                                            CleanMine.remainMine.setText(remain+"");   
                                            b.setText("$");   
                                        }else if(b.getText().equals("$")){   
                                            CleanMine.result--;System.out.println(CleanMine.showNumb);   
                                            remain++;   
                                            CleanMine.remainMine.setText(remain+"");   
                                            b.setText("");   
                                        }   
                                    }   
                                }   
                            }   
                                                 );   
                }   
            }   
               
        }   
       
        private void createMine() {   
            int n=0;   
            while(n<mineNumber){//随机生成规定个数的雷的位置   
                int i=(int)(Math.random()*row);   
                int j=(int)(Math.random()*col);   
                if(mark[i][j]!=-1){   
                    mark[i][j]=-1;   
                    n++;   
                }   
            }   
            for(int i=0;i<mark.length;i++){//对地图做标记   
                for(int j=0;j<mark[i].length;j++){   
                    if(mark[i][j]!=-1){   
                        mark[i][j]=getSurroundMineNumber(mark,i,j);   
                    }   
                }   
            }   
        }   
       
        private int getSurroundMineNumber(int[][] mark2, int n, int m) {   
            int numb=0;   
            int[] direct={0,1,-1};   
            int x,y;   
            for(int i=0;i<direct.length;i++){   
                for(int j=0;j<direct.length;j++){   
                    if(i==0&&j==0){   
                        continue;   
                    }   
                    x=n+direct[i];   
                    y=m+direct[j];   
                    if(x>=0 && x<mark2.length && y>=0 &&  y<mark2[0].length){//对周围八个方向进行遍历   
                        numb+=(mark2[x][y]==-1? 1:0);   
                    }   
                }   
            }   
            return numb;   
        }   
       
        public void actionPerformed(ActionEvent e) {   
            MineButton b=(MineButton)e.getSource();   
            int r=b.getRow();   
            int c=b.getCol();   
            if(mark[r][c]==-1){//踩到雷,将地图所有都显示出来   
                //String str=CleanMine.time.getText();   
                //isFirst=true;   
                CleanMine.time.setText("0");   
                for(int i=0;i<mark.length;i++){   
                    for(int j=0;j<mark[i].length;j++){   
                        if(mark[i][j]==-1){   
                            mine[i][j].setText("@");   
                        }else if(mark[i][j]==0){   
                            mine[i][j].setText("");   
                            mine[i][j].setBackground(Color.green);   
                        }else{   
                            mine[i][j].setText(mark[i][j]+"");   
                            mine[i][j].setBackground(Color.green);   
                        }   
                    }   
                }   
                JOptionPane.showMessageDialog(this, "叫你扫雷,不是踩雷,游戏结束 !");   
            }else{   
                showEmpty(mark,r,c);   
            }   
        }   
       
        private void showEmpty(int[][] mark2, int r, int c) {   
            MineButton b=(MineButton)mine[r][c];   
            if(b.isCleared()){   
                return ;   
            }CleanMine.showNumb++;//System.out.println(CleanMine.showNumb);   
            if(CleanMine.result==CleanMine.row*CleanMine.col-CleanMine.showNumb){   
                JOptionPane.showMessageDialog(this,"congratulations ! xjj万岁 !");   
            }   
            int x,y;   
            int[] direct={0,1,-1};   
            if(mark[r][c]==0){//若是空的  将其显示出来,并继续遍历   
                b.setBackground(Color.green);   
                b.setCleared(true);   
                for(int i=0;i<direct.length;i++){   
                    for(int j=0;j<direct.length;j++){   
                        if(i==0&&j==0){   
                            continue;   
                        }   
                        if(b.getText().equals("$")){   
                            continue;   
                        }   
                        x=r+direct[i];   
                        y=c+direct[j];   
                        if(x>=0 && x<mark2.length && y>=0 &&  y<mark2[0].length){   
                            //CleanMine.showNumb++;   
                            showEmpty(mark2,x,y);   
                        }   
                    }   
                }   
            }else{   
                if(b.getText().equals("$")){//若被标记是雷,则不显示   
                    return ;   
                }   
                b.setText(mark[r][c]+"");//若是数字,则将数字显示出来   
                b.setBackground(Color.green);   
                b.setCleared(true);   
            }   
        }   
           
    }  

MinePanel.java

import java.awt.Color;   
import java.awt.GridLayout;   
import java.awt.event.ActionEvent;   
import java.awt.event.ActionListener;   
import java.awt.event.MouseAdapter;   
import java.awt.event.MouseEvent;   
   
import javax.swing.JButton;   
import javax.swing.JOptionPane;   
import javax.swing.JPanel;   
   
public class MinePanel extends JPanel implements ActionListener{   
    private boolean isFirst;   
    private int row,col,mineNumber;   
    private JButton[][] mine;   
    private int[][] mark;   
    Thread t;   
   
    public MinePanel(int row,int col,int mineNumber,boolean isFirst){   
        this.isFirst=isFirst;   
        this.row=row;   
        this.col=col;   
        this.mineNumber=mineNumber;   
        mine=new JButton[this.row][this.col];   
        mark=new int[this.row][this.col];   
        this.setLayout(new GridLayout(row,col));   
        createMine();   
        createButtons();   
        if(isFirst){   
            firstinist();   
        }else{   
            init();//初始化   
        }   
    }   
    private void firstinist(){   
        for(int i=0;i<mine.length;i++){   
            for(int j=0;j<mine[i].length;j++){   
                mine[i][j]=new JButton();   
                this.add(mine[i][j]);   
            }   
        }   
    }   
    private void init() {   
        this.setLayout(new GridLayout(row,col));   
        for(int i=0;i<mine.length;i++){   
            for(int j=0;j<mine[i].length;j++){   
                this.add(mine[i][j]);   
            }   
        }   
           
    }   
   
    private void createButtons() {   
        for(int i=0;i<mine.length;i++){   
            for(int j=0;j<mine[i].length;j++){   
                mine[i][j]=new MineButton(i,j);   
                mine[i][j].setSize(6, 6);   
                mine[i][j].addActionListener(this);   
                mine[i][j].addMouseListener(   
                        new MouseAdapter(){   
                            public void mouseClicked(MouseEvent e){   
                                if(e.getButton()==MouseEvent.BUTTON3){   
                                    int remain=Integer.parseInt(CleanMine.remainMine.getText());   
                                    JButton b=(JButton)e.getSource();   
                                    if(b.getText().equals("")&&remain>0){   
                                        CleanMine.result++;//System.out.println(CleanMine.showNumb+" "+CleanMine.result);   
                                        if(CleanMine.result==CleanMine.row*CleanMine.col-CleanMine.showNumb){   
                                            JOptionPane.showMessageDialog(b, "congratulations ! xjj万岁 !");   
                                        }   
                                        remain--;   
                                        CleanMine.remainMine.setText(remain+"");   
                                        b.setText("$");   
                                    }else if(b.getText().equals("$")){   
                                        CleanMine.result--;System.out.println(CleanMine.showNumb);   
                                        remain++;   
                                        CleanMine.remainMine.setText(remain+"");   
                                        b.setText("");   
                                    }   
                                }   
                            }   
                        }   
                                             );   
            }   
        }   
           
    }   
   
    private void createMine() {   
        int n=0;   
        while(n<mineNumber){//随机生成规定个数的雷的位置   
            int i=(int)(Math.random()*row);   
            int j=(int)(Math.random()*col);   
            if(mark[i][j]!=-1){   
                mark[i][j]=-1;   
                n++;   
            }   
        }   
        for(int i=0;i<mark.length;i++){//对地图做标记   
            for(int j=0;j<mark[i].length;j++){   
                if(mark[i][j]!=-1){   
                    mark[i][j]=getSurroundMineNumber(mark,i,j);   
                }   
            }   
        }   
    }   
   
    private int getSurroundMineNumber(int[][] mark2, int n, int m) {   
        int numb=0;   
        int[] direct={0,1,-1};   
        int x,y;   
        for(int i=0;i<direct.length;i++){   
            for(int j=0;j<direct.length;j++){   
                if(i==0&&j==0){   
                    continue;   
                }   
                x=n+direct[i];   
                y=m+direct[j];   
                if(x>=0 && x<mark2.length && y>=0 &&  y<mark2[0].length){//对周围八个方向进行遍历   
                    numb+=(mark2[x][y]==-1? 1:0);   
                }   
            }   
        }   
        return numb;   
    }   
   
    public void actionPerformed(ActionEvent e) {   
        MineButton b=(MineButton)e.getSource();   
        int r=b.getRow();   
        int c=b.getCol();   
        if(mark[r][c]==-1){//踩到雷,将地图所有都显示出来   
            //String str=CleanMine.time.getText();   
            //isFirst=true;   
            CleanMine.time.setText("0");   
            for(int i=0;i<mark.length;i++){   
                for(int j=0;j<mark[i].length;j++){   
                    if(mark[i][j]==-1){   
                        mine[i][j].setText("@");   
                    }else if(mark[i][j]==0){   
                        mine[i][j].setText("");   
                        mine[i][j].setBackground(Color.green);   
                    }else{   
                        mine[i][j].setText(mark[i][j]+"");   
                        mine[i][j].setBackground(Color.green);   
                    }   
                }   
            }   
            JOptionPane.showMessageDialog(this, "叫你扫雷,不是踩雷,游戏结束 !");   
        }else{   
            showEmpty(mark,r,c);   
        }   
    }   
   
    private void showEmpty(int[][] mark2, int r, int c) {   
        MineButton b=(MineButton)mine[r][c];   
        if(b.isCleared()){   
            return ;   
        }CleanMine.showNumb++;//System.out.println(CleanMine.showNumb);   
        if(CleanMine.result==CleanMine.row*CleanMine.col-CleanMine.showNumb){   
            JOptionPane.showMessageDialog(this,"congratulations ! xjj万岁 !");   
        }   
        int x,y;   
        int[] direct={0,1,-1};   
        if(mark[r][c]==0){//若是空的  将其显示出来,并继续遍历   
            b.setBackground(Color.green);   
            b.setCleared(true);   
            for(int i=0;i<direct.length;i++){   
                for(int j=0;j<direct.length;j++){   
                    if(i==0&&j==0){   
                        continue;   
                    }   
                    if(b.getText().equals("$")){   
                        continue;   
                    }   
                    x=r+direct[i];   
                    y=c+direct[j];   
                    if(x>=0 && x<mark2.length && y>=0 &&  y<mark2[0].length){   
                        //CleanMine.showNumb++;   
                        showEmpty(mark2,x,y);   
                    }   
                }   
            }   
        }else{   
            if(b.getText().equals("$")){//若被标记是雷,则不显示   
                return ;   
            }   
            b.setText(mark[r][c]+"");//若是数字,则将数字显示出来   
            b.setBackground(Color.green);   
            b.setCleared(true);   
        }   
    }   
       
}  

MineButton.java

import java.awt.Insets;   
   
import javax.swing.JButton;   
   
public class MineButton extends JButton {   
    private int row,col;   
    private boolean cleared=false;   
    public MineButton(int row, int col) {   
        this.row=row;   
        this.col=col;   
        this.setMargin(new Insets(0,0,0,0));   
    }   
   
    public int getCol() {   
        return col;   
    }   
       
    public int getRow() {   
        return row;   
    }   
       
    public boolean isCleared() {   
        return cleared;   
    }   
       
    public void setCleared(boolean cleared) {   
        this.cleared = cleared;   
    }   
   
   
}  

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/10178.html

(0)
上一篇 2021年7月19日 10:01
下一篇 2021年7月19日 10:01

相关推荐

发表回复

登录后才能评论