Не уверен, с чего начать с графического интерфейса тральщика JavaFX - PullRequest
0 голосов
/ 03 июля 2019

Я недавно начал проект тральщика на Java. Я планировал сначала разработать игровую механику, используя консоль в качестве вывода, но теперь я хочу разработать графический интерфейс с использованием имеющегося кода. Проблема в том, что у меня очень мало опыта в разработке GUI.

Одним из моих предыдущих опытов в JavaFX была разработка игры в шахматы. Для шахматной доски я создал двумерную сетку ImageView в формате fxml. Изображения, которые будет отображать каждый ImageView, будут меняться при перемещении частей.

Для моей игры тральщик я реализовал доску переменного размера, поэтому я не могу просто создать еще один 2D-массив ImageView. Мне интересно, есть ли в JavaFX что-то, о чем я не знаю, что могло бы помочь мне подойти к этой проблеме.

Хотелось бы узнать хороший способ отображения самой плитки. Все остальные аспекты графического интерфейса игры я смог выяснить позже.

Лучшее, что я мог подумать сейчас о том, что я знаю о 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, но я понимаю, что, поскольку я не уверен в размере платы при загрузке, я не должен этого делать.

Вместо этого я планирую использовать макет GridPane, и я изменю свой класс Tile на расширение Button, чтобы установить EventHandler для левого и правого щелчков мыши. Если у кого-то есть понимание того, почему это может не сработать, я хотел бы услышать это, но в противном случае я сообщу, если это сработает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...