java - 不知道从哪里开始使用 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。如果有人知道为什么这可能行不通,我很想听听,但否则,如果这行不通,我会报告!
解决方案
推荐阅读
- reactjs - 为什么 nextjs 持久化布局一直在重新渲染?
- postgresql - 使用 IAM 用户从 Azure Data Studio 连接到 Cloud SQL
- woocommerce - WooCommerce 仪表板 - 突出显示标记为“付款方式 - 支票”的订单
- python - 从 mysql 获取整数时如何获取整数
- r - ggplot :在 X 轴上带有标准偏差的线图
- google-cloud-platform - Google auth2 访问令牌在令牌后不时获取点(。)
- matlab - 如何使用 matlab 的 MIJ(FIJI)数据交换从 ZStack tiff 文件中保存图像序列
- azure - 加密标志为 true 时,Terraform 脚本为空 azurerm 自动化变量
- sql - 如何使用 Excel 单元格或范围作为 Azure SQL 数据库查询(在 Excel 中)的参数并将该查询附加到我的 Excel 单元格或范围
- wavesurfer.js - Wavesurfer pcm 选项