作为一个夏季的项目,我从Uni有一些停机时间,我打算建立一个垄断游戏.然而,这个问题更多的是关于问题的一般概念,而不是我正在尝试执行的具体任务.
我决定采用自下而上的方法构建它,创建围绕四十个空间板的运动,然后继续与空间交互.我意识到我完全不确定如何处理这个问题,而且我在两个设计思想之间徘徊:
为每个空间提供自己的对象,空间对象的所有子类,以便空间对象本身可以定义交互.我可以通过为每种类型的空间实现不同的land()方法来实现这一点.
只给出属性和实用程序(因为每个属性都有独特的功能)对象,并创建方法来处理程序主类(或我称之为Board)中的购买/租赁等.像go和super tax这样的空间可以通过一小组条件来实现,以检查玩家是否在特殊空间.
选项1显然是OO(我觉得是正确的)做事方式,但我只想处理来自程序主类的用户交互.换句话说,我不希望空间物体与玩家交互.为什么?Errr.到目前为止,我所做的很多编码都具有这种简单性,但我不确定这对于大型项目是否是一个梦想.我真的应该在一个完全独立的类中处理用户交互吗?
你可以看到我对这种情况很困惑.这有什么办法吗?并且,有没有人对实际的OO设计有任何建议可以帮助一般?
编辑:请注意,我觉得我对这个问题失去了一点关注.我对组合OO和任何外部操作(命令行,网络,GUI,文件管理等)的一般方法感兴趣.
我同意选项#1似乎更好.
至于"用户互动" - 一切都取决于.您可以将一些代码留在另一个类中.例如,
// in main class
user.landOn(space);
if (space.containsProperties()) doSomething(); // Option #1 for some user-interaction code
// in User.java
public void landOn(Space s) {
// do some checks
s.land(this);
if (s.containsProperties()) {...} // Option #2
// something else?
}
// in GetMoneySpace.java
@Override
public void land(User u) {
u.awardCash(200);
// Option #3 - no properties so nothing here
}
Run Code Online (Sandbox Code Playgroud)
在我看来,这比OOP-y(在我看来更好)
if (space.isCashAwardSpace()) {
user.awardCash(space.getAward());
}
if (user.something()) doSomething(); // Some user-interaction code
Run Code Online (Sandbox Code Playgroud)
最后,这取决于你.这是OO的美丽,因为它需要解释.通常应该遵循一些模式,但一般来说,您决定如何处理它.
但是,您应该仔细考虑系统中每个参与者应该知道的其余部分.财产应该真正了解玩家,他的账户余额以及其他玩家吗?可能不是.物业应该知道它的成本,租金是多少等.
另一方面,主要播放线程是否应关注支付租金等微不足道的事情?可能不是.它的主要关注点应该是游戏本身的状态,例如骰子滚动,每个玩家是想交易还是购买还是非抵押/抵押,这样的事情.
想一想有关降落在广场上的动作.登陆后,玩家有3种选择:
现在,系统中的哪个actor知道完成该操作所需的所有信息.我们有Game类,它不关心这种单调乏味.我们拥有该物业,并不真正关心球员.但是Player对象知道所有这些信息.它记录每个玩家拥有的内容,并可以轻松访问正确的数据.
所以,如果是我,我会制作一个Player.performMove(Die d)方法.它可以轻松访问帐户.这也允许类之间的耦合最少.
但最终,这取决于你.我相信人们已经用完美的OO以及功能或程序语言创建了Monopoly克隆.最后,使用您所知道的并继续重构,直到您对最终设计感到满意为止.
| 归档时间: |
|
| 查看次数: |
324 次 |
| 最近记录: |