3

我正在尝试为我的团队在大学里做的一个“游戏”项目创建一个战舰游戏。我以前从未真正使用过 GUI,以前几乎所有的输出都在 Eclipse 控制台中。

首先,我创建了一个 GUI 类,它实际上是我的“跑步者”类。它加载了一个 JFrame。
我有第二个类,GUIGrid,它为将要显示的两个游戏板设置一个维度,并使用嵌套的 for 循环从 GUICells 创建网格。
这包含侦听器等来检测鼠标在做什么并存储每个单元格的 x 和 y 坐标。我已经运行了一小段测试代码,因此我可以单击任一网格上的任何位置,然后弹出窗口会告诉我该单元格的确切坐标。

除了这些类之外,我还有一个 Ship 类,它有五个船类型的子类和一个 Player 类,它存储玩家的名字并创建一个 Ship 对象数组供他们使用。

最后,我有我的逻辑课。我有一个 GridLogic 类和一个 CellLogic 类。前者使用嵌套的 for 循环来创建 CellLogic 对象的二维数组。然后 CellLogic 类存储坐标和有关单元是否受到攻击的信息。

我的问题(最后!)是 - 这是对系统建模的正确方法吗?当我查看 CellLogic 和 CellGUI 类时,它们似乎有相当相似的东西。此外,虽然我可以让 GUI 响应鼠标点击,但我真的很难将 GUI 连接到 Logic。例如,我不知道如何将船只添加到网格上,然后将哪些位置存储船只存储在 2D 数组中。在没有发布大量代码的情况下,我希望有人能够告诉我我是否至少在正确的轨道上,或者我是否已经将系统分离得太多。

4

4 回答 4

3

虽然我认为这种分离听起来不错,但可以说得更清楚。使用 MVC 模式,您可以清楚地定义模型(船舶和网格)、控制器(您的逻辑)和视图(绘制网格的 jframe)。

现在基本上,模型什么都不知道,控制器知道视图和模型,视图知道如何绘制模型并调用控制器作为对用户输入的反应。那就是:用户点击,视图只是调用一个带有坐标和发生事件的控制器。该控制器现在修改网格并发出重绘。

因此,在我的 pov 中,您可能不需要 cellGUI 类,只需要一个绘制所有内容的视图(不过,如果您将 x,y 存储在 cellgui 类中,您可以像这样对其进行建模......)。但是你不需要一个 celllogic 类。您需要一个“更高”的控制器,它知道如何修改整个网格以及会发生什么,如果已经存在等等。

于 2013-04-24T09:03:09.457 回答
2

The tendency of over-using sub-classing is very common to university projects. Subclassing is a thing which mostly is avoided today. In your example there won't be a real benefit of using sub-classes for ship types. A better design would be to just use a Ship class which has an enum ShipType. This will also make the evaluation easier later.

To answer your comment: Well your approach misses some kind of GridModel which contains the 2D grid and the Player objects (all game data). This GridModel is known in GridGUI and GridLogic. The GridLogic modifies the GridModel and tells the GridGui to repaint the changed model. The GridGUI doesn't modify the model it just informs the GridLogic that a click at the grid-coordinate x, y happened. Then it's on the logic to modify the model and let the GUI refresh itself. See the Model-View-Controller-Pattern for more details.

于 2013-04-24T08:55:26.363 回答
1

我想你不会在这里得到一个答案,但这是我的看法。显然是MVC。特别是我会保留主 GUI 一类(JFrame、菜单等)。将董事会保留在另一个。它会使用 Cells & Ships 来绘制自己。单元格将包含信息(它们的 x,y,哪艘船在上面以及是否被轰炸),船类将有它的类型,从 x,y 到 x,y,要渲染的图像。然后你可以得到一个部分透明的炸弹图像,这样可以在它下面看到船。

棋盘会画出方格、船只,最后在它们上面投掷炸弹。

代替弹出窗口,有助于有一个调试框架,您可以在其中显示(在标签上)一些关键信息;除了运行日志

在模型的一些帮助下,控制器将是 BattleShip 类:细胞和船只。保持沟通,谁玩,在哪里等分开->通过界面与董事会对话,以便可以将其更改为具有新视图的网络。

于 2013-04-24T09:04:45.770 回答
0

带有监听器等的模型-视图-控制器。如果您查看 JavaFX(打算跟进 Java Swing),它具有更简单的“内置”更改侦听器。还有一些漂亮的样式和动画效果,无需太多编程。

其余的似乎都很好。退一步继承。您可以实现一个特征查找/发现模型:

public interface FlightCapable { }
public class X {
    public T lookup(Class<T> intface) { }
}
FlightCapable fc = x.lookup(FlightCapable.class);
if (fc != null)
    fc.fly();  // Instead of x.fly();

这高度解耦。

于 2013-04-24T09:06:24.060 回答