我目前正在创建一个由以下类组成的国际象棋游戏:
我想知道我是否应该使用Singleton模式(关于ChessBoard类)?目前我不是,我正在将ChessBoard的实例传递给国际象棋棋子运动功能所以这件作品能够理解周围环境。这是因为根据当然在棋盘上占用/空置的空间,移动被认为是合法的。
答案 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)。或者你可以将相关的验证器结合起来。
答案 1 :(得分:1)
根据我的经验,我宁愿在这种情况下使用观察者模式。 ChessBoard类扮演Observer和ChessPiece的角色,它应该是一个抽象类,是Subject类。您可能想要查看Observer Pattern及其用法
当您携带一件并进行移动时,这意味着该部件的位置已经更改,并且该部件将通知电路板以检查移动是否有效。