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