私はウェブ上でそのような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 は、すべての駒、キング、クイーン、ルーク、ビショップ、ナイト、ポーンの抽象基本クラスですよね? King と Queen が ChessPieceBase を拡張しているようです。
コメントによると、位置は、黒と白の部分のグローバルな現在の位置を記録する必要があります。これは ChessPieceBase の配列リストとして実装されていますが、ChessPieceBase には位置情報メンバーが含まれていないため、位置情報はどこに保存されるのでしょうか?
ChessPieceTurn とは何ですか? それが「私のターン、あなたのターン」の概念である場合、なぜプレーヤークラスの getTurn() func は「Position p」パラメータを必要とし、null を返すのですか?
ゲームマネージャ クラス。「currentPosition」はゲームの全体的な状態を記録します。「acceptTurn()」は何もしていないようです。「processTurn()」はプレイヤーからターンを取得し、審判のように処理します。この最後のものが正しいことを理解してください。
可能であれば、誰かが main() 関数を書いて、それがどのように機能するかを示すことができますか? この時、私はただ混乱しています。
チェスゲームのクラスがどのように見えるべきかについて、あなたからのアイデアは大歓迎です.
ありがとう、