首页 > 解决方案 > 不知道从哪里开始使用 JavaFX 扫雷 GUI

问题描述

我最近在 Java 中启动了一个扫雷项目。我计划在使用控制台作为输出时首先开发游戏机制,但现在我想使用我拥有的代码开发一个 GUI。问题是我在 GUI 设计方面的经验很少。

我之前在 JavaFX 方面的经验之一是设计国际象棋游戏。对于棋盘,我在 fxml 中创建了一个 2D ImageView 网格。每个 ImageView 将显示的图像会随着碎片的移动而改变。

对于我的扫雷游戏,我已经实现了一个可变大小的棋盘,所以我不能再次创建另一个 ImageView 2D 数组。我想知道 JavaFX 中是否有我不知道的东西可以帮助我解决这个问题。

我只想知道一种展示瓷砖板本身的好方法。游戏的所有其他 GUI 方面,我稍后会弄清楚。

就我对 JavaFX 的了解,我现在能想到的最好的事情是我可以创建一个具有最大板尺寸的 2D ImageView 数组。我可以将未使用的图块的所有高度和宽度设置为 0。但是,尽管这是我的最佳想法,但我觉得这是解决问题的一种非常糟糕的方法。

这是 Board 对象的字段

public class Board {
    public final static int EASY_SIZE = 8;
    public final static int MED_SIZE = 12;
    public final static int HARD_SIZE = 15;

    public final static int MIN_SIZE = 5;
    public final static int MAX_SIZE = 26;

    public int size;
    protected int mine_count;

    public boolean ended = false;

    protected Tile[][] board;

板输出到控制台。board.display() 函数:

public void display() {
    System.out.println();
    System.out.println(mine_count + " remaining mines");
    for (int i = 0; i< 10 && i < size; i++) {
        System.out.print(" _");
    }
    for(int i = 10; i < size; i++) {
        System.out.print(" __");
    }
    System.out.println();
    // For each row
    for (int r = 0; r < size; r++) {
        // For each col
        for (int c = 0; c < size && c < 10; c++) {
            // if the tile is flagged
            if (board[r][c].flag == true) {
                System.out.print("|F");
            }
            // else if the tile has not been clicked
            else if (board[r][c].clicked == false) {
                System.out.print("|#");
            }
            // else if mine clicked
            else if (board[r][c].mine == true) {
                System.out.print("|*");
            }
            // else if zero adj_mines
            else if (board[r][c].adj_mines == 0) {
                System.out.print("|_");
            }
            // else show number
            else {
                System.out.print("|" + board[r][c].adj_mines);
            }
        }
        for (int c = 10; c < size; c++) {
            // if the tile is flagged
            if (board[r][c].flag == true) {
                System.out.print("|F_");
            }
            // else if the tile has not been clicked
            else if (board[r][c].clicked == false) {
                System.out.print("|#_");
            }
            // else if mine clicked
            else if (board[r][c].mine == true) {
                System.out.print("|*_");
            }
            // else if zero adj_mines
            else if (board[r][c].adj_mines == 0) {
                System.out.print("|__");
            }
            // else show number
            else {
                System.out.print("|" + board[r][c].adj_mines + "_");
            }
        }
        System.out.println("| " + r);
    }
    for (int i = 0; i < size; i++) {
        System.out.print(" " + i);
    }
    System.out.println();
}

...由于我的问题是关于我可以使用哪种 JavaFX 布局来解决问题,所以我开始更多地研究我的选择。在我以前的 JavaFX 经验中,我在 FXML 文件中设计了所有 GUI 元素,但我意识到,由于我不确定启动时板的大小,我不应该这样做。

相反,我计划使用 GridPane 布局,我将更改我的 Tile 类以扩展 Button 以在鼠标左键和右键单击时设置 EventHandler。如果有人知道为什么这可能行不通,我很想听听,但否则,如果这行不通,我会报告!

标签: javajavafx

解决方案


推荐阅读