创建扫雷,如何在更改难度时重置板。

时间:2013-10-31 23:35:14

标签: java swing jmenu minesweeper

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.ActionListener;

public class Minesweeper extends JFrame implements MouseListener, ActionListener 
{
public int gridRows;
public int gridColumns;
int mines;
private JMenuBar menuBar;
private JMenu Difficulty;
private JMenu Options;
private int numberofMines;
private int row, col;
JMenuItem Expert, Intermediate, Easy;
JButton[][] easyGrid;
Tile[][] squares = new Tile[9][9];
Container box = getContentPane();
private JLabel flagcounter;
private JLabel timecounter;
private Font f1 = new Font("Brush Script", Font.BOLD,20);
int easyflags = 10;

public static void main(String args[])
{

    Minesweeper myGui = new Minesweeper();
    myGui.setVisible(true);         
}
public Minesweeper()
{
    super();
    setLayout(null);
    makeBoard(9, 9);
    initUI();
    setJMenuBar(menuBar);
    menuBar.add(Difficulty);
    menuBar.add(Options);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLocation(800,200);
    setSize(500, 600);
    setTitle("Minesweeper");
    setVisible(true);

    flagcounter = new JLabel("0"+easyflags, SwingConstants.CENTER);
    flagcounter.setBounds(20, 20, 50, 40);
    flagcounter.setFont(f1);
    flagcounter.setBackground(Color.black);
    flagcounter.setForeground(Color.red);
    flagcounter.setOpaque(true);
    flagcounter.setBorder(BorderFactory.createLineBorder(Color.black));
    flagcounter.setVisible(true);
    add(flagcounter);   

}


private void makeBoard(int rowsX, int columnsY)
{

gridRows = rowsX;
gridColumns = columnsY;


easyGrid = new JButton[rowsX][columnsY]; // sets the grid size from the parameters given
squares = new Tile[gridRows][gridColumns];

    for (int i = 0; i<rowsX; i++)
    {
        for (int j = 0; j<columnsY; j++)
        {
            squares[i][j] = new Tile(i, j);
            squares[i][j].setBounds(25+(i*50),(j*50) + 100,50,50);
            squares[i][j].setHorizontalAlignment(SwingConstants.CENTER);
            squares[i][j].setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
            squares[i][j].addMouseListener(this);

            box.add(squares[i][j]);

        }

    }

    repaint();
}
public Tile get(int i, int j)
{
    return squares [i][j];
}
final void initUI()
{
    menuBar = new JMenuBar();
    Difficulty = new JMenu("Difficulty");
    Options = new JMenu("Options");
    JMenuItem easy = new JMenuItem("Easy");
    easy.addActionListener(this);
    easy.setToolTipText("New 9x9 game with 10 bombs.");

    JMenuItem medium = new JMenuItem("Medium");
    medium.addActionListener(this);
    medium.setToolTipText("New 16x16 game with 40 bombs");

    JMenuItem hard = new JMenuItem("Hard");
    hard.addActionListener(this);
    hard.setToolTipText("New 30x16 game with 99 bombs");

    JMenuItem custom = new JMenuItem("custom");
    custom.addActionListener(this);
    custom.setToolTipText("Set a custom layout for a minesweeper game");

    JMenuItem oExit = new JMenuItem("Exit");
    oExit.addActionListener(this);
    oExit.setToolTipText("Exit the game");
    Difficulty.add(easy);
    Difficulty.add(medium);
    Difficulty.add(hard);

    Options.add(oExit);
}




public void actionPerformed(ActionEvent e)
{
    if(e.getSource() instanceof Tile)
    {

    }
    if(e.getSource() instanceof JMenuItem)
    {
        String menu;
        menu = e.getActionCommand();

        if (menu.equals("Exit"))
        {
            System.exit(0);
        }
        if (menu.equals("Easy"))
        {
            setSize(500,600);
            makeBoard(9,9);
            // TODO need to reset the board
        }
        if (menu.equals("Medium"))
        {
            setSize(850,950);
            //TODO figure out how to change the flag counter...
            makeBoard(16, 16);
        }
        if (menu.equals("Hard"))
        {
            setSize(1550,950);
            makeBoard(30,16);
        }

    }

    }


public void mouseClicked(MouseEvent e)
{
    if(e.getSource() instanceof Tile)
    {
    Tile clicked = (Tile)e.getSource();
        //Test Statements
        System.out.println("Row " + clicked.getColumn() + " Column " + clicked.getRow());
        System.out.println("This tile is: " + clicked.getOccupied());
        if(e.getButton() == MouseEvent.BUTTON3)
        {
            clicked.setForeground(Color.BLUE);
            clicked.setOccupied('f');
            clicked.setBackground(Color.LIGHT_GRAY);

        }

    }

}


public void mouseEntered(MouseEvent arg0)
{
    if(arg0.getSource() instanceof Tile)
    {
        Tile entered = (Tile)arg0.getSource();
        entered.setBorder(BorderFactory.createLineBorder(Color.blue));
    }
}

@Override
public void mouseExited(MouseEvent arg0)
{

    Tile exited = (Tile)arg0.getSource();
    exited.setBorder(BorderFactory.createLineBorder(Color.black));
}

@Override
public void mousePressed(MouseEvent arg0)
{
    // TODO Auto-generated method stub
    if(arg0.getSource() instanceof Tile)
    {

    }
}

@Override
public void mouseReleased(MouseEvent arg0)
{
    // TODO Auto-generated method stub

}

}

