3

理解しようとしている質問がありますが、行き詰まっています。基本的に、チェスではないゲームでルークの動きのロジックを実装しようとしていますが、行き詰まっています。詳細をお伝えします:

  • ボードは 5x5 の多次元配列で、各プレイヤーにはポーンとルークしかありません
  • 目標は、対戦相手のすべてのピースをキャプチャすることであり、それらをすべてキャプチャしたものがゲームに勝ちます。
  • ルークは、道を塞いでいる何かにぶつかるまで、一方向に好きなだけ移動できます。

私のルークが現在行っていることは、一方向に進むことができますが、その行のどこにでも行くことができるということです. ロジックを追加して、パスが明確な場合にのみ実行できるようにする方法を見つけようとするのに助けが必要です。次に例を示します。

小さい「p」と「r」はプレイヤー2の駒で、大きい「P」と「R」はプレイヤー1の駒です。右上のR(ルーク)は今は右にしか動けませんが、そうするとポーンを超えて下に好きなだけ飛べるようになります。

* R R R *
* P P P *
* * * * *
* p p p *
* r r r *

ルーク用に私が持っているもののコードは次のとおりです。

public boolean isLegalMove(Location from,Location to)
{
  // Row is XPosition (Up/Down)
  // Column is YPosition(Left/Right)

  int fromRow = from.getXPosition();
  int fromColumn = from.getYPosition();
  int toRow = to.getXPosition();
  int toColumn = to.getYPosition();

  // higher row or column or both
  if(((fromColumn >= toColumn) || (fromColumn <= toColumn)) && ((fromRow == toRow))) {
    return true;
  }
  if(((fromRow >= toRow) || (fromRow <= toRow)) && ((fromColumn == toColumn))) {
    return true;
  }
  return false; 
}

パスに何かがあるかどうかをロジックをチェックする別のメソッドを作成して、それを呼び出すつもりだと思いますisPathClear()

