用Java修复运动逻辑

时间:2014-11-25 22:43:55

标签: java jframe logic chess

我目前正在使用eclipse IDE开发一款国际象棋游戏,

我将所有棋子的所有动作都从Pawn中移开,这是最难的因为 Pawn 必须能够进行不同的动作

Pawn应该能够在开始时移动两次,然后只能移动一次

目前我已将pawn设置为仅移动两次,但我仍然坚持让其余的逻辑工作

我一直在研究if / else语句

的想法

我可以用一些帮助来写它

以下是目前Pawn的代码,我已将 评论包含在您的使用中

更新问题只是黑色棋子没有向右移动我能够以正确的方式设置白色但不是黑色我不知道它为什么不起作用 < / strong>

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

        boolean isValid = false;
        if( isTargetLocationFree() ){
            if( sourceColumn == targetColumn){
                if(  sourcePiece.getColor() == Piece.COLOR_WHITE ){

                    // White Pawn
                    if( sourceRow+1 == targetRow || sourceRow == 1 && targetRow == 3){//Pawns can move to at the start then only 1 after that 
                        isValid = true;
                    }else{
                        isValid = false;
                    }
                }
                else{

                    // Black Pawn
                    if( sourceRow-1 == targetRow || sourceRow == -1 && targetRow == -3){
                        isValid = true;
                    }else{
                        isValid =  false;
                    }
                }
            }else{

                //If you try to move left or right into a different Column 
                isValid = false;

            }

        //Take square occupied by an opponent’s piece, which is diagonally in front 
        }else if( isTargetLocationCaptureable() ){

            if( sourceColumn+1 == targetColumn || sourceColumn-1 == targetColumn){
                //One column to the right or left
                if(  sourcePiece.getColor() == Piece.COLOR_WHITE ){
                    //White Piece 
                    if( sourceRow+1 == targetRow ){
                        //Move one up
                        isValid = true;
                    }else{
                        //Not moving one up
                        isValid = false;
                    }
                }else{
                    //Black Piece
                    if( sourceRow-1 == targetRow ){
                        //Move one down
                        isValid = true;
                    }else{
                        //Not moving one down
                        isValid = false;
                    }
                }
            }else{
                //Not one column to the left or right
                isValid = false;
            }
        }
        return isValid;
    }

感谢您提供的任何帮助

3 个答案:

答案 0 :(得分:1)

我认为最简单的解决方案是明确检查源和目标行,因为白色棋子只能从第二个等级向前移动两个,所以你的逻辑变为(白色):

if( sourceRow+1 == targetRow || sourceRow == 2 && targetRow == 4) {

显然,您还需要检查(sourceColumn,3)是否为空。

答案 1 :(得分:0)

在你的pant类中,你可以有一个实例boolean,比方说,

boolean hasMoved

并且最初使其成为假。如果此布尔值为false,则pawn可以移动一个或两个单位。无论何时移动pawn,都要检查此布尔值,如果它为false,则在移动它后将其设置为true。这应该可以解决。

答案 2 :(得分:0)

在国际象棋中,一个棋子可以选择是否要向前移动一个或两个方格,如果它从未移动过,因此仍然站在第二排。你必须问,如果它在第二行并且它前面的两个方格是空的而不仅仅是“目标位置”。

if( sourcePiece.getColor() == Piece.COLOR_WHITE ){

      // White Pawn
      if( sourceRow+1 == targetRow ){
          isValid = true;
      } else if (sourceRow+2 == targetRow && sourceRow == ROW_2) {
          if ((isFreeSquare(sourceColumn+1) && isFreeSquare(sourceColumn+2)) {
             isValid = true;
          } else {
              isValid = false;
          }
      } else {
          isValid = false;
      }
  }
  else{

      // Black Pawn
      ...
  }

您可以保留isFreeSquare(sourceColumn + 2)代码,因为您已经使用isTargetLocationFree()询问了它。对于黑色,您必须询问该棋子是否仍在ROW_7上。