我正在尝试为我的小组在大学里做的“游戏”项目创建战舰游戏。我之前从未真正使用过GUI,几乎所有输出都在Eclipse控制台中。
首先,我创建了一个GUI类,它实际上是我的“跑步者”类。它加载了一个JFrame
我有第二个类GUIGrid,它为将要显示的两个游戏板设置一个维度,并使用嵌套for循环从GUICells创建网格。
这包含侦听器等以检测鼠标正在做什么并存储每个单元格的x和y坐标。我运行了一小段测试代码,因此我可以点击任一网格上的任意位置,弹出窗口会告诉我该单元格的确切位置。
除了这些类之外,我还有一个Ship类,它有五个子类用于ship和Player类,它们存储了玩家的名字并创建了一个Ship对象数组供他们使用。
最后,我有我的逻辑课程。我有一个GridLogic类和一个CellLogic类。前者使用嵌套for循环来创建CellLogic对象的2D数组。然后,CellLogic类存储关于单元是否受到攻击的坐标和信息等内容。
我的问题(最后!)是 - 这是建模系统的正确方法吗?当我查看CellLogic和CellGUI类时,它们似乎有相似的东西。此外,虽然我可以让GUI响应鼠标点击,但我真的很难将GUI连接到Logic。例如,我不知道如何将船只添加到网格上,然后存储哪些位置将船舶存储在2D阵列中。在没有发布大量代码的情况下,我希望有人能够告诉我,我是否至少在正确的轨道上,或者我是否将系统分开了。
答案 0 :(得分:3)
现在基本上,模型不知道其他任何事情,控制器知道视图和模型,视图知道如何绘制模型并调用控制器作为对用户输入的反应。即:用户点击,视图只调用控制器,其中包含坐标和发生的事件。此控制器现在修改网格并发出重绘。
所以在我的pov中,你可能不需要一个cellGUI类,只是一个绘制所有内容的视图(但是,如果你在cellgui类中存储x,y,你可以像这样建模......)。但是你不需要一个celllogic课程。你需要一个知道的“更高”的控制器,如何修改整个网格,如果已经存在某些事情,会发生什么等等。
答案 1 :(得分:2)
过度使用子分类的趋势在大学项目中非常普遍。子类化是今天主要避免的事情。在您的示例中,对于船舶类型使用子类不会有实际好处。更好的设计是使用具有枚举Ship
的{{1}}类。这也将使评估更容易。
回答你的评论:
那么你的方法错过了某种ShipType
,它包含2D网格和Player对象(所有游戏数据)。这个GridModel
在GridModel
和GridGUI
中已知。 GridLogic
会修改GridLogic
并告诉GridModel
重新绘制已更改的模型。 GridGui
不会修改模型,只会通知GridGUI
网格坐标x,y处的点击发生。然后是逻辑修改模型并让GUI刷新自己。有关详细信息,请参阅Model-View-Controller-Pattern。
答案 2 :(得分:1)
我想你不会在这里得到一个答案,但这是我的看法。 MVC显然。特别是我会保持主GUI一个类(JFrame,菜单等)。将董事会留在另一个。它会使用Cell&船舶自己画。单元格将包含信息(它们的x,y,哪艘船在它们上面以及是否被轰炸),船级将具有其类型,从x,y到x,y,图像到渲染。然后你可以得到一个部分透明的炸弹图像,这样就可以看到它下方的船了。
董事会将绘制正方形,船只,然后最终炸弹。
而不是弹出窗口,有助于拥有一个调试框架,您可以在其中显示(在标签上)一些关键信息;除了运行日志
控制器将是BattleShip类,在模型的帮助下:细胞和船只。保持沟通,谁玩,谁等分开 - >通过接口与Board进行通信,因此可以将其更改为具有新视图的Web服务。
答案 3 :(得分: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();
这种高度分离。