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); } } } </pre>
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); } }
} </pre>
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; }
} </pre>
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!