編集:
コードの残りの部分は次のとおりです。

 public class Board
  {
    // The depth and width of the field.
    public static final int ROW = 5;
    public static final int COLUMN = 5;
    public static final String EMPTYPIECE = " * ";

     //Storage for the game pieces
     private GamePiece [] [] gameBoard;
     //Makes the balls and torches for player1
     private Pawn1 p1Pawn1,p1Pawn2,p1Pawn3;
     private Rook1 p1Rook1,p1Rook2,p1Rook3;

     //Makes the ball and torchers for player2
     private Pawn2 p2Pawn1,p2Pawn2,p2Pawn3;
     private Rook2 p2Rook1,p2Rook2,p1Rook3;

/**
 * Makes a 5x5 Gameboard
 */
public Board()
{
    // initialise instance variables
    gameBoard = new GamePiece [ROW][COLUMN];

    //Makes pieces for player1
    p1Pawn1 = new Pawn1();
    p1Pawn2 = new Pawn1();
    p1Pawn3 = new Pawn1();
    p1Rook1 = new Rook1();
    p1Rook2 = new Rook1();
    p1Rook3 = new Rook1();

    //Makes pieces for player2
    p2Pawn1 = new Pawn2();
    p2Pawn2 = new Pawn2();
    p2Pawn3 = new Pawn2();
    p2Rook1 = new Rook2();
    p2Rook2 = new Rook2();
    p2Rook3 = new Rook2();
}

/**
 * Makes new games
 */
public void newGame()
{  
    // Assigns the piece of the board for player1
    gameBoard[0][1] = p1Rook1;
    gameBoard[0][2] = p1Rook2;
    gameBoard[0][3] = p1Rook3;
    gameBoard[1][1] = p1Pawn1;
    gameBoard[1][2] = p1Pawn2;
    gameBoard[1][3] = p1Pawn3;

    // Assigns the pieces of the board for player2
    gameBoard[4][1] = p2Rook1;
    gameBoard[4][2] = p2Rook2;
    gameBoard[4][3] = p2Rook3;
    gameBoard[3][1] = p2Pawn1;
    gameBoard[3][2] = p2Pawn2;
    gameBoard[3][3] = p2Pawn3;
}

/**
 * Displays the content of the board
 */
public void displayBoard()
{
    System.out.println("  a  b  c  d  e");
    int counter = 1;
    for (int i = 0; i < gameBoard.length; i++){
       System.out.print(counter);
       for (int j = 0; j < gameBoard[i].length; j++) {
           if (gameBoard[i][j] == null) {
              System.out.print(EMPTYPIECE);
           } else {
               System.out.print(" " + gameBoard[i][j] + " ");
           }
       }
       counter++;
       System.out.println();
    }
}

/**
 * Moves the movepiece from one locatin to another
 * @param from - where the location was from
 * @param to - Where the location is going to
 */
public void movePiece(Location from,Location to) throws InvalidMoveException
{
    int fromRow     = from.getXPosition();
    int fromColumn  = from.getYPosition();
    int toRow       = to.getXPosition();
    int toColumn    = to.getYPosition();

    if (gameBoard[fromRow][fromColumn] == null) {
        throw new InvalidMoveException("Invalid input for source location.");
    }
    if (! checkBounds(from, to)) {
        throw new InvalidMoveException("Invalid input for destination location.");
    }
    if (isSameLocation(from, to)){
        throw new InvalidMoveException("Invalid move, source and destination cannot    bethe same.");
    }
    if (! gameBoard[fromRow][fromColumn].isLegalMove(from, to)) {
        throw new InvalidMoveException("Invalid move for this piece.");
    }
       gameBoard[toRow][toColumn] = gameBoard[fromRow][fromColumn];
       gameBoard[fromRow][fromColumn] = null;

   displayBoard();
}

/**
 * Checks a proposed move to ensure it is within the bounds of the board.
 * @param source location, destination location
 * @return true if both source and destination are within bounds
 */
private boolean checkBounds(Location from, Location to)
{
    int fromRow     = from.getXPosition();
    int fromColumn  = from.getYPosition();
    int toRow       = to.getXPosition();
    int toColumn    = to.getYPosition();

    boolean testFrom = (fromRow >= 0) && (fromColumn >= 0) && (fromRow < gameBoard.length) && (fromColumn < gameBoard[0].length);
    boolean testTo = (toRow >= 0) && (toColumn >= 0) && (toRow < gameBoard.length) && (toColumn < gameBoard[0].length);
    return testFrom && testTo;
}

/**
 * Checks a proposed move to ensure source and destination are different.
 * @param source location, destination location
 * @return true if source and destination are the same
 */
private boolean isSameLocation(Location from, Location to)
{
    int fromRow     = from.getXPosition();
    int fromColumn  = from.getYPosition();
    int toRow       = to.getXPosition();
    int toColumn    = to.getYPosition();
    return fromRow == toRow && fromColumn == toColumn;
}
4

1 に答える 1

4

ボード上に他に何があるかを知らずに、パスが明確かどうかを知ることはできません。ただし、メソッド シグネチャは、この関数にボードのレイアウトへのアクセスを許可しません。ボード全体をパスすると、ループを使用して間にあるすべてのマスをチェックして他のピースを探すことができます。


トーガマス卿 より:

ボードが null かどうかを確認することはありません。ルークのソースと宛先の場所の間の個々のスペースを確認する必要があります。


ボードがどのように見えるかがわかったので、次のコードを示します。

public boolean isLegalMove(Location from,Location to)
{
  // Row is XPosition (Up/Down)
  // Column is YPosition(Left/Right)

  int fromRow = from.getXPosition();
  int fromColumn = from.getYPosition();
  int toRow = to.getXPosition();
  int toColumn = to.getYPosition();

  // Has to be same row or column
  if(fromRow != toRow || fromColumn != toColumn) return false;
  // Can't move to the same square
  if(fromRow == toRow && fromColumn == toColumn) return false;

  // Rows are the same
  if(fromRow - toRow == 0) {
    // this will hold the column of the we're going to check next
    int newPos = fromColumn;
    // Should we go up or down?
    int amount = (toColumn - fromColumn < 0) ? -1 : 1;
    while(newPos != toColumn) {
      newPos += amount;
      // if it's not null, we found a different piece
      if(gameBoard[fromRow][newPos] != null) return false;
    }
    if(gameBoard[toRow][toColumn] != null) {
      // return false if it's your own piece, true if it's not
    }
  // Columns are the same
  } else {
    // this will hold the row of the we're going to check next
    int newPos = fromRow;
    // Should we go up or down?
    int amount = (toRow - fromRow < 0) ? -1 : 1;
    while(newPos != toRow) {
      newPos += amount;
      // if it's not null, we found a different piece
      if(gameBoard[newPos][fromColumn] != null) return false;
    }
    if(gameBoard[toRow][toColumn] != null) {
      // return false if it's your own piece, true if it's not
    }
  }

  return true;
}

対戦相手の駒をキャプチャできるようにしたい場合のために編集されました...しかし、メソッド署名を再度変更する必要があるため、最後のコードを入れませんでした. 私のコメントを探してください。whileではなくループになっていることにも注意してくださいdo-while

于 2012-12-05T18:07:43.730 に答える