我正在考虑用Ruby编写一个CLI Monopoly游戏。这将是我在Ruby中完成的第一个大型项目。我在编程方面的大部分经验都是使用Clojure和Haskell等函数式编程语言。我很了解面向对象,但我没有设计面向对象程序的经验。
现在,这是交易。
在Monopoly,董事会周围有很多空间。大多数空间都是属性,而其他空间则做其他事情。
为每个空间设置一个课程会很聪明吗?我想的是有一个所有其他空间都继承自的Space类,并且有一个继承自Space的Property类,然后为继承自Property的每个属性都有一个类。这意味着一个很多的类,这让我相信这是一个糟糕的方式来做我想做的事。
我还打算做的是使用'inherited'钩子方法来跟踪所有属性,这样我就可以搜索它们并在需要时将它们从unbought列表中删除。
这类问题似乎出现在很多程序中,所以我的问题是:有没有更好的方法来做到这一点,我是否遗漏了对面向对象设计非常重要的东西?
如果这是一个愚蠢的问题,我很抱歉,对于OOPD,我只是一无所知。
感谢。
答案 0 :(得分:9)
你走在正确的轨道上,但是你走得太远了,这是初学者在OOP上的一个常见错误。每个属性都不是一个单独的类;它们都应该是Property类的实例。我会按照以下几行来创建属性类:
因此,例如,Boardwalk将是Property类型的对象,具有适用于它的特定值,例如属于深蓝色垄断组。
答案 1 :(得分:4)
空间的类可能不是一个坏主意;但是让我们看看为什么会这样。
如果您是用程序语言编写的,那么“if”和“switch”语句的大部分内容会在哪里?当他们降落在一个空间时,他们将决定每个玩家发生了什么。在OO中,我们希望尽可能多地阻止if / switch语句,并用多态替换它们。所以,很明显,如果我们创建了许多Space的衍生物,我们将阻止大量的if / switch语句。
但在我们实现这一飞跃之前,让我们来看看游戏的隐喻。游戏全是关于一个城市。地址,街道,公用事业,公共工程,监狱等。董事会的每个广场都代表着城市中的某种位置。事实上,球员穿越城市在他们碰巧降落的任何地方支付租金(或其他一些行动)。
所以让我们调用空间,CityBlocks。每个CityBlock都有一个地址,如“Boardwalk”或“Electric Company”,或“Community Chest”。 CityBlock对象有不同的类型吗?或者我们应该简单地将CityBlocks视为具有某种ZoningOrdinance的位置?
我有点喜欢。 | CityBlock | ----> | ZoningOrdinance |
现在我们可以有几种不同的ZoningOrdinance衍生物。这就是“战略”模式。我更喜欢这给了我们的灵活性,以及它提供的'where'和'what'的分离。
你还需要一个了解骰子,令牌,FreeParking,Passing Go等规则的Game类。该类将操纵玩家,并调用CityBlock上的方法。 CityBlock将在ZoningOrdinance上调用方法。
无论如何,这是一种方式......