package saolei;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class AllButtonPanel extends JPanel implements ActionListener{
private int row;//行数
private int col;//列数
private int mineCount;//地雷数
private JButton[][] allButtons;//所有按钮
private int[][] allButtonsMark;//所有按钮的标记
public AllButtonPanel(int row,int col,int mineCount){
this.row=row;
this.col=col;
this.mineCount=mineCount;
allButtons=new JButton[row][col];
allButtonsMark=new int[row][col];
createMine();
createButtons();
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(allButtonsMark[i][j]!=-1){
allButtonsMark[i][j]=-1;
n++;
}
}
for(int i=0;i<allButtonsMark.length;i++){//计算每个位置的周围地雷数
for(int j=0;j<allButtonsMark[i].length;j++){
if(allButtonsMark[i][j]!=-1){
allButtonsMark[i][j]=getSurroundMineCount(allButtonsMark,i,j);
}
}
}
}
private int getSurroundMineCount(int[][] data,int i,int j){
int num=0;//统计周围的雷数
if(i-1>=0&&j-1>=0){
num+=(data[i-1][j-1]==-1?1:0);
}
if(i-1>=0){
num+=(data[i-1][j]==-1?1:0);
}
if(i-1>=0&&j+1<data[0].length){
num+=(data[i-1][j+1]==-1?1:0);
}
if(j-1>=0){
num+=(data[i][j-1]==-1?1:0);
}
if(j+1<data[0].length){
num+=(data[i][j+1]==-1?1:0);
}
if(i+1<data.length&&j-1>=0){
num+=(data[i+1][j-1]==-1?1:0);
}
if(i+1<data.length){
num+=(data[i+1][j]==-1?1:0);
}
if(i+1<data.length&&j+1<data[0].length){
num+=(data[i+1][j+1]==-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(allButtonsMark[r][c]==-1){//如果是地雷
for(int i=0;i<allButtons.length;i++){
for(int j=0;j<allButtons[i].length;j++){
if(allButtonsMark[i][j]==-1){
allButtons[i][j].setText("★");
allButtons[i][j].setBackground(Color.PINK);
}else if(allButtonsMark[i][j]==0){
allButtons[i][j].setText("");
allButtons[i][j].setBackground(Color.PINK);
}else{
allButtons[i][j].setText(allButtonsMark[i][j]+"");
allButtons[i][j].setBackground(Color.PINK);
}
}
}
}else{//如果不是雷
showEmpty(allButtonsMark,r,c);
}
}
private void showEmpty(int[][] data,int i,int j){
MineButton b=(MineButton)allButtons[i][j];
//是否被清
if(b.isCleared()){
return;
}
if(allButtonsMark[i][j]==0){
b.setBackground(Color.PINK);
b.setCleared(true);
if(i-1>=0&&j-1>=0){
showEmpty(data,i-1,j-1);
}
if(i-1>=0){
showEmpty(data,i-1,j);
}
if(i-1>=0&&j+1<data[0].length){
showEmpty(data,i-1,j+1);
}
if(j-1>=0){
showEmpty(data,i,j-1);
}
if(j+1<data[0].length){
showEmpty(data,i,j+1);
}
if(i+1<data.length&&j-1>=0){
showEmpty(data,i+1,j-1);
}
if(i+1<data.length){
showEmpty(data,i+1,j);
}
if(i+1<data.length&&j+1<data[0].length){
showEmpty(data,i+1,j+1);
}
}else if(allButtonsMark[i][j]>0){
b.setText(allButtonsMark[i][j]+"");
b.setBackground(Color.PINK);
b.setCleared(true);
}
}
}