首页>分享>java Swing编写扫雷游戏>/cleanMine/src/cleanMine/AllButtonPanel.java
package cleanMine;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/**
 * 显示所有按钮的面板
 * @author Administrator
 *
 */
public class AllButtonPanel extends JPanel implements ActionListener{
	private int row;//行数
	private int col;//列数
	private int mineCount;//地雷数
	private MineButton[][] allButtons;//所有按钮

	
	public AllButtonPanel(int row,int col,int mineCount){
		this.row=row;
		this.col=col;
		this.mineCount=mineCount;
		allButtons=new MineButton[row][col];
		createButtons();
		
		createMine();
		init();
	}
	
	private void init(){
		this.setLayout(new GridLayout(row,col));
		for(int i=0;i<allButtons.length;i++){
			for(int j=0;j<allButtons[i].length;j++){
				this.add(allButtons[i][j]);
			}
		}
	}
	
	/**
	 * 随机布雷的方法
	 *
	 */
	private void createMine(){
		int n=0;
		while(n<mineCount){//随机生成mineCount个地雷
			int i=(int)(Math.random()*row);
			int j=(int)(Math.random()*col);
			if(allButtons[i][j].getCountOfSurroundMines()!=-1){
				allButtons[i][j].setCountOfSurroundMines(-1);
				n++;
			}
		}
		
		for(int i=0;i<allButtons.length;i++){//计算每个位置的周围地雷数
			for(int j=0;j<allButtons[i].length;j++){
				if(allButtons[i][j].getCountOfSurroundMines()!=-1){
					allButtons[i][j].setCountOfSurroundMines(getSurroundMineCount(i,j));
				}
			}
		}
	}
	
	
	/**
	 * 统计(i,j)坐标周围8个位置的地雷数
	 * @param data
	 * @param i
	 * @param j
	 * @return
	 */
	private int getSurroundMineCount(int i,int j){
		int num=0;//统计周围的雷数
		if(i-1>=0&&j-1>=0){
			num+=(allButtons[i-1][j-1].getCountOfSurroundMines()==-1?1:0);
		}
		if(i-1>=0){
			num+=(allButtons[i-1][j].getCountOfSurroundMines()==-1?1:0);
		}
		if(i-1>=0&&j+1<allButtons[0].length){
			num+=(allButtons[i-1][j+1].getCountOfSurroundMines()==-1?1:0);
		}
		if(j-1>=0){
			num+=(allButtons[i][j-1].getCountOfSurroundMines()==-1?1:0);
		}
		if(j+1<allButtons[0].length){
			num+=(allButtons[i][j+1].getCountOfSurroundMines()==-1?1:0);
		}
		if(i+1<allButtons.length&&j-1>=0){
			num+=(allButtons[i+1][j-1].getCountOfSurroundMines()==-1?1:0);
		}
		if(i+1<allButtons.length){
			num+=(allButtons[i+1][j].getCountOfSurroundMines()==-1?1:0);
		}
		if(i+1<allButtons.length&&j+1<allButtons[0].length){
			num+=(allButtons[i+1][j+1].getCountOfSurroundMines()==-1?1:0);
		}
		return num;	
	}
	
	
	/**
	 * 生成按钮
	 *
	 */
	private void createButtons(){
		for(int i=0;i<allButtons.length;i++){
			for(int j=0;j<allButtons[i].length;j++){
				allButtons[i][j]=new MineButton(i,j);
				allButtons[i][j].setSize(6,6);
				allButtons[i][j].addActionListener(this);//添加点击事件监听
				allButtons[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--;
								CleanMine.remainMine.setText(remain+"");
								b.setText("&");
							}else if(b.getText().equals("&")){
								remain++;
								CleanMine.remainMine.setText(remain+"");
								b.setText("");
							}
						}
					}
				});
			}
		}
	}

	
	public void actionPerformed(ActionEvent e) {//点击事件监听的方法
		MineButton b=(MineButton)e.getSource();
		int r=b.getRow();
		int c=b.getCol();
		if(allButtons[r][c].getCountOfSurroundMines()==-1){//如果是地雷
			for(int i=0;i<allButtons.length;i++){//把所有按钮都显示出来
				for(int j=0;j<allButtons[i].length;j++){
					if(allButtons[i][j].getCountOfSurroundMines()==-1){//如果该位置是地雷
						allButtons[i][j].setText("$");
					}else if(allButtons[i][j].getCountOfSurroundMines()==0){//如果该位置为空(该位置不是地雷,周围8个位置也没有地雷)
						allButtons[i][j].setText("");
						allButtons[i][j].setBackground(Color.CYAN);
					}else{//如果该位置不是地雷,但周围8个位置中有地雷
						allButtons[i][j].setText(allButtons[i][j].getCountOfSurroundMines()+"");
						allButtons[i][j].setBackground(Color.CYAN);
					}
				}
			}
		}else{//如果不是地雷
			showEmpty(r,c);//执行排空操作
		}
	}
	
	/**
	 * 排空方法,若(i,j)位置为空,则显示空白。然后依次递归找它周围的8个位置。
	 * @param data
	 * @param i
	 * @param j
	 */
	private void showEmpty(int i,int j){
		MineButton b=allButtons[i][j];
		if(b.isCleared()){
			return;
		}
		if(allButtons[i][j].getCountOfSurroundMines()==0){
			b.setBackground(Color.CYAN);
			b.setCleared(true);
			if(i-1>=0&&j-1>=0){
				showEmpty(i-1,j-1);
			}
			if(i-1>=0){
				showEmpty(i-1,j);
			}
			if(i-1>=0&&j+1<allButtons[0].length){
				showEmpty(i-1,j+1);
			}
			if(j-1>=0){
				showEmpty(i,j-1);
			}
			if(j+1<allButtons[0].length){
				showEmpty(i,j+1);
			}
			if(i+1<allButtons.length&&j-1>=0){
				showEmpty(i+1,j-1);
			}
			if(i+1<allButtons.length){
				showEmpty(i+1,j);
			}
			if(i+1<allButtons.length&&j+1<allButtons[0].length){
				showEmpty(i+1,j+1);
			}
		}else if(allButtons[i][j].getCountOfSurroundMines()>0){
			b.setText(allButtons[i][j].getCountOfSurroundMines()+"");
			b.setBackground(Color.CYAN);
			b.setCleared(true);
		}	
	}
}

最近下载更多
wxyfw111 LV26月26日
星星星星
chuanlx LV16月23日
星星
scycaq LV16月21日
星星
298233089 LV16月21日
星星
Bubblyings LV16月10日
星星
无贼的天下一 LV24月28日
星星星星
我只是路过的 LV23月31日
星星星星
wei1101025 LV142月18日
月亮月亮月亮星星星星
江旭jdiahdsad LV141月11日
月亮月亮月亮星星星星
tanexus LV21月10日
星星星星
最近浏览更多
sly960922 LV1前天
星星
25877065837月15日
暂无贡献等级
杨佳琦 LV27月8日
星星星星
柒的猫 LV27月5日
星星星星
悟空阳 LV26月29日
星星星星
chocobo6月26日
暂无贡献等级
wxyfw111 LV26月26日
星星星星
572050598 LV26月26日
星星星星
weinixiao LV86月25日
月亮月亮
chuanlx LV16月24日
星星
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友