【问题标题】:What is a good way to model two objects that are the same thing, but have two different functionalities?对两个相同但具有两种不同功能的对象进行建模的好方法是什么?
【发布时间】:2012-11-10 16:57:49
【问题描述】:

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

类似地,在国际象棋中,您通常移动一个棋子,这应该返回一个棋子的移动以及它的去向,但您也可以城堡,这涉及指示两个棋子及其位置,或一方(国王/王后),或除了片/位置之外的其他一些信息。

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

谢谢!

【问题讨论】:

  • 我个人会为这个选择基本继承
  • 我认为所有类型的游戏都有一个共同的移动对象不是一个好主意。或者抽象只是一个标记。
  • 澄清一下,我不是在寻找跨多个游戏的解决方案。我正在寻找特定游戏的特定实现中的解决方案。我不需要处理国际象棋移动和拼字游戏移动的东西,但我试图处理的问题对于这些游戏(和其他游戏)中的每一个都是相似的。谢谢!

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


【解决方案1】:

根据经验,如果您希望某事物具有通用类型但行为不同(此处为 Move),则需要让该事物实现该行为。因此,与其问棋盘如何以不同的方式解释两个不同的动作,不如考虑如何让两个不同的动作在执行动作时以不同的方式使用棋盘。

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

【讨论】:

  • 这是一个简洁的,“当然”的答案。正是我需要的。谢谢!
【解决方案2】:

这些可能不是您正在寻找的,但在这篇旧帖子中似乎有很多很棒的想法:

Any patterns for modelling board games?

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

【讨论】:

    【解决方案3】:

    一个好的模型总是基于对需求、数据流、控制流、整体系统架构等的详细了解。通过挥手和哲学论证来设计应用程序的成果并不多。

    关于您的特定问题,通常合法的模型之一是 Player 返回一个 Move,但根据完整的细节,它的实际优点可能从总成功到彻底的灾难。

    【讨论】:

      【解决方案4】:

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

      您的国际象棋示例是最简单的。移动会返回棋子和棋盘上的新位置,但它也可能返回城堡事件、捕获事件和/或棋子提升事件。

      同样,在拼字游戏中,移动可能会返回文字游戏事件、交换牌事件或传球事件。

      将事件视为对游戏其余部分的信息。您可以像编写课程一样编写事件。该事件类必须有权访问各种游戏类,以便模型可以创建消息。

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

      【讨论】:

      • 我喜欢这个想法,但我仍然有同样的基本问题,因为我可能有三四个不同的事件。我是否比较“eventType”并将它们传递给各个处理程序?
      • 或者,棋盘和其他游戏部件是否订阅玩家作为玩家事件的监听器?同样,不确定处理此问题的最佳方法。
      • Java Swing 组件有各种各样的监听器(事件)。您可以让一个事件包含多个部分或单独的事件。国际象棋适合前者,而拼字游戏适合后者。由您决定什么对您的游戏更有意义。正如我在答案中所说,您有一个事件处理程序。同样,由您决定事件处理程序方法在哪个模型类中最有意义。
      【解决方案5】:

      如果不同的实现除了它们向外界展示自己的方式之外没有任何共同点,这从你的解释中可以看出,Move 应该是一个定义松散的接口,不同游戏中的每个实现都做自己的事情。

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

      【讨论】:

        猜你喜欢
        • 2019-12-17
        • 2017-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-05
        • 2016-09-15
        • 2020-09-13
        • 2016-11-23
        相关资源
        最近更新 更多