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 は、すべての駒、キング、クイーン、ルーク、ビショップ、ナイト、ポーンの抽象基本クラスですよね? King と Queen が ChessPieceBase を拡張しているようです。

  2. コメントによると、位置は、黒と白の部分のグローバルな現在の位置を記録する必要があります。これは ChessPieceBase の配列リストとして実装されていますが、ChessPieceBase には位置情報メンバーが含まれていないため、位置情報はどこに保存されるのでしょうか?

  3. ChessPieceTurn とは何ですか? それが「私のターン、あなたのターン」の概念である場合、なぜプレーヤークラスの getTurn() func は「Position p」パラメータを必要とし、null を返すのですか?

  4. ゲームマネージャ クラス。「currentPosition」はゲームの全体的な状態を記録します。「acceptTurn()」は何もしていないようです。「processTurn()」はプレイヤーからターンを取得し、審判のように処理します。この最後のものが正しいことを理解してください。

可能であれば、誰かが main() 関数を書いて、それがどのように機能するかを示すことができますか? この時、私はただ混乱しています。

チェスゲームのクラスがどのように見えるべきかについて、あなたからのアイデアは大歓迎です.

ありがとう、

4

0 に答える 0