我正在用Java设计一个国际象棋游戏(没有AI,只有用户控制),并且仍然习惯于OOP.我有两个问题.
我在想具有,除Game,Cell,Piece和Board对象,一个Player对象.
我的问题是,我真的需要吗?当然我不需要,但两种选择都被认为是更好的设计?一方面,似乎播放器对于包含有关播放器片段的信息很有用,并且应该包含诸如此类的方法takeTurn().(对于我的实现,我也想跟踪所有可能的移动,所以我将有一个方法getAllMoves()).另一方面,玩家不是简单地重组现有数据吗?每件作品都已经显示了它属于哪个玩家.而且由于我的游戏不包含AI,因此takeTurn()属于Game,而不是属于有意义Player.再次,可能Player只有方法getAllMoves(),它使用其数据,但不采取行动.
第二个问题,如果第一个问题的答案是肯定的,那么我如何组织对象之间的关系?getAllMoves()将输入一组细胞作为输入; 但令人感到奇怪的是,Player类依赖于它的单元格与作为输入传入的单元格匹配(是其子集)的事实.如果将细胞分割的细胞数据与Board中所有细胞的阵列保持在一起并一起更新,从而保证它们一致,那就更好了.当然,他们同意的保证会以任何一种方式存在,但似乎Player对象不应该知道Board对象中发生的保证.
我该如何处理这些问题?
谢谢!
恕我直言,拥有 Player 对象是一个很好的设计。
您甚至可以稍后将其细化为接口并拥有 AIPlayer 和 HumanPlayer 实现。
今天您只需要 getAllMoves 方法,但以后您可能需要更多。拥有一个物体将帮助您扩展玩家的能力。
对于第二点,我不确定 Player 是否应该直接实现 getAllMoves() 方法。
我会将其委托给 ChessGame 对象。在这种情况下,玩家将拥有对 Game 的引用,并将 getAllMoves 调用委托给该 Game 实例,如下所示:
伪代码 :)
嘿游戏,这件作品有哪些可用的动作?