import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class SaoLei implements ActionListener{
JFrame frame = new JFrame("邓宣的扫雷游戏");
JButton reset = new JButton("重新开始");
Container container =new Container();
//任务三游戏的数据结构
final int row = 20;
final int col = 20;
final int leicount = 30;
JButton[][] buttons = new JButton[row][col];
int[][] counts = new int[row][col];
final int LEICODE = 10;
public SaoLei(){
//任务一:显示窗口
frame.setSize(900,900);
frame.setResizable(false);//设置为不能调窗口大小
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
//任务二:添加重新开始按钮
addResetButton();
//任务四:添加格子按钮
addButton();
//任务六:埋雷
addlei();
//任务七:添加雷的计数
calcNeiboLei();
frame.setVisible(true);
}
void addResetButton(){
reset.setBackground(Color.green);
reset.setOpaque(true);
reset.addActionListener(this);
frame.add(reset,BorderLayout.NORTH);
}
void addlei(){
Random rand = new Random();
int randRow, randCol;
for(int i=0;i<leicount;i++){
randRow = rand.nextInt(row);
randCol = rand.nextInt(col);
if(counts[randRow][randCol] == LEICODE){
i--;
}else{
counts[randRow][randCol] = LEICODE;
//buttons[randRow][randCol].setText("x");
}
}
}
void addButton(){
frame.add(container,BorderLayout.CENTER);
container.setLayout(new GridLayout(row,col));
for(int i=0;i<row;i++)
for(int j=0;j<col;j++){
JButton button = new JButton();
button.setBackground(Color.yellow);
button.setOpaque(true);
button.addActionListener(this);//任务五
buttons[i][j] = button;
container.add(button);
}
}
void calcNeiboLei(){
int count;
for(int i=0;i<row;i++)
for(int j=0;j<col;j++){
count = 0;
if(counts[i][j] == LEICODE)continue;
if(i>0 && j>0 &&counts[i-1][j-1] == LEICODE)count++;
if(i>0 && counts[i-1][j] == LEICODE)count++;
if(i>0 && j<19 && counts[i-1][j+1] == LEICODE)count++;
if(j>0 && counts[i][j-1] == LEICODE)count++;
if(j<19 && counts[i][j+1] == LEICODE)count++;
if(j>0 && i<19&& counts[i+1][j-1] == LEICODE)count++;
if(i<19 && counts[i+1][j] == LEICODE)count++;
if(i<19 && j<19 &&counts[i+1][j+1] == LEICODE)count++;
counts[i][j] = count;
//buttons[i][j].setText(counts[i][j] + "");
}
}
@Override
public void actionPerformed(ActionEvent e) {
JButton button = (JButton)e.getSource();
if(button.equals(reset)){
for(int i=0;i<row;i++)
for(int j=0;j<col;j++){
buttons[i][j].setText("");
buttons[i][j].setEnabled(true);
buttons[i][j].setBackground(Color.yellow);
counts[i][j] = 0;
}
addlei();
calcNeiboLei();
}else{
int count = 0;
for(int i=0;i<row;i++)
for(int j=0;j<col;j++){
if(button.equals(buttons[i][j])){
count = counts[i][j];
if(count == LEICODE){
loseGame();
}else{
openCell(i,j);
checkWin();
}
return;
}
}
}
}
void checkWin(){
for(int i=0;i<row;i++)
for(int j=0;j<col;j++){
if(buttons[i][j].isEnabled() == true && counts[i][j] != LEICODE)return;
}
JOptionPane.showMessageDialog(frame, "你赢了");
}
void openCell(int i,int j){
if(buttons[i][j].isEnabled() == false)return;//已经打开就直接返回
buttons[i][j].setText(counts[i][j]+"");
buttons[i][j].setEnabled(false);
if(counts[i][j]==0){
if(i>0 && j>0 &&counts[i-1][j-1] != LEICODE)openCell(i-1,j-1);
if(i>0 && counts[i-1][j] != LEICODE)openCell(i-1,j);
if(i>0 && j<19 && counts[i-1][j+1] != LEICODE)openCell(i-1,j+1);
if(j>0 && counts[i][j-1] != LEICODE)openCell(i,j-1);
if(j<19 && counts[i][j+1] != LEICODE)openCell(i,j+1);
if(j>0 && i<19&& counts[i+1][j-1] != LEICODE)openCell(i+1,j-1);
if(i<19 && counts[i+1][j] != LEICODE)openCell(i+1,j);
if(i<19 && j<19 &&counts[i+1][j+1] != LEICODE)openCell(i+1,j+1);
}
}
void loseGame(){
for(int i=0;i<row;i++)
for(int j=0;j<col;j++){
int count = counts[i][j];
if(count == LEICODE){
buttons[i][j].setText("x");
buttons[i][j].setBackground(Color.red);
buttons[i][j].setEnabled(false);
}else{
buttons[i][j].setText(count+"");
buttons[i][j].setEnabled(false);
}
}
}
public static void main(String[] args) {
SaoLei lei = new SaoLei();
}
}
扫雷的Java实现
猜你喜欢
转载自blog.csdn.net/weixin_43183699/article/details/99655115
今日推荐
周排行