这是主要的课程

import java.awt.Color;
import java.awt.Image;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
 // Tile class for mine sweeper
public class Tile extends JLabel
{
private char occupied;
private int column;
private int row;

private JLabel OccupiedB;
private JLabel OccupiedC;
private JLabel OccupiedE;
private JLabel OccupiedF;
//Icon flag = new ImageIcon("flag.ico");

/*
whatever.setIcon(new ImageIcon("filename.ext"));
or
Icon myIcon = new ImageIcon("filename.ext");
whatever.setIcon(myIcon);
*/

public Tile(int col, int newRow)
{
    super();
    setBackground(Color.GRAY);
    setOpaque(true);
    occupied = 'g';
    column = col;
    row = newRow;

}

public boolean setOccupied(char Ecolumn)
{
    occupied = Ecolumn;
    if(occupied == 'b')         // If the tile is a bomb
    {

    }
    else if(occupied == 'c')    // If the tile is clear
    {
        setBackground(Color.WHITE);
    }
    else if(occupied == 'e')    // If the tile is empty or surrounding a bomb
    {

    }
    else if(occupied == 'f')    // If the tile is a flag
    {
        setText("F");

        //setIcon(new ImageIcon("flag.ico"));

    }
    return true;
}

public int getColumn()
{
    return column;
}

public void setColumn(int column)
{
    this.column = column;
}

public int getRow()
{
    return row;
}

public JLabel getOccupiedB()
{
    return OccupiedB;
}

public void setOccupiedB(JLabel occupiedB)
{
    OccupiedB = occupiedB;
}


public JLabel getOccupiedC()
{
    return OccupiedC;
}

public void setOccupiedC(JLabel occupiedC)
{
    OccupiedC = occupiedC;
}


public JLabel getOccupiedE()
{
    return OccupiedE;
}

public void setOccupiedE(JLabel occupiedE)
{
    OccupiedE = occupiedE;
}
public JLabel getOccupiedF()
{
    return OccupiedF;
}

public void setOccupiedF(JLabel occupiedF)
{
    OccupiedF = occupiedF;
}

public void setRow(int row)
{
    this.row = row;
}

public char getOccupied()
{
    return occupied;
}


}

这是tile类

我不明白如何在改变难度时基本上重置电路板,或者我计划设置自定义电路板选项如何根据给定的电路板数自动调整电路板大小。

如果你不能告诉......我对代码很新。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

大部分内容都没有这样做吗?

    if (menu.equals("Easy"))
    {
        setSize(500,600);
        makeBoard(9,9);
        // TODO need to reset the board
    }
    if (menu.equals("Medium"))
    {
        setSize(850,950);
        //TODO figure out how to change the flag counter...
        makeBoard(16, 16);
    }
    if (menu.equals("Hard"))
    {
        setSize(1550,950);
        makeBoard(30,16);
    }

有人从菜单中选择一个选项即可触发事件。事件处理程序包含一个if / else块,它可以:退出,设置为easy,设置为medium,设置为hard。 makeBoard函数处理灰色图块的实际显示,据我所知,所有图块的Occupied设置为'g'(灰色?)。如果你问的是实际生成的炸弹等,我没有看到任何关于那个的东西。它要么为您照顾,要么您没有提供代码,或者您必须自己编写。

你需要将int easyFlags设置为他们遇到的特殊困难。 您需要将flagCounter标签设置为0。 您需要将timecounter标签设置为t0 0。 你需要设置int mines,因为有很多困难。

对于menu.equals(“Easy”),如果阻止它将是:

    if (menu.equals("Easy"))
    {
        setSize(500,600);
        makeBoard(9,9);
        flagCounter.setText("0");
        timecounter.setText("0"); //or "0:00" or w/e
        mines = 10;
        easyFlags = 10;
    }

可能会稍微多一些,但我不想做什么显然是某种学校项目给你lol