2013-04-24 42 views
3

建模战舰游戏我想创建一个“游戏”的项目我的团队在大学做一个战列舰游戏。我以前从来没有真正使用GUI,几乎所有的输出都在Eclipse控制台中。如何正确使用Java

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

除了这些类,我有一个船级,有五个子类类型的船舶和Player类,设有专卖店玩家的名字和船舶创建对象的数组,他们使用。

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

我(!最后)的问题是 - 这是对系统进行建模的正确方法?当我查看CellLogic和CellGUI类时,它们似乎有相当类似的东西。另外,虽然我可以让GUI响应鼠标点击,但我非常努力地将GUI连接到逻辑。例如,我不知道如何将船舶添加到网格上,然后将哪些位置存储在二维数组中。如果没有发布大量的代码,我希望有人能够告诉我我是否至少在正确的轨道上,或者如果我把系统分离得太多了。

+0

你已经有很多优秀的答案,你的方法很完善。如果您需要额外的参考资料,您可以在此[TicTacToe代码](https://gist.github.com/jewelsea/5115901)中找到基本的基于回合的JavaFX网格游戏。 – jewelsea 2013-04-24 11:27:08

回答

3

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

现在基本上,该模型不知道别的什么,控制器知道视图和模型和视图知道如何绘制模型,并呼吁控制器作为用户输入的反应。那就是:用户点击,视图只是用坐标和发生的事件调用控制器。此控制器现在修改网格并发出重绘。所以在我的pov中,你可能不需要一个cellGUI类,只是一个视图,它描绘了一切(尽管如果你在cellgui类中存储x,y,你可以像这样建模)。但你不需要一个细胞课。你需要一个“更高”的控制器,知道如何修改整个网格,以及发生什么,如果已经有东西等等。

+0

谢谢 - 我会尝试合并这两个逻辑类。 – 2013-04-24 09:05:20

2

过度使用子类化的趋势是大学的项目很普遍。子类化是今天主要避免的事情。在你的例子中,对于船型使用子类不会有真正的好处。更好的设计是使用Ship类,该类具有枚举ShipType。这也会让评估更容易。

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

+0

谢谢 - 你有没有关于GridLogic,GridGUI,CellLogic和CellGUI分离的建议?这太多了吗? – 2013-04-24 08:57:28

1

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

董事会将画正方形,船只,然后最后炸弹在他们身上。

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

控制器将是BattleShip类与模型的帮助:细胞和船只。保持沟通,谁玩过,在哪里等等 - >通过接口与董事会进行对话,这样可以改变这种情况,说出一个新的观点的网络。

0

Model-View-Controller with listeners and such。如果您研究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(); 

这个高度分离。