需要帮助防止Pawn片在第一次移动后移动两个方块

时间:2014-07-10 19:22:29

标签: java chess

我正在开发一个国际象棋游戏,并且能够让我的Pawn棋子向前移动一个和两个方格,但我很难防止它在第一次移动后向前移动两个方格。如果有人可以帮助我了解如何实施它的逻辑或想法,我将不胜感激。

这是我的代码:

 private boolean isValidPawnMove(int sourceRow, int sourceColumn, int targetRow, int        
 targetColumn) {

    boolean isValid = false;

    if(isTargetLocationFree()){ 
        if(sourceColumn == targetColumn){
            //same column
            if(sourcePiece.getColor() == Piece.YELLOW_COLOR){
                //yellow
                if(sourceRow + 1 == targetRow ){
                    //move one up
                    isValid = true;

                }else if(sourceRow + 2 == targetRow ){
                    isValid = true;
                }else{
                    //not moving one up
                    isValid = false;
                }                               
            }else{
                //brown
                if(sourceRow - 1 == targetRow){
                    //move one down
                    isValid = true;
                }else if(sourceRow - 2 == targetRow){
                    isValid = true;

                }else{
                    //not moving one down
                    isValid = false;
                }                   
            }
        }else{
            //not the same column
            isValid = false;
        }
    }else if(isTargetLocationCaptureable()){
        if(sourceColumn + 1 == targetColumn || sourceColumn - 1 == targetColumn ){
            //one column to the right or left
            if(sourcePiece.getColor() == Piece.YELLOW_COLOR){
                //yellow
                if(sourceRow + 1 == targetRow){
                    //move one up
                    isValid = true;
                }else{
                    //not moving one up
                    isValid = false;
                }
            }else{
                //brown
                if(sourceRow - 1 == targetRow ){
                    //move one down
                    isValid = true;
                }else{
                    //not moving one down                       
                    isValid = false;
                }
            }
        }else{
            //One column to the left or right
            isValid = false;
        }   
    }       
    return isValid;
}

private boolean isTargetLocationCaptureable(){
    if(targetPiece == null){
        return false;
    }else if( targetPiece.getColor() != sourcePiece.getColor()){
        return true;
    }else{
        return false;
    }
}

private boolean isTargetLocationFree(){
    return targetPiece == null;
}

4 个答案:

答案 0 :(得分:5)

我不会为你编写代码,但你的条件应该基于sourceRow。 如果你的源行是pawn开始的原始行(第二行或第七行,具体取决于哪个玩家),那么只有pawn可以移动两行。

答案 1 :(得分:2)

对于黄色片段,只需检查sourceRow是否为1(或2,取决于您对行的编号方式):

    ...
}else if(sourceRow == 1 && targetRow == 3){
    // double-row first move
    isValid = true;
}else{
    ...

为棕色碎片做类似的事情。

答案 2 :(得分:0)

假设您有一个Pawn类,那么您应该在名为firstmovenumMoves的类中创建一个字段。这将分别设置为true0,并在第一次移动设置为falsenumMoves++后。然后,在您的有效性检查器中,您可以说

if p.firstMove
    //accept 1 or 2
else
    //accept only 1

答案 3 :(得分:0)

我会采用以下两种方式之一:

  • 检查pawn是否在它开始的行中。如果是,则允许2空格移动,否则不要。
  • 给每个pawn一个布尔值,如果它没有被移动则为false,如果有,则为true,而不是检查。 (不会推荐这个,因为它似乎并没有让Pawn成为一个对象,因此实现起来非常困难)