对两个对象进行建模的好方法是什么,但它们有两个不同的功能?

时间:2012-11-09 19:18:20

标签: java design-patterns object-oriented-analysis

我正在寻找一种在棋盘游戏中塑造'移动'的好方法。我希望能够向玩家询问他们的举动是什么并让他们做出回应,然后能够根据他们的举动在棋盘上执行正确的动作。问题是,有几种类型的移动,每种移动都有自己的数据集。例如,在Scrabble中,你可以播放一个单词,它应该返回单词,它的位置和方向(或一组带有位置或任何东西的平铺),但你也可以交换平铺(这将涉及返回你想要的平铺交换)或通过。

同样在国际象棋中,你通常会移动一块,它应该返回一块移动与它的位置,但你也可以城堡,其中包括指示两个部分及其位置,或一侧(国王/王后),或者除了作品/位置之外的其他一些信息。

我假设玩家返回Move对象是最好的方法,但我也可以接受任何其他建模选择或建议。

谢谢!

5 个答案:

答案 0 :(得分:1)

这些可能并不完全符合您的要求,但在这篇旧文章中似乎有很多好主意:

Any patterns for modelling board games?

一些答案​​包括Move实施的建议,并希望能给你一些新的想法。

答案 1 :(得分:1)

根据经验,如果你想要一个共同的类型但是对于一个东西有不同的行为 - 这里是一个移动 - 你需要让这个东西实现这个行为。因此,不应询问董事会如何以不同方式解释两种不同的动作,而应考虑如何在执行动作时以不同的方式使用棋盘。

所以:基类(应该是接口)是一个Move,它有一个perform()方法,这两种移动有不同的perform()方法实现。

答案 2 :(得分:0)

良好的模型总是基于需求,数据流,控制流,整体系统架构等的详细知识。通过手工和哲学论证来设计应用程序并不是很有成效。

关于您的特定问题,通常合法的模型之一是播放器返回移动,但根据完整的详细信息,其实际价值可能从总数成功完成灾难。

答案 3 :(得分:0)

游戏中的举动并不是真正的对象。这是一个事件。

你的国际象棋示例是最简单的。移动会在棋盘上返回一个棋子和新位置,但它也可以返回城堡事件,捕获事件和/或片段推广活动。

同样,在Scrabble游戏中,移动可以返回单词播放事件,交换区块事件或传递事件。

将事件视为对游戏其余部分的信息。您可以像对待课程一样对事件进行编码。此事件类必须能够访问各种游戏类,以便模型可以创建消息。

事件处理程序类处理所有游戏事件。这个类将是操纵其他游戏类的类。这些事件必须全部采用事件处理程序可以处理的格式。

答案 4 :(得分:0)

如果不同的实现没有任何共同点,除了它们如何呈现给外部世界,从你的解释中得到哪种,Move应该是一个松散定义的接口,不同游戏中的每个实现都在做自己的事情。 / p>

但我的主要问题是,是否真的有理由在不同的游戏中使用这个界面。如果没有某种类型的共享处理程序,它需要在不同的游戏中使用某些动作格式,我就不会打扰并简单地定义不同的游戏特定的Move类。