今天借鉴网上写了一个扫雷游戏
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
public class SaoLei implements MouseListener,ActionListener {
JPanel p=new JPanel();
JFrame frame=new JFrame("扫雷");
@SuppressWarnings("rawtypes")
JComboBox combobox=new JComboBox();
JButton reset=new JButton("重新开始");
Container container=new Container();
SaoLeiConstant constant=new SaoLeiConstant();
JButton[][] buttons=new JButton[constant.row][constant.col];//按钮
int[][] counts=new int[constant.row][constant.col];
public SaoLei(){//构造
frame.setSize(600,700);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
addtopButton();//选择
addButtons();
addLei();//加雷
calcNeiboLei();//雷数
frame.setVisible(true);
}
void addtopButton() {
p.removeAll();
p.add(reset);
reset.setBackground(Color.green);
reset.setOpaque(true);
reset.addActionListener(this);
//combobox.addItem("选择难度");
combobox.addItem("新手难度");
combobox.addItem("初级难度");
combobox.addItem("中级难度");
combobox.addItem("高级难度");
combobox.addItem("大师难度");
combobox.setBackground(Color.GREEN);
combobox.setOpaque(true);
combobox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
String item = e.getItem().toString();
if (item == "新手难度") {
constant.leiCount = 20;
ResetGame();
} else if (item == "初级难度") {
constant.leiCount = 43;
ResetGame();
} else if (item == "中级难度") {
constant.leiCount = 63;
ResetGame();
} else if (item == "高级难度") {
constant.leiCount = 99;
ResetGame();
} else if (item == "大师难度") {
constant.leiCount = 119;
ResetGame();
}
}
});
p.add(combobox);
frame.add(p, BorderLayout.NORTH);
}
void addLei() {
Random rand = new Random();
int randRow,randCol;
for(int i=0; i<constant.leiCount; i++) {
randRow = rand.nextInt(constant.row);
randCol = rand.nextInt(constant.col);
if(counts[randRow][randCol] == constant.LEICODE) {
i--;
} else {
counts[randRow][randCol] = constant.LEICODE;
//buttons[randRow][randCol].setText("X");
}
}
}
void addButtons() {
frame.add(container,BorderLayout.CENTER);
container.setLayout(new GridLayout(constant.row,constant.col));
for(int i=0;i<constant.row;i++) {
for(int j=0;j<constant.col;j++) {
JButton button = new JButton();
button.setBackground(Color.white);
button.setOpaque(true);
button.addActionListener(this);
button.addMouseListener((MouseListener) this);
buttons[i][j] = button;
container.add(button);
}
}
}
void calcNeiboLei() {
int count;
for(int i=0;i<constant.row;i++) {
for(int j=0;j<constant.col;j++) {
count =0;
if(counts[i][j] == constant.LEICODE) continue;
if(i>0 && j>0 && counts[i-1][j-1] == constant.LEICODE) count++;
if(i>0 && counts[i-1][j] == constant.LEICODE) count++;
if(i>0 && j<19 &&counts[i-1][j+1] == constant.LEICODE) count++;
if(j>0 && counts[i][j-1] == constant.LEICODE) count++;
if(j<19 && counts[i][j+1] == constant.LEICODE) count++;
if(i<19 && j>0 && counts[i+1][j-1] == constant.LEICODE) count++;
if(i<19 && counts[i+1][j] == constant.LEICODE) count++;
if(i<19 && j<19 && counts[i+1][j+1] == constant.LEICODE) count++;
counts[i][j] = count;
buttons[i][j].setMargin(new Insets(0,0,0,0));//让按钮随按钮上的图案变化
//buttons[i][j].setText(counts[i][j] + "");
}
}
}
@Override
public void actionPerformed(ActionEvent e) {
JButton button = (JButton)e.getSource();
if(button.equals(reset)) {
ResetGame();//重新开始游戏
} else {
int count = 0;
for(int i=0;i<constant.row;i++) {
for(int j=0;j<constant.col;j++) {
if(button.equals(buttons[i][j])) {
count = counts[i][j];
if(count == constant.LEICODE) {
loseGame();
} else {
openCell(i,j);
checkWin();
}
return;
}
}
}
}
}
public void mouseClicked(MouseEvent e){
JButton button=(JButton)e.getSource();
if(e.getButton()==MouseEvent.BUTTON3){
for(int i=0;i<constant.row;i++){
for(int j=0;i<constant.col;j++){
if(button.equals(buttons[i][j])){
if(buttons[i][j].isEnabled()==true){
buttons[i][j].setMargin(new Insets(0,0,0,0));
buttons[j][j].setText("?");
return;
}
}
}
}
}
}
void ResetGame() {
for(int i=0;i<constant.row;i++) {
for(int j=0;j<constant.col;j++) {
buttons[i][j].setText("");
buttons[i][j].setEnabled(true);
buttons[i][j].setBackground(Color.white);
counts[i][j] = 0;
}
}
addLei();
calcNeiboLei();
}
void checkWin() {
for(int i=0;i<constant.row;i++) {
for(int j=0;j<constant.col;j++) {
if(buttons[i][j].isEnabled() == true && counts[i][j] != constant.LEICODE ) return;
}
}
JOptionPane.showMessageDialog(frame,"Yeah,你赢了!");
}
//使用递归方法打开格子
void openCell(int i, int j) {
if(buttons[i][j].isEnabled() == false) return;
buttons[i][j].setBackground(Color.yellow);
buttons[i][j].setOpaque(true);
buttons[i][j].setEnabled(false);
if(counts[i][j] == 0) {
if(i>0 && j>0 && counts[i-1][j-1] != constant.LEICODE) openCell(i-1,j-1);
if(i>0 && j<19 && counts[i-1][j] != constant.LEICODE) openCell(i-1,j);
if(i>0 && j<19 &&counts[i-1][j+1] != constant.LEICODE) openCell(i-1,j+1);
if(j>0 && counts[i][j-1] != constant.LEICODE) openCell(i,j-1);
if(j<19 && counts[i][j+1] != constant.LEICODE) openCell(i,j+1);
if(i<19 && j>0 && counts[i+1][j-1] != constant.LEICODE) openCell(i+1,j-1);
if(i<19 && counts[i+1][j] != constant.LEICODE) openCell(i+1,j);
if(i<19 && j<19 && counts[i+1][j+1] != constant.LEICODE) openCell(i+1,j+1);
} else {
buttons[i][j].setMargin(new Insets(0,0,0,0));
buttons[i][j].setText(counts[i][j] + "");
}
}
void loseGame() {
for(int i=0;i<constant.row;i++) {
for(int j=0;j<constant.col;j++) {
int count = counts[i][j];
if(count == constant.LEICODE) {
buttons[i][j].setMargin(new Insets(0,0,0,0));
buttons[i][j].setText("雷");
buttons[i][j].setBackground(Color.red);
buttons[i][j].setEnabled(false);
} else {
buttons[i][j].setMargin(new Insets(0,0,0,0));
buttons[i][j].setText(count + "");
buttons[i][j].setEnabled(false);
}
}
}
JOptionPane.showMessageDialog(frame,"error,你输了!");
}
public static void main(String[] args) {
new SaoLei();
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
}
初始数据定义
public class SaoLeiConstant {
final int row=20;//行数
final int col=20;//列数
final int LEICODE=10;//定义雷下放的数字
protected int temp=20;
protected int leiCount=temp;//雷数量
}
浙公网安备 33010602011771号