关闭。这个问题是opinion-based .它目前不接受答案。
想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.
3年前关闭。
Improve this question
我正在尝试了解如何以面向对象的方式进行设计和思考,并希望从社区中获得有关此主题的一些反馈。下面是一个我希望以OO方式设计的象棋游戏的例子。这是一个非常广泛的设计,我在这个阶段的重点只是确定谁负责哪些消息以及对象如何相互交互以模拟游戏。请指出是否存在不良设计元素(高耦合、不良内聚等)以及如何改进它们。
国际象棋游戏有以下类
Board 由正方形组成,因此可以让 Board 负责创建和管理 Square 对象。每一 block 也都在一个正方形上,所以每 block 也有一个指向它所在的正方形的引用。 (这有意义吗?)。然后每一 block 负责将自己从一个方格移动到另一个方格。
玩家类拥有对他拥有的所有棋子的引用,并且还负责它们的创建(玩家应该创建棋子吗?)。 Player 有一个方法 takeTurn,该方法又调用一个方法 movePiece,该方法属于 Piece 类,它将棋子的位置从其当前位置更改为另一个位置。现在我对 Board 类必须负责的具体内容感到困惑。我认为需要确定游戏的当前状态并知道游戏何时结束。但是当一 block 改变它的位置时,板应该如何更新?它是否应该维护一个单独的正方形数组,其中存在碎片并随着碎片的移动而更新?
此外,ChessGame 最初创建 Board 和 player 对象,它们依次分别创建正方形和棋子并开始模拟。简而言之,这可能是 ChessGame 中的代码的样子
Player p1 =new Player();
Player p2 = new Player();
Board b = new Board();
while(b.isGameOver())
{
p1.takeTurn(); // calls movePiece on the Piece object
p2.takeTurn();
}
我不清楚董事会的状态将如何更新。应该片有引用板?责任应该在哪里?谁持有什么引用资料?请帮助我输入您的意见并指出此设计中的问题。我故意不关注任何算法或游戏的更多细节,因为我只对设计方面感兴趣。我希望这个社区可以提供有值(value)的见解。
最佳答案
这是我的想法,对于一个相当基本的国际象棋游戏:
class GameBoard {
IPiece config[8][8];
init {
createAndPlacePieces("Black");
createAndPlacePieces("White");
setTurn("Black");
}
createAndPlacePieces(color) {
//generate pieces using a factory method
//for e.g. config[1][0] = PieceFactory("Pawn",color);
}
setTurn(color) {
turn = color;
}
move(fromPt,toPt) {
if(getPcAt(fromPt).color == turn) {
toPtHasOppositeColorPiece = getPcAt(toPt) != null && getPcAt(toPt).color != turn;
possiblePath = getPcAt(fromPt).generatePossiblePath(fromPt,toPt,toPtHasOppositeColorPiece);
if(possiblePath != NULL) {
traversePath();
changeTurn();
}
}
}
}
Interface IPiece {
function generatePossiblePath(fromPt,toPt,toPtHasEnemy);
}
class PawnPiece implements IPiece{
function generatePossiblePath(fromPt,toPt,toPtHasEnemy) {
return an array of points if such a path is possible
else return null;
}
}
class ElephantPiece implements IPiece {....}
关于chess - 国际象棋游戏的面向对象设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4168002/