我目前正在创建由以下课程组成的国际象棋游戏:


ChessPiece-对于所有各种棋子,由一个MovementBehaviour实例变量组成
MovementBehaviour-由PawnMovementBehaviour实现的接口,
KingMovementBehaviour等类定义
每种棋子如何移动
ChessBoard-由ChessPiece [] [] 2D数组组成,具有addPiece()/ removePiece()/ replacePiece()等功能
播放器-小类有助于将哪些作品属于哪个人类玩家
游戏-主要课程是从要求玩家提供他们的姓名和所需的棋子颜色开始,然后运行
通过实例化ChessBoard并让玩家移动来进行游戏
旋转直到达到将死。


我想知道我是否应该使用Singleton模式(关于ChessBoard类)?目前我还不是,我正在将ChessBoard实例传递给棋子移动功能,以便棋子可以了解其周围环境。这是因为当然可以根据棋盘上随时占用/空出的空间来认为移动是合法的。

最佳答案

单例很少是一个好主意。我最近刚开始一个类似的项目,所以我将从目前的经验中回答。

我实现它的方式是通过考虑棋盘上的Location对象集合,其中一个位置保存一个X-值,Y-值和一个Piece对象。只有相关的地方会被填充,甚至没有被追踪的地方。

您似乎想知道是否应该将单例用于验证的单个目的。完成移动后,您需要验证很多很多事情:您可以那样移动吗?在检查吗它是被动的吗?它是罗奇?等等

您可以做的是创建一堆验证方法,将棋盘,起始位置和终止位置作为参数。这样,您便拥有检查移动是否有效所需的所有信息。这确实需要作品知道它们自己的属性:我该如何移动?我的颜色是什么?

拥有所有这些功能之后,您可以实施不同的验证逻辑来​​进行操作。

当您仅提取验证并传递棋盘时,使用单例将非常麻烦。测试也将变得更加困难(好的测试绝对是您在国际象棋游戏中想要的东西)。

我的设置如下所示:

Chessboard.CanMoveToLocation(int startX, int startY, int endX, int endY) {
    // Call validators with local field chessboard and given location objects
}


每个验证器将返回一个自定义枚举ValidationResult,以指示此特定验证器是允许还是禁止它。

您必须确保以正确的顺序调用了验证器(在检查这是否是有效的举动之后返回false并不是一个好主意:他可能一直在游荡或杀死通行者)。或者,您当然可以合并相关的验证器。

您是否应该看一下:my current (far from finished) implementation

关于java - 象棋游戏设计和辛格尔顿模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20268062/

10-09 06:07
查看更多