java国际象棋游戏中的多态性

时间:2013-01-24 13:24:30

标签: java polymorphism

我是java的新手,正在尝试构建运行国际象棋游戏的逻辑。我有一个名为'Piece'的超类和王,骑士,女王等的子类。我正在尝试实现一种移动方法,我在那里确定片段的类型,然后调用该片段的相应移动方法。例如:

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方法?

由于

7 个答案:

答案 0 :(得分:4)

如果您的主板会保留Piece个对象而不是int个值,那么您可以这样做:

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

Piece类将定义canMove方法,其所有子类将使用自己的策略实现。

答案 1 :(得分:3)

覆盖所有子类中的canMove,并在父类Piece中将其抽象化。

答案 2 :(得分:0)

如果您的子类覆盖超类'Piece'上的canMove方法,myPiece.canMove(endX,endY)就足够了。基于myPiece引用指向的对象类型,在运行时jvm将决定它应该调用哪个方法。这称为动态方法调度

答案 3 :(得分:0)

我要做的是创建一个表示Piece对象的行为和属性的抽象类或接口。

然后我会有一些类来实现/扩展piece类,每个类用canMove方法表示它们自己的行为。

您实例化对象,然后在代码中,只需将Piece对象驻留在位置(x,y)并调用canMove。这会将行为委托给适当的子类,使您的代码更清晰,更易于维护和灵活。

拥有一个抽象类或接口,而不是具有Piece对象的具体类,(在我看来)是优势,因为它强制每个部分实现这样的行为,而不是简单地继承它。

答案 4 :(得分:0)

您可以将enum用作Piece工厂。这样您就可以避免使用1 means Pawn, ...等,因为您有Pieces.Pawn等。请注意,您仍然可以enum名为Pawnclass名为Pawn {1}}没有含糊之处。

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();
}

答案 5 :(得分:0)

我建议你使用Enum来实现一个抽象类Piece而不是一个2d的int数组来代表董事会Example。你可以通过这样做来避免magic numbers

答案 6 :(得分:0)

您在问题中所做的并不是真正利用多态性,因为您正在通过程序代码决定该片段的类型。

我建议你稍微改变你的设计:每次尝试移动它时,不要为每个部件创建一个新实例,而是创建两个所有部分的部分(黑色和白色)。让棋盘存储对棋子的引用,以便您可以直接从棋盘中检索棋子的实例。

从抽象基类Piece derrive Pawns和其他实现抽象方法的字符canMove()