这些东西早忘光了说下我的理解希望可以帮助你把。
你先想好用什么来做,java swing里面做这个的,我记得这个东西可以直接用button来做的。
这些button形成一个矩形,用一个数组来记录每个位置,比如point (x,y)这种。
用一个map来存放每个位置上button的状态,比如用0表示是雷,1不是。2是已经显示空白的区域,最后可能就是map((x,y),1)这种。
然后基本就是一些逻辑问题了,比如随机地雷位置(设置3里面随机数设置多少个是01).怎么右键点击显示周围雷个数,这些都是不少工作。
我能想到的就这些,毕竟过了很久了,你现在要是上学的话就抓紧写这个东西,我感觉你有了思路查资料的话一个礼拜差不多也就能看得出能不能做出来,不能做出来在找源码学吧,这些东西自己先做一遍和看源码在学习效果差挺多。
要详细代码?还是只要启动?java编写实现,代码如下:import Java.awt.*
import java.awt.event.*
import javax.Swing.*
/*按扭类*/
class Bomb extends JButton
{
public int num_x,num_y //第几号方块
public int BombRoundCount //周围雷数
public boolean isBomb //是否为雷
public boolean isClicked//是否被点击
public int BombFlag //探雷标记
public boolean isRight //是否点击右键
public Bomb(int x,int y)
{
BombFlag = 0
num_x = x
num_y = y
BombRoundCount = 0
isBomb = false
isClicked = false
isRight = false
}
}
/*窗口及算法实现类*/
class MainBomb extends JFrame implements ActionListener,MouseListener
{
public JTextField text
public Label nowBomb,setBomb
public int BlockNum,BombNum //当前方块数当前雷数
public Icon icon_bomb = new ImageIcon("Bomb.gif") //踩雷
public Icon icon_bomb_big = new ImageIcon("bomb_big.gif") //踩雷标记
public Icon icon_flag = new ImageIcon("flag.gif") //雷标记
public Icon icon_question = new ImageIcon("question.gif") //疑惑是否有雷
public JButton start = new JButton(" 开始 ")
public Panel MenuPamel = new Panel()
public Panel mainPanel = new Panel()
public Bomb[][] bombButton
/*界面设计*/
public MainBomb()
{
super("扫雷 Aaron2004制作 2004.8 ")
BlockNum = 64
BombNum = 10
Container c=getContentPane()
c.setBackground(Color.gray)
c.setLayout(new BorderLayout())
text=new JTextField("10 ",3)
nowBomb = new Label("当前雷数"+" "+BombNum+"")
setBomb= new Label("设置地雷数")
start.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
BombNum = Integer.parseInt(text.getText().trim())
if(BombNum >= 10 &&BombNum <50 )
replay()
else
{
JOptionPane msg = new JOptionPane()
JOptionPane.showMessageDialog(null,"您设置的地雷数太多了,请重设!","错误",2)
}
}
} )
MenuPamel.add(setBomb)
MenuPamel.add(text)
MenuPamel.add(start)
MenuPamel.add(nowBomb)
c.add(MenuPamel,"North")
mainPanel.setLayout(new GridLayout( (int)Math.sqrt(BlockNum) , (int)Math.sqrt(BlockNum)) )
bombButton=new Bomb[ (int)Math.sqrt(BlockNum) ][]
for(int i = 0 i <(int)Math.sqrt(BlockNum) i++)
{
bombButton[ i ]=new Bomb[ (int)Math.sqrt(BlockNum) ]
}
for(int i = 0 i <(int)Math.sqrt(BlockNum) i++ )
for(int j = 0 j <(int)Math.sqrt(BlockNum) j++ )
{
bombButton[ i ][ j ]=new Bomb(i,j)
bombButton[ i ][ j ].setForeground( Color.gray)
bombButton[ i ][ j ].addActionListener(this)
bombButton[ i ][ j ].addMouseListener(this)
}
for(int i = 0 i <(int)Math.sqrt(BlockNum) i++ )
for(int j = 0 j <(int)Math.sqrt(BlockNum) j++ )
mainPanel.add(bombButton[ i ][ j ])
c.add(mainPanel,"Center")
startBomb()
setSize(400,400)
setLocation(350,200)
setResizable(false)
}
/*布雷*/
public void startBomb()
{
for(int i=0i<BombNumi++)
{
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)
i--
else
bombButton[ x ][ y ].isBomb=true
}
}
/*重新开始*/
public void replay()
{
nowBomb.setText("当前雷数"+" "+BombNum+"")
for(int i = 0 i <(int)Math.sqrt(BlockNum) i++)
for(int j = 0 j <(int)Math.sqrt(BlockNum) j++)
{
bombButton[ i ][ j ].isBomb=false
bombButton[ i ][ j ].isClicked=false
bombButton[ i ][ j ].setEnabled(true)
bombButton[ i ][ j ].setText("")
bombButton[ i ][ j ].setIcon(null)
}
startBomb()
}
/*是否挖完了所有的雷*/
public void isWin()
{
int findBomb=0 //找到的地雷数
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 ].isRight == true)
findBomb++
}
if( findBomb == Integer.parseInt(text.getText().trim()) )
{
JOptionPane msg = new JOptionPane()
JOptionPane.showMessageDialog(this,"您挖完了所有的雷,您胜利了!","您胜利了",2)
}
}
/*计算方块周围雷数 */
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) {
if ( (i - 1 >= 0) &&(j - 1 >= 0)) {
if (bombButton[i - 1][j - 1].isBomb == true) {
count += 1//检测左上方空格是否是地雷
}
}
if ( (i - 1 >= 0)) {
if (bombButton[i - 1][ j ].isBomb == true) {
count += 1//检测上方空格是否为地雷
}
}
if ( (i - 1 >= 0) &&(j + 1 <= (int)Math.sqrt(BlockNum)-1)) {
if (bombButton[i - 1][j + 1] .isBomb == true) {
count += 1//检测右上方是否为地雷
}
}
if ( (j - 1 >= 0)) {
if (bombButton[ i ][j - 1] .isBomb == true) {
count += 1//检测左边是否为地雷
}
}
if ( (i >= 0) &&(j + 1 <= (int)Math.sqrt(BlockNum)-1)) {
if (bombButton[ i ][j + 1].isBomb == true) {
count += 1//右边
}
}
if ( (j - 1 >= 0) &&(i + 1 <= (int)Math.sqrt(BlockNum)-1)) {
if (bombButton[i + 1][j - 1].isBomb == true) {
count += 1//左下
}
}
if ( (i + 1 <= (int)Math.sqrt(BlockNum)-1)) {
if (bombButton[i + 1][ j ].isBomb == true) {
count += 1//下
}
}
if ( (j + 1 <= (int)Math.sqrt(BlockNum)-1) &&(i + 1 <= Math.sqrt(BlockNum)-1)) {
if (bombButton[i + 1][j + 1].isBomb == true) {
count += 1//右下
}
}
bombButton[ i ][ j ].BombRoundCount = count
}
}
}
}
/**当选中的位置为空,则翻开周围的地图**/
public void isNull(Bomb[][] bombButton,Bomb ClickecButton)
{
int i,j
i=ClickecButton.num_x
j=ClickecButton.num_y
if (ClickecButton.isBomb==true) {
}
else {
if ( (i - 1 >= 0) &&(j - 1 >= 0)) { //检测左上方空格是否是空
if (bombButton[i - 1][j - 1].isBomb == false &&bombButton[i - 1][j - 1].isClicked == false &&bombButton[i - 1][j - 1].isRight == false) {
bombButton[i - 1][j - 1].setText((bombButton[i - 1][j - 1].BombRoundCount)+"")
bombButton[i - 1][j - 1].setEnabled(false)
bombButton[i - 1][j - 1].isClicked=true
}
}
if ( (i - 1 >= 0)) { //检测上方空格是否为空
if (bombButton[i - 1][ j ] .isBomb == false &&bombButton[i - 1][ j ].isClicked == false &&bombButton[i - 1][ j ].isRight == false) {
bombButton[i - 1][ j ].setText((bombButton[i - 1][ j ].BombRoundCount)+"")
bombButton[i - 1][ j ].setEnabled(false)
bombButton[i - 1][ j ].isClicked=true
}
}
if ( (i - 1 >= 0) &&(j + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检测右上方是否为空
if (bombButton[i - 1][j + 1] .isBomb == false &&bombButton[i - 1][j + 1].isClicked == false &&bombButton[i - 1][j + 1].isRight == false) {
bombButton[i - 1][j + 1].setText((bombButton[i - 1][j + 1].BombRoundCount)+"")
bombButton[i - 1][j + 1].setEnabled(false)
bombButton[i - 1][j + 1].isClicked=true
}
}
if ( (j - 1 >= 0)) { //检测左边是否为空
if (bombButton[ i ][j - 1].isBomb == false &&bombButton[ i ][j - 1].isClicked == false &&bombButton[ i ][j - 1].isRight == false) {
bombButton[ i ][j - 1].setText((bombButton[ i ][j - 1].BombRoundCount)+"")
bombButton[ i ][j - 1].setEnabled(false)
bombButton[ i ][j - 1].isClicked=true
}
}
if ( (i >= 0) &&(j + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检测右边空格是否是空
if (bombButton[ i ][j + 1].isBomb == false &&bombButton[ i ][j + 1].isClicked == false &&bombButton[ i ][j + 1].isRight == false) {
bombButton[ i ][j + 1].setText((bombButton[ i ][j + 1].BombRoundCount)+"")
bombButton[ i ][j + 1].setEnabled(false)
bombButton[ i ][j + 1].isClicked=true
}
}
if ( (j - 1 >= 0) &&(i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检测左下空格是否是空
if (bombButton[i + 1][j - 1].isBomb == false &&bombButton[i + 1][j - 1].isClicked == false &&bombButton[i + 1][j - 1].isRight == false) {
bombButton[i + 1][j - 1].setText((bombButton[i + 1][j - 1].BombRoundCount)+"")
bombButton[i + 1][j - 1].setEnabled(false)
bombButton[i + 1][j - 1].isClicked=true
}
}
if ( (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检测下边空格是否是空
if (bombButton[i + 1][ j ].isBomb == false &&bombButton[i + 1][ j ].isClicked == false &&bombButton[i + 1][ j ].isRight == false) {
bombButton[i + 1][ j ].setText((bombButton[i + 1][ j ].BombRoundCount)+"")
bombButton[i + 1][ j ].setEnabled(false)
bombButton[i + 1][ j ].isClicked=true
}
}
if ( (j + 1 <= ((int)Math.sqrt(BlockNum)-1) ) &&(i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检测右下边空格是否是空
if (bombButton[i + 1][j + 1].isBomb == false &&bombButton[i + 1][j + 1].isClicked == false &&bombButton[i + 1][j + 1].isRight == false) {
bombButton[i + 1][j + 1].setText((bombButton[i + 1][j + 1].BombRoundCount)+"")
bombButton[i + 1][j + 1].setEnabled(false)
bombButton[i + 1][j + 1].isClicked=true
}
}
if ( (i - 1 >= 0) &&(j - 1 >= 0))//检测左上
isNull(bombButton,bombButton[i - 1][j - 1])
if ( (i - 1 >= 0))
isNull( bombButton,bombButton[i - 1][ j ])//检测上方
if ( (i - 1 >= 0) &&(j + 1 <= (int)Math.sqrt(BlockNum)-1))
isNull( bombButton,bombButton[i - 1][j + 1])//检测右上
if ( (j - 1 >= 0))
isNull(bombButton,bombButton[i][j - 1])//检测左边
if ( (i >= 0) &&(j + 1 <= ((int)Math.sqrt(BlockNum)-1)) )
isNull(bombButton,bombButton[i][j + 1])//检测右边
if ( (j - 1 >= 0) &&(i + 1 <= ((int)Math.sqrt(BlockNum)-1)) )
isNull(bombButton,bombButton[i + 1][j - 1])//检测左下
if ( (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) //检测下
isNull(bombButton,bombButton[i + 1][ j ])
if ( (j + 1 <= ((int)Math.sqrt(BlockNum)-1)) &&(i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) //检测右下
isNull(bombButton,bombButton[i + 1][j + 1])
}
}
public void actionPerformed(ActionEvent e)
{
CountRoundBomb()
if(((Bomb)e.getSource()).isBomb==false &&((Bomb)e.getSource()).isClicked == false)
{
((Bomb)e.getSource()).setText(( ((Bomb)e.getSource()).BombRoundCount )+"")
((Bomb)e.getSource()).isClicked=true
((Bomb)e.getSource()).setIcon(null)
((Bomb)e.getSource()).setEnabled(false)
if((((Bomb)e.getSource()).BombRoundCount) == 0)
isNull(bombButton,(Bomb)e.getSource())
isWin()
}
else if(((Bomb)e.getSource()).isBomb == true)
{
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 ].setIcon(icon_bomb)
}
((Bomb)e.getSource()).setIcon(icon_bomb_big)
JOptionPane msg = new JOptionPane()
JOptionPane.showMessageDialog(this,"你踩到地雷了,按确定重来","你踩到地雷了",2)
replay()
}
}
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(BombNum >0 &&bombSource.isRight == false ){
bombSource.setIcon(icon_flag)
bombSource.isRight = true
BombNum--
}
isWin()
nowBomb.setText("当前雷数"+" "+BombNum+"")
}
else if(bombSource.BombFlag == 2)
{
if( (BombNum !=0 ) ||(BombNum ==0 &&(bombSource.getIcon()==icon_flag)) )
BombNum++
bombSource.setIcon(icon_question)
nowBomb.setText("当前雷数"+" "+BombNum+"")
}
else if(bombSource.BombFlag == 0)
{
bombSource.setIcon(null)
bombSource.isRight = false
}
}
}
public void mouseEntered(MouseEvent e)
{}
public void mouseReleased(MouseEvent e)
{}
public void mouseExited(MouseEvent e)
{}
public void mousePressed(MouseEvent e)
{}
}
/*主类*/
public class Main
{
public static void main(String args[])
{
(new MainBomb()).show()
}
}