【问题标题】:How to correctly model a Battleships Game in Java如何在 Java 中正确建模战舰游戏
【发布时间】:2013-04-17 17:41:40
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您已经有很多出色的答案,而且您的方法非常合理。如果您需要额外的参考资料,您可以在TicTacToe code 中找到一个基本的回合制 JavaFX 网格游戏。

标签: java swing oop


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢 - 我会尝试合并这两个逻辑类。
【解决方案2】:

过度使用子分类的趋势在大学项目中很常见。子类化是今天主要避免的事情。在您的示例中,将子类用于船舶类型不会有真正的好处。更好的设计是只使用具有枚举ShipTypeShip 类。这也将使以后的评估更容易。

回答您的评论: 好吧,您的方法错过了某种 GridModel,其中包含 2D 网格和 Player 对象(所有游戏数据)。这个GridModelGridGUIGridLogic 中是已知的。 GridLogic 修改 GridModel 并告诉 GridGui 重新绘制更改后的模型。 GridGUI 不会修改模型,它只是通知GridLogic 在网格坐标 x, y 上发生了点击。然后是修改模型并让 GUI 自行刷新的逻辑。有关详细信息,请参阅Model-View-Controller-Pattern

【讨论】:

  • 谢谢 - 您对 GridLogic、GridGUI、CellLogic 和 CellGUI 的分离有什么建议吗?是不是太过分了?
【解决方案3】:

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

Board 会画出方格、船只,然后最终在它们上方投掷炸弹。

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

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

【讨论】:

    【解决方案4】:

    带有监听器等的模型-视图-控制器。如果您查看 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();
    

    这高度解耦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多