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日