1

私はJavaを初めて使用し、チェスゲームを実行するためのロジックを構築しようとしています。「Piece」というスーパークラスと、キング、ナイト、クイーンなどのサブクラスがあります。その場でピースのタイプを判別し、そのピースの対応するmoveメソッドを呼び出すmoveメソッドを実装しようとしています。例えば:

int typeOfPiece = _board[startX][startY]._theKind;
Piece myPiece;

switch(typeOfPiece)
{
    case 1:
        myPiece = new Pawn(startX, startY, team);
    case 2: 
        myPiece = new Rook(startX, startY, team);
    case 3:
        myPiece = new Knight(startX, startY, team);
}

boolean myPiece.canMove(endX, endY);

この例では、canMoveメソッドが正しいタイプのピースによって呼び出されるようにする方法はありますか?

ありがとう

4

7 に答える 7

4

ボードが値Pieceの代わりにオブジェクトを保持する場合は、次のintようにすることができます。

Piece piece = _board[x][y];
piece.canMove(...);

Pieceクラスはメソッドを定義し、そのcanMoveすべてのサブクラスは独自のストラテジーを使用して実装します。

于 2013-01-24T13:27:07.657 に答える
3

canMoveすべてのサブクラスでオーバーライドし、親クラスで抽象化しPieceます。

于 2013-01-24T13:26:35.953 に答える
0

をファクトリenumとして使用できます。Pieceそうすれば、 etcが必要になるので、 1 means Pawn, ...etcの必要性を回避できます。あいまいさなしに、呼び出されたものと呼び出されPieces.Pawnたものを引き続き持つことができることに注意してください。enumPawnclassPawn

private abstract static class Piece {
  // Current position.
  protected int x, y;

  // Returns true if this piece could move there.
  abstract boolean canMove ( int x, int y);
}

private static class Pawn extends Piece {
  @Override
  boolean canMove (int toX, int toY) {
    // Not handling en-passant and first-move etc.
    return toX == x && (toY == y + 1 || toY == y + 2);
  }
}
private static class Rook extends Piece {
  @Override
  boolean canMove (int toX, int toY) {
    return toX == x || toY == y;
  }
}

// A Piece factory.
private static enum Pieces {
  Pawn {
    @Override
    Piece make () {
      return new Pawn();
    }
  },
  Rook{
    @Override
    Piece make () {
      return new Rook();
    }
  };

  abstract Piece make();
}

// Make a Piece.
private static Piece makePiece ( Pieces type ) {
  return type.make();
}
于 2013-01-24T13:31:51.287 に答える
0

サブクラスがスーパークラス'Piece'のcanMoveメソッドをオーバーライドする場合、myPiece.canMove(endX、endY)で十分です.myPiece参照が指すオブジェクトタイプに基づいて、実行時にjvmが呼び出すメソッドを決定します。これは呼び出されます。動的メソッドディスパッチ

于 2013-01-24T13:28:04.463 に答える
0

私がすることは、Pieceオブジェクトの動作とプロパティを示す抽象クラスまたはインターフェースを作成することです。

次に、pieceクラスを実装/拡張するクラスがあり、それぞれがcanMoveメソッドを使用して独自の動作を示します。

オブジェクトをインスタンス化してから、コード内でPieceオブジェクトを位置(x、y)に配置し、を呼び出しますcanMove。これにより、動作が適切なサブクラスに委任され、コードがよりクリーンで、保守しやすく、柔軟になります。

オブジェクトの具体的なクラスを持つのではなく、抽象クラスまたはインターフェイスを持つことは、 (私の意見では)各部分にそのような動作を単に継承するのではなく実装するように強制Pieceするため、(私の意見では)利点です。

于 2013-01-24T13:28:36.323 に答える
0

ボードを表すために、intの2d配列の代わりに抽象クラスPieceを実装するEnumを使用することをお勧めします(例)。これを行うことでマジックナンバーを回避できます。

于 2013-01-24T13:36:24.597 に答える
0

あなたがあなたの質問でしたことは、あなたがあなたのプログラムコードによって作品のタイプを決定しているので、実際にはポリモーフィズムを利用していません。

デザインを少し変更することをお勧めします。移動しようとするたびに各ピースに新しいインスタンスを作成するのではなく、すべてのピース(黒と白)の2つのシードを作成します。ボードからピースのインスタンスを直接取得できるように、ボードにピースへの参照を保存させます。

抽象基本クラスから、抽象メソッドcanMove()を実装するPiecederrivePawnsおよびその他の文字

于 2013-01-24T13:37:18.563 に答える