不确定从何处开始使用JavaFX扫雷GUI

时间:2019-07-03 17:39:21

标签: java javafx

我最近用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。如果有人对为什么这行不通有见解,我很想听听,但是如果不行,我会报告给您!

0 个答案:

没有答案