首页>代码>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);
		}	
	}
}

最近下载更多
sunxiaoyan  LV1 6月19日
张德志  LV9 2023年12月27日
刘地带  LV11 2023年5月26日
luo110012  LV9 2023年5月16日
18973881965  LV1 2023年2月23日
微信网友_6194851142488064  LV1 2022年10月28日
zhkai163  LV5 2022年10月27日
rodert  LV14 2022年8月6日
java代写  LV7 2022年6月4日
liangge2115  LV27 2022年5月30日
最近浏览更多
17360557751 7月20日
暂无贡献等级
azzzz1  LV2 6月26日
sunxiaoyan  LV1 6月19日
张德志  LV9 2023年12月27日
lshlsh 2023年12月25日
暂无贡献等级
COD824  LV1 2023年11月29日
koichenchen  LV1 2023年11月3日
吉萨VUK 2023年11月1日
暂无贡献等级
矿泉水  LV30 2023年8月11日
hougui  LV1 2023年6月20日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友