-2

我是 Java (以及几乎所有语言)的大菜鸟。我正在尝试为一项任务制作扫雷游戏,但我仍处于测试阶段。但是,一旦按下按钮,我就无法将地雷显示为“0”。我使用二维数组创建了 Jbuttons,但我似乎无法将“0”放在我想要的特定按钮上。

这是我的代码(请原谅丑陋/可能的低效率)当谈到 GUI 时我真的一无所知。

import java.awt.*;
import javax.swing.*;
import java.awt.GridLayout;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JFrame;

public class Grid extends JPanel {
    // Initializes rows,columns and mines
    int rows = 10;
    int cols = 10;
    int i, j = 0;
    int mines = 10;
    boolean[][] setmine = new boolean[rows][cols];
    boolean[][] clickable = new boolean[rows][cols];
    private JToggleButton squares[][], squares2[][];

    // Contructor for creating a grid(with default size 400x400
    public Grid() {
        this.setSize(600, 600);
        this.setLayout(new GridLayout(rows, cols));
        squares = new JToggleButton[rows][cols];
        buildButtons();
    }

    private void buildButtons() {
        // loops are used for creating the "buttons" on the grid.
        int MinesNeeded = 10;
        // builds buttons
        // ----------------------------------------
        for (i = 0; i < rows; i++) {
            for (j = 0; j < cols; j++) {
                squares[i][j] = new JToggleButton();
                // squares[i][j].setEnabled(false);
                squares[i][j].setSize(600, 600);

                // --------------------------------------------------
                // This part randomises the mines
                // -----------------------------------------------------
                while (MinesNeeded > 0) {

                    int x = (int) Math.floor(Math.random() * rows);
                    int y = (int) Math.floor(Math.random() * cols);
                    if (!setmine[x][y]) {
                        setmine[x][y] = true;

                        MinesNeeded--;
                    }
                }
                // ----------------------------------------------------------------------------

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

                if (setmine[i][j] == true) {

                    squares[i][j].addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent ae) {
                            // this is the problem
                            squares[i][j].setText("0");
                        }
                    });
                }
            }
        }
    }

    public static void main(String[] args) {
        Grid g = new Grid();
        JFrame frame = new JFrame("Minesweeper");

        frame.add(g);
        frame.setSize(600, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}
4

1 回答 1

0

我的建议是不要为数字显示 JButton,而是让我的单元格使用 CardttLayout,以便它最初显示一个 JButton,然后在按下时显示一个 JLabel。我在 stackoverflow 上有一个示例,我将搜索并通过链接回复您。

这是链接:扫雷行动事件

这里有一个链接更详细地解释了我的一些代码:需要我的扫雷程序帮助吗?

如果您运行该程序,您将看到如下所示的初始屏幕:

扫雷1

按下空方格后,您会看到所有空方格的清除:

扫雷2

击中炸弹后,您会看到所有炸弹出现:

扫雷3

于 2012-09-11T22:20:55.373 回答