扫雷的Java实现

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();

	}
}
发布了10 篇原创文章 · 获赞 1 · 访问量 161

猜你喜欢

转载自blog.csdn.net/weixin_43183699/article/details/99655115
今日推荐