Я недавно начал проект тральщика на 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 для левого и правого щелчков мыши. Если у кого-то есть понимание того, почему это может не сработать, я хотел бы услышать это, но в противном случае я сообщу, если это сработает!