我在为Java类构建战舰游戏的网格时遇到了一些麻烦。到目前为止,我可以轻松地创建一个for
循环来将JPanel或JButton对象添加到JFrame。但是,我的问题是我在玩游戏时需要再次使用这些面板或按钮(例如点击一个按钮,看看你的对手是否在该广场上放了一艘船等等)。 Java中是否有一种简单的方法来初始化大量对象的引用变量?或者我必须单独申报所有这些吗?
答案 0 :(得分:5)
您可以尝试JPanels(或任何其他对象)的多维数组。创建一个与网格大小相同的数组。下面的行初始化一个包含5行和5列的数组。
JPanel[][] battleField = new JPanel[5][5];
使用嵌套for循环在数组中创建面板。
for (int rowIndex = 0; rowIndex < battleField.length; rowIndex++)
{
for (int cellIndex = 0; cellIndex < battleField[rowIndex]; cellIndex++)
{
battleField[rowIndex][cellIndex] = new JPanel();
}
}
如果你想稍后引用battleField数组,你只需将它变成一个实例变量。
答案 1 :(得分:4)
对于战舰游戏,您很可能希望在点击后检索按钮的位置。您可以使用按钮作为键以及它所在的点作为值来创建哈希表。
HashMap<JButton, Point> buttonMap = new HashMap<JButton, Point>();
for (int x = 0; x < COLUMNS; x++)
{
for (int y = 0; y < ROWS; y++)
{
JButton btn = new JButton();
btn.addActionListener(this);
buttonMap.put(btn, new Point(x, y));
//then add the button to your container
}
}
在你的actionPerformed方法中,你可以将按钮转换为它所在的位置。
JButton btn = (JButton)actionEvent.getSource();
Point p = buttonMake.get(btn);
当然,您需要正确处理错误情况,例如来源不是按钮或按钮不在地图中......
答案 2 :(得分:2)
您可以随时扩展JButton
以跟踪所需的信息。一个简单的例子:
class MyButton extends JButton{
private MyGameInfo mygameInfo;
private int buttonId;
//More fields....
//Getters/Setters
}
然后,不是在布局中创建和添加JButton
个对象,而是创建MyButton
个对象(这也是一个JButton,因此您的布局不会受到影响),并为游戏逻辑使用其额外的功能。
答案 3 :(得分:2)
作为参考,这里是一个使用按钮网格的相关matching game。这个相关的answer演示了模型 - 视图 - 控制器模式在简单游戏中的应用。