2

我在网上遇到过这样的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 还是不懂国际象棋:(。从上到下:

  1. ChessPieceBase 是所有棋子的抽象基类,国王、王后、车、象、马和兵,对吧?所以我看到国王和王后扩展了 ChessPieceBase。

  2. 位置,根据评论,应该记录黑白棋子的全局当前位置。它实现为ChessPieceBase的arraylist,但ChessPieceBase不包含任何位置信息成员,那么位置信息存储在哪里?

  3. ChessPieceTurn 是什么?如果是“轮到我,轮到你”的概念,为什么玩家类中的 getTurn() 函数需要“位置 p”参数并返回 null?

  4. 游戏管理器类。'currentPosition' 记录游戏的全局状态,'acceptTurn()' 似乎没有做任何事情,'processTurn()' 从玩家那里获得转弯并像裁判一样处理。希望我理解这最后一个正确。

如果可能的话,有人可以编写一个小 main() 函数来展示它是如何工作的吗?在这个时候,我只是困惑。

欢迎您提出任何关于您如何看待国际象棋游戏的课程的想法,

谢谢,

4

0 回答 0