import java.awt.event.*
import javax.swing.*
public class Frame
extends JFrame {
JTextField text
JLabel nowBomb, setBomb
int BombNum, BlockNum// 当前雷数,当前方块数
int rightBomb, restBomb, restBlock// 找到的地雷数,剩余雷数,剩余方块数
JButton start = new JButton(" 开始 ")
JPanel MenuPamel = new JPanel()
JPanel bombPanel = new JPanel()
Bomb[][] bombButton
JPanel c
BorderLayout borderLayout1 = new BorderLayout()
GridLayout gridLayout1 = new GridLayout()
public Frame() {
try {
setDefaultCloseOperation(EXIT_ON_CLOSE)
jbInit()
}
catch (Exception exception) {
exception.printStackTrace()
}
}
private void jbInit() throws Exception {
c = (JPanel) getContentPane()
setTitle("扫雷")
c.setBackground(Color.WHITE)
MenuPamel.setBackground(Color.GRAY)
c.setLayout(borderLayout1)
setSize(new Dimension(600, 600))
setResizable(false)
BlockNum = 144
BombNum = 10
text = new JTextField("10 ", 3)
nowBomb = new JLabel("当前雷数" + ":" + BombNum)
setBomb = new JLabel("设置地雷数")
start.addActionListener(new Frame1_start_actionAdapter(this))
MenuPamel.add(setBomb)
MenuPamel.add(text)
MenuPamel.add(start)
MenuPamel.add(nowBomb)
c.add(MenuPamel, java.awt.BorderLayout.SOUTH)
bombPanel.setLayout(gridLayout1)
gridLayout1.setColumns( (int) Math.sqrt(BlockNum))
gridLayout1.setRows( (int) Math.sqrt(BlockNum))
bombButton = new Bomb[ (int) Math.sqrt(BlockNum)][ (int) Math.sqrt(BlockNum)]
for (int i = 0i <(int) Math.sqrt(BlockNum)i++) {
for (int j = 0j <(int) Math.sqrt(BlockNum)j++) {
bombButton[i][j] = new Bomb(i, j)
//bombButton[i][j].setSize(10, 10)
bombButton[i][j].setFont(new Font("", Font.PLAIN, 14))//设置字体大小
bombButton[i][j].setForeground(Color.white)
bombButton[i][j].addMouseListener(new Bomb_mouseAdapter(this))
bombButton[i][j].addActionListener(new Bomb_actionAdapter(this))
bombPanel.add(bombButton[i][j])
}
}
c.add(bombPanel, java.awt.BorderLayout.CENTER)
startBomb()
}
/* 开始按钮 */
public void start_actionPerformed(ActionEvent e) {
int num=Integer.parseInt(text.getText().trim())
if (num >= 5 &&num <50) {
BombNum = num
startBomb()
}
else if (num <5) {
JOptionPane.showMessageDialog(null, "您设置的地雷数太少了,请重设!", "错误",
JOptionPane.ERROR_MESSAGE)
num=10
BombNum = num
}
else {
JOptionPane.showMessageDialog(null, "您设置的地雷数太多了,请重设!", "错误",
JOptionPane.ERROR_MESSAGE)
num=10
BombNum = num
}
}
/* 开始,布雷 */
public void startBomb() {
nowBomb.setText("当前雷数" + ":" + BombNum)
for (int i = 0i <(int) Math.sqrt(BlockNum)i++) {
for (int j = 0j <(int) Math.sqrt(BlockNum)j++) {
bombButton[i][j].isBomb = false
bombButton[i][j].isClicked = false
bombButton[i][j].isRight = false
bombButton[i][j].BombFlag = 0
bombButton[i][j].BombRoundCount = 9
bombButton[i][j].setEnabled(true)
bombButton[i][j].setText("")
bombButton[i][j].setFont(new Font("", Font.PLAIN, 14))//设置字体大小
bombButton[i][j].setForeground(Color.BLUE)
rightBomb = 0
restBomb = BombNum
restBlock = BlockNum - BombNum
}
}
for (int i = 0i <BombNum) {
int x = (int) (Math.random() * (int) (Math.sqrt(BlockNum) - 1))
int y = (int) (Math.random() * (int) (Math.sqrt(BlockNum) - 1))
if (bombButton[x][y].isBomb != true) {
bombButton[x][y].isBomb = true
i++
}
}
CountRoundBomb()
}
/* 计算方块周围雷数 */
public void CountRoundBomb() {
for (int i = 0i <(int) Math.sqrt(BlockNum)i++) {
for (int j = 0j <(int) Math.sqrt(BlockNum)j++) {
int count = 0
// 当需要检测的单元格本身无地雷的情况下,统计周围的地雷个数
if (bombButton[i][j].isBomb != true) {
for (int x = i - 1x <i + 2x++) {
for (int y = j - 1y <j + 2y++) {
if ( (x >= 0) &&(y >= 0)
&&(x <( (int) Math.sqrt(BlockNum)))
&&(y <( (int) Math.sqrt(BlockNum)))) {
if (bombButton[x][y].isBomb == true) {
count++
}
}
}
}
bombButton[i][j].BombRoundCount = count
}
}
}
}
/* 是否挖完了所有的雷 */
public void isWin() {
restBlock = BlockNum - BombNum
for (int i = 0i <(int) Math.sqrt(BlockNum)i++) {
for (int j = 0j <(int) Math.sqrt(BlockNum)j++) {
if (bombButton[i][j].isClicked == true) {
restBlock--
}
}
}
if (rightBomb == BombNum || restBlock == 0) {
JOptionPane.showMessageDialog(this, "您挖完了所有的雷,您胜利了!", "胜利",
JOptionPane.INFORMATION_MESSAGE)
startBomb()
}
}
/** 当选中的位置为空,则翻开周围的地图* */
public void isNull(Bomb ClickedButton) {
int i, j
i = ClickedButton.num_x
j = ClickedButton.num_y
for (int x = i - 1x <i + 2x++) {
for (int y = j - 1y <j + 2y++) {
if ( ( (x != i) || (y != j)) &&(x >= 0) &&(y >= 0)
&&(x <( (int) Math.sqrt(BlockNum)))
&&(y <( (int) Math.sqrt(BlockNum)))) {
if (bombButton[x][y].isBomb == false
&&bombButton[x][y].isClicked == false
&&bombButton[x][y].isRight == false) {
turn(bombButton[x][y])
}
}
}
}
}
/* 翻开 */
public void turn(Bomb ClickedButton) {
ClickedButton.setEnabled(false)
ClickedButton.isClicked = true
if (ClickedButton.BombRoundCount >0) {
ClickedButton.setText(ClickedButton.BombRoundCount + "")
}
else {
isNull(ClickedButton)
}
}
/* 左键点击 */
public void actionPerformed(ActionEvent e) {
if ( ( (Bomb) e.getSource()).isClicked == false
&&( (Bomb) e.getSource()).isRight == false) {
if ( ( (Bomb) e.getSource()).isBomb == false) {
turn( ( (Bomb) e.getSource()))
isWin()
}
else {
for (int i = 0i <(int) Math.sqrt(BlockNum)i++) {
for (int j = 0j <(int) Math.sqrt(BlockNum)j++) {
if (bombButton[i][j].isBomb == true) {
bombButton[i][j].setText("b")
}
}
}
( (Bomb) e.getSource()).setForeground(Color.RED)
( (Bomb) e.getSource()).setFont(new Font("", Font.BOLD, 20))
( (Bomb) e.getSource()).setText("X")
JOptionPane.showMessageDialog(this, "你踩到地雷了,按确定重来", "踩到地雷", 2)
startBomb()
}
}
}
/* 右键点击 */
public void mouseClicked(MouseEvent e) {
Bomb bombSource = (Bomb) e.getSource()
boolean right = SwingUtilities.isRightMouseButton(e)
if ( (right == true) &&(bombSource.isClicked == false)) {
bombSource.BombFlag = (bombSource.BombFlag + 1) % 3
if (bombSource.BombFlag == 1) {
if (restBomb >0) {
bombSource.setForeground(Color.RED)
bombSource.setText("F")
bombSource.isRight = true
restBomb--
}
else {
bombSource.BombFlag = 0
}
}
else if (bombSource.BombFlag == 2) {
restBomb++
bombSource.setText("Q")
bombSource.isRight = false
}
else {
bombSource.setText("")
}
if (bombSource.isBomb == true) {
if (bombSource.BombFlag == 1) {
rightBomb++
}
else if (bombSource.BombFlag == 2) {
rightBomb--
}
}
nowBomb.setText("当前雷数" + ":" + restBomb)
isWin()
}
}
public static void main(String[] args) {
Frame frame = new Frame()
frame.setVisible(true)
}
}
class Frame1_start_actionAdapter
implements ActionListener {
private Frame adaptee
Frame1_start_actionAdapter(Frame adaptee) {
this.adaptee = adaptee
}
public void actionPerformed(ActionEvent e) {
adaptee.start_actionPerformed(e)
}
}
////////////////////////////
class Bomb
extends JButton {
int num_x, num_y// 第几号方块
int BombRoundCount// 周围雷数
boolean isBomb// 是否为雷
boolean isClicked// 是否被点击
int BombFlag// 探雷标记
boolean isRight// 是否点击右键
public Bomb(int x, int y) {
num_x = x
num_y = y
BombFlag = 0
BombRoundCount = 9
isBomb = false
isClicked = false
isRight = false
}
}
class Bomb_actionAdapter
implements ActionListener {
private Frame adaptee
Bomb_actionAdapter(Frame adaptee) {
this.adaptee = adaptee
}
public void actionPerformed(ActionEvent e) {
adaptee.actionPerformed(e)
}
}
class Bomb_mouseAdapter
extends MouseAdapter {
private Frame adaptee
Bomb_mouseAdapter(Frame adaptee) {
this.adaptee = adaptee
}
public void mouseClicked(MouseEvent e) {
adaptee.mouseClicked(e)
}
}
import java.awt.Buttonimport java.util.Set
// 每一个小方块类
public class Diamond extends Button {
private Diamond[] diamonds
// 该小方块周围的八个方向上的小方块
private Diamond east
private Diamond north
private Diamond northEast
private Diamond northWest
private Diamond south
private Diamond southEast
private Diamond southWest
private Diamond west
private boolean isBomb// 是否是雷
private boolean isChange// 又没有被翻过
private int no// 产生的方块的编号
// 持有所有小方块的引用,方便进行 *** 作
public Diamond(Diamond[] diamonds) {
this.diamonds = diamonds
}
// 按键时方块发生改变
public boolean change() {
this.isChange = true// 说明已经翻过了
if(isBomb) {// 触雷
//this.setBackground(Color.red)
return true
} else {// 不是雷,就显示周围雷的数目
//this.setLabel(this.getNearBombNo() + "")
this.setLabel(this.getNearBombNo() + "")
//if(this.getNearBombNo() == 0) {
// this.moveon()
//}
return false
}
}
// 获得该小方块周围雷的数量
public int getNearBombNo() {
int no = 0
if(this.northWest != null &&this.northWest.isBomb) no++
if(this.north != null &&this.north.isBomb) no++
if(this.northEast != null &&this.northEast.isBomb) no++
if(this.east != null &&this.east.isBomb) no++
if(this.southEast != null &&this.southEast.isBomb) no++
if(this.south != null &&this.south.isBomb) no++
if(this.southWest != null &&this.southWest.isBomb) no++
if(this.west != null &&this.west.isBomb) no++
return no
}
// 获得该小方块周围的小方块
public Diamond getNearDimaond(int i) {
int index = -1
switch (i) {
case 1:// 1表示西北,2,表示北,以此类推
index = no - 10
if(index <1 || no == 19 || no == 28 || no == 37 || no == 46 || no == 55 || no == 64 || no == 73) {
return null
} else {
return diamonds[index]
}
case 2:
index = no - 9
if(index <1) {
return null
} else {
return diamonds[index]
}
case 3:
index = no - 8
if(index <1 || no == 9 || no == 18 || no == 27 || no == 36 || no == 45 || no == 54 || no == 63 || no == 72) {
return null
} else {
return diamonds[index]
}
case 4:
index = no + 1
if(no == 9 || no == 18 || no == 27 || no == 36 || no == 45 || no == 54 || no == 63 || no == 72 || no == 81) {
return null
} else {
return diamonds[index]
}
case 5:
index = no + 10
if(index >= 81 ||no == 9 || no == 18 || no == 27 || no == 36 || no == 45 || no == 54 || no == 63 || no == 72 || no == 81) {
return null
} else {
return diamonds[index]
}
case 6:
index = no + 9
if(index >81) {
return null
} else {
return diamonds[index]
}
case 7:
index = no + 8
if(index >= 81 || no==1 || no == 10 || no == 19 || no == 28 || no == 37 || no == 46 || no == 55 || no == 64 || no == 73) {
return null
} else {
return diamonds[index]
}
case 8:
index = no - 1
if(no==1 || no==10 || no == 19 || no == 28 || no == 37 || no == 46 || no == 55 || no == 64 || no == 73) {
return null
} else {
return diamonds[index]
}
}
return null
}
// 递归,set是用来装已经翻过的小方块的,不然会死循环,为什么用set,因为set是不重复的
public void moveon(Set<Diamond>set) {
set.add(this)// 先把自己加上
if(this.getNorthWest() != null &&this.getNorthWest().isBomb == false) {
this.getNorthWest().change()
if(this.getNorthWest().getNearBombNo() == 0) {
if(set.contains(this.getNorthWest()) == false)
this.getNorthWest().moveon(set)
}
set.add(this.getNorthWest())
}
if(this.getNorth() != null &&this.getNorth().isBomb == false) {
this.getNorth().change()
if(this.getNorth().getNearBombNo() == 0) {
if(set.contains(this.getNorth()) == false)
this.getNorth().moveon(set)
}
set.add(this.getNorth())
}
if(this.getNorthEast() != null &&this.getNorthEast().isBomb == false) {
this.getNorthEast().change()
if(this.getNorthEast().getNearBombNo() == 0) {
if(set.contains(this.getNorthEast()) == false)
this.getNorthEast().moveon(set)
}
set.add(this.getNorthEast())
}
if(this.getEast() != null &&this.getEast().isBomb == false) {
this.getEast().change()
if(this.getEast().getNearBombNo() == 0) {
if(set.contains(this.getEast()) == false)
this.getEast().moveon(set)
}
set.add(this.getEast())
}
if(this.getSouthEast() != null &&this.getSouthEast().isBomb == false) {
this.getSouthEast().change()
if(this.getSouthEast().getNearBombNo() == 0) {
if(set.contains(this.getSouthEast()) == false)
this.getSouthEast().moveon(set)
}
set.add(this.getSouthEast())
}
if(this.getSouth() != null &&this.getSouth().isBomb == false) {
this.getSouth().change()
if(this.getSouth().getNearBombNo() == 0) {
if(set.contains(this.getSouth()) == false)
this.getSouth().moveon(set)
}
set.add(this.getSouth())
}
if(this.getSouthWest() != null &&this.getSouthWest().isBomb == false) {
this.getSouthWest().change()
if(this.getSouthWest().getNearBombNo() == 0) {
if(set.contains(this.getSouthWest()) == false)
this.getSouthWest().moveon(set)
}
set.add(this.getSouthWest())
}
if(this.getWest() != null &&this.getWest().isBomb == false) {
this.getWest().change()
if(this.getWest().getNearBombNo() == 0) {
if(set.contains(this.getWest()) == false)
this.getWest().moveon(set)
}
set.add(this.getWest())
}
}
/*public Diamond[] getDiamonds() {
return diamonds
}*/
public Diamond getEast() {
return east
}
public int getNo() {
return no
}
public Diamond getNorth() {
return north
}
public Diamond getNorthEast() {
return northEast
}
public Diamond getNorthWest() {
return northWest
}
public Diamond getSouth() {
return south
}
public Diamond getSouthEast() {
return southEast
}
public Diamond getSouthWest() {
return southWest
}
public Diamond getWest() {
return west
}
public boolean isBomb() {
return isBomb
}
public boolean isChange() {
return isChange
}
public void setBomb(boolean isBomb) {
this.isBomb = isBomb
}
public void setChange(boolean isChange) {
this.isChange = isChange
}
public void setDiamonds(Diamond[] diamonds) {
this.diamonds = diamonds
}
public void setEast(Diamond east) {
this.east = east
}
public void setNo(int no) {
this.no = no
}
public void setNorth(Diamond north) {
this.north = north
}
public void setNorthEast(Diamond northEast) {
this.northEast = northEast
}
public void setNorthWest(Diamond northWest) {
this.northWest = northWest
}
public void setSouth(Diamond south) {
this.south = south
}
public void setSouthEast(Diamond southEast) {
this.southEast = southEast
}
public void setSouthWest(Diamond southWest) {
this.southWest = southWest
}
public void setWest(Diamond west) {
this.west = west
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)