2015-02-09 132 views
4

我想制作一个战舰游戏(参见维基百科:Battleship_(游戏))。设计一个简单的游戏类层次结构

我有一个Player类,一个Grid类和一个Ship类。

每个玩家都有一个网格,每个玩家拥有一组生活在网格上的船舶。

我如何知道是否要制作播放器或网格的Ships成员集?

在游戏开始时,玩家必须将他们的船放置在网格上。我有一个方法要求玩家在哪里放置他们的船。我怎么知道该放什么方法?如果它在玩家中,但是这组船舶在网格中,那么我将不得不从网格中获得对船舶集合的引用。然后,我想要Grid :: PlaceShip(Ship)还是Ship :: Place(x,y)?

有没有这方面的方法?我已经尝试过课堂责任 - 合作者,但它并没有给我答案让我开始编码。我宁愿学习如何自己找到答案,而不是给予他们这个具体的例子。

+0

难道你不想念'游戏'概念吗?行为几乎不会发生在代表所有行为发起者的实体上,比如'Player','User'等,或者所有行为都会在这些实体上发生。也许'game.placeInitialShipsFor(player,shipLocations)'? – plalx 2015-02-09 04:33:34

+0

我有一个游戏课程,我试图简化到我认为涉及的课程。我最终可能会把所有东西都添加到游戏类中,而我读过这是一个错误。游戏引发行为,玩家负责放置船只,船只负责放置,这取决于你如何看待它,并使我困惑。 – Qgenerator 2015-02-09 12:47:05

+0

谁负责维护数据的完整性?例如。只有游戏知道谁是玩家,是谁已经做出了初始投放。如果将高级函数放在'Game'对象上,那么像'Grid'和'Player'这样的类仍然会涉及到。 – plalx 2015-02-09 13:21:23

回答

2

它有点取决于周围的代码,但我的直觉是船应该是网格的一部分。 Grid和Ship所代表的信息之间有很多重叠,它们并不真正关注玩家:特定的网格位置,法律猜测等。如果您将Ship作为玩家的一部分,则仍然必须直接链接这两者,以便网格知道船舶何时受到撞击。如果它不知道船舶在哪里,那么拥有一个网格几乎没有意义。

这个问题没有真正的硬性和快速的答案:我该如何构建一个对象模型?无论对象模型如何,我都试图想象我可能必须编写哪些函数/方法/子例程。如果相同的概念在同一组函数中开始出现,那么它们应该在对象模型中连在一起。

当代码的不同部分代表相同的信息不止一次时,也很好的注意到这一点。对于每个任务或资源,尽量确保只有一部分代码负责它。你可能需要调整你的抽象,以便负责任的代码可以用于稍微不同的事情,所有事情都涉及同一种工作。

你的目标是简单的代码。如果你开始写作,并且随着代码变得越来越复杂(即更难理解),那么这就意味着你需要重新思考并重构你的模型。