| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
jopen
9年前发布

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