国际象棋游戏设计和单身人士模式

时间:2013-11-28 13:58:15

标签: java design-patterns singleton chess

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

  • ChessPiece - 适用于所有各种棋子,由MovementBehaviour实例变量组成
  • MovementBehaviour - 由PawnMovementBehaviour实施的界面, KingMovementBehaviour等类定义 每件作品如何移动
  • ChessBoard - 包含具有addPiece()/ removePiece()/ replacePiece()等功能的ChessPiece [] [] 2D数组
  • 播放器 - 小班有助于关联哪些作品属于哪个人类玩家
  • 游戏 - 主要类别主要是通过询问玩家的名字和所需的棋子颜色然后运行 游戏通过实例化ChessBoard并让玩家转过来 转向,直到达到将死。

我想知道我是否应该使用Singleton模式(关于ChessBoard类)?目前我不是,我正在将ChessBoard的实例传递给国际象棋棋子运动功能所以这件作品能够理解周围环境。这是因为根据当然在棋盘上占用/空置的空间,移动被认为是合法的。

2 个答案:

答案 0 :(得分:3)

单身人士很少是一个好主意。我最近碰巧开始了一个类似的项目,所以我将从目前的经验中回答这个问题。

我实现它的方法是在棋盘上考虑一组Location个对象,其中一个位置包含X - 值,Y - 值和一个{{1对象。只有相关的地方才会被填空,甚至没有跟踪空的地方。

您似乎想知道是否应该使用单例来实现验证的单一目的。移动完成后,您需要验证很多很多东西:你能这样移动吗?你检查一下吗?它是否是通行证?是一个rochade?等

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

如果掌握了所有这些,您可以实施不同的验证逻辑来​​进行移动。

当你可以提取验证并传递棋盘时,使用单身将是相当讨厌的。测试也会困难得多(好的测试绝对是你想要的国际象棋游戏)。

我的设置如下:

Piece

每个验证器都将返回一个自定义枚举Chessboard.CanMoveToLocation(int startX, int startY, int endX, int endY) { // Call validators with local field chessboard and given location objects } ,以指示此特定验证器是允许还是禁止。

你必须确保以正确的顺序调用验证器(在检查它是否有效之后返回false是不是一个好主意:他可能一直在进行rochading或者杀死en-passant)。或者你可以将相关的验证器结合起来。

您是否希望查看:my current (far from finished) implementation

答案 1 :(得分:1)

根据我的经验,我宁愿在这种情况下使用观察者模式。 ChessBoard类扮演Observer和ChessPiece的角色,它应该是一个抽象类,是Subject类。您可能想要查看Observer Pattern及其用法

当您携带一件并进行移动时,这意味着该部件的位置已经更改,并且该部件将通知电路板以检查移动是否有效。