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); } } }
最近下载更多
张德志 LV6
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日
flygrass LV12
2022年4月8日