我在网上遇到过这样的OOP设计(简要版):
public abstract class ChessPieceBase {
abstract boolean canBeChecked();
abstract boolean isSupportCastle();
}
public class King extends ChessPieceBase { ... }
public class Queen extends ChessPieceBase { ... }
public class Position { // represents chess positions in compact form
ArrayList<ChessPieceBase> black;
ArrayList<ChessPieceBase> white;
}
public class ChessPieceTurn { };
public abstract class PlayerBase {
public abstract ChessPieceTurn getTurn(Position p);
}
class ComputerPlayer extends PlayerBase {
public ChessPieceTurn getTurn(Position p) { return null; }
}
public class HumanPlayer extends PlayerBase {
public ChessPieceTurn getTurn(Position p) { return null; }
}
public class GameManager {
void processTurn(PlayerBase player) { };
boolean acceptTurn(ChessPieceTurn turn) { return true; };
Position currentPosition;
}
我在理解设计方面有些困难,不知道我是不是不懂 OOP 还是不懂国际象棋:(。从上到下:
ChessPieceBase 是所有棋子的抽象基类,国王、王后、车、象、马和兵,对吧?所以我看到国王和王后扩展了 ChessPieceBase。
位置,根据评论,应该记录黑白棋子的全局当前位置。它实现为ChessPieceBase的arraylist,但ChessPieceBase不包含任何位置信息成员,那么位置信息存储在哪里?
ChessPieceTurn 是什么?如果是“轮到我,轮到你”的概念,为什么玩家类中的 getTurn() 函数需要“位置 p”参数并返回 null?
游戏管理器类。'currentPosition' 记录游戏的全局状态,'acceptTurn()' 似乎没有做任何事情,'processTurn()' 从玩家那里获得转弯并像裁判一样处理。希望我理解这最后一个正确。
如果可能的话,有人可以编写一个小 main() 函数来展示它是如何工作的吗?在这个时候,我只是困惑。
欢迎您提出任何关于您如何看待国际象棋游戏的课程的想法,
谢谢,