Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要帮助实施顺路典当捕获和推广_Java_Chess - Fatal编程技术网

Java 需要帮助实施顺路典当捕获和推广

Java 需要帮助实施顺路典当捕获和推广,java,chess,Java,Chess,我正在做一个棋盘游戏,能够让我的棋子向前移动一个和两个方块,并阻止它在第一次移动后向前移动两个方块。此外,典当块可以对角抓取,但不执行过路抓取和典当提升。对于典当促销,我需要一个主意,当它的targetRow==0或7时,如何将典当与另一个典当交换。如果有人能为我提供如何实现这两个功能的逻辑或想法,我将不胜感激 这是我的密码: private boolean isValidPawnMove(int sourceRow, int sourceColumn, int targetRow, i

我正在做一个棋盘游戏,能够让我的棋子向前移动一个和两个方块,并阻止它在第一次移动后向前移动两个方块。此外,典当块可以对角抓取,但不执行过路抓取和典当提升。对于典当促销,我需要一个主意,当它的targetRow==0或7时,如何将典当与另一个典当交换。如果有人能为我提供如何实现这两个功能的逻辑或想法,我将不胜感激

这是我的密码:

    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 == 1 && targetRow == 3){
                    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 == 6 && targetRow == 4){
                    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;
}

移动到最后/第一行仍然需要是有效的移动,因此我将在“returnisvalid;”之前处理这部分。这样您就可以使用isValid布尔值

if(isValid && sourcePiece.getColor()==Piece.YELLOW_COLOR && targetRow==0){
//change targetRow,targetColumn to a queen or Piece.Type = "Queen" or however you have it setup
}

我认为在国际象棋规则中,你不需要用一个捕获的棋子来“交换”棋子。董事会上可以有两个皇后。另一个玩家可能想要的(罕见的)是一辆车。我不认为选择球员值得你花时间

捕获“顺路”有点棘手,你必须跟踪对手之前的移动,如果且仅当对手的棋子只移动了2格,现在有列=你的棋子列+或-1,行=你的棋子行,那么移动到对手行列和行+1(黑色为-1)是允许的,它将捕获对手的棋子。你不需要检查目标方块是否为空,因为对手的棋子只移动了2个方块,它是空的。

升级很简单,如果新行为0或7,则典当必须成为一个棋子,您只需要一个用户界面供玩家选择,但您的算法已将这些Nove作为有效的返回。

对于您现有的代码,这样读起来可能会容易一些:

private boolean isValidPawnMove(int sourceRow, int sourceColumn, 
                                int targetRow, int targetColumn) {
    int startRow;
    int direction;
    if (sourcePiece.getColor() == Piece.YELLOW_COLOR) {
      startRow = 1;
      directon = 1;
    } else {
      startRow = 6;
      directon = -1;
    }
    if (isTargetLocationFree() && sourceColumn == targetColumn) {
      return (targetRow == sourceRow + direction) ||
             (sourceRow == startRow && targetRow == startRow + 2 * direction);
    }
    if (isTargetLocationCaptureable()) {
      return ((targetColumn == sourceColumn + 1 || targetColumn == sourceColumn - 1 ))
              && (targetRow == sourceRow + direction);
    }
    return false;
}


注意:我假设所有的输入变量都已经有效,并且您没有像targetColumn=-1这样的角点情况。

有许多国际象棋棋棋步,其验证要求比当前棋盘状态更多。在您的情况下,我没有看到验证以下操作所需的其他信息

  • 铸造:需要有车和王的历史记录。可以通过hasMovedBefore标志完成
  • 顺便说一句:知道最后的行动。可以通过保留lastMove数据结构或保留以前的板状态来适应
  • 五十步规则:需要记录最后一次捕获或典当移动的时间。可通过lastPawnMoveOrCapture计数器完成
  • 三重重复:需要自上一个城堡、典当移动或捕获以来的所有先前棋盘状态。可以选择以前状态的哈希列表。(谢谢你)

我对安泊桑捕获的建议:

  • 当一个棋子向前移动两行时,让它分成两个棋子。移动两行且颜色规则(黄色或棕色)的“真”兵和仅移动一行且颜色不同(浅黄色或浅棕色)的“鬼”兵

  • 黄色玩家移动后,清除棋盘上所有浅棕色的棋子(棕色玩家移动后,对浅黄色的棋子也一样)

  • 在isTargetLocationFree()中,忽略浅黄色和浅棕色的棋子

  • 在isTargetLocationCaptureable()中,如果目标棋子为黄色棋子,则如果目标位置的棋子为棕色或浅棕色,则返回true。否则,仅当目标位置的工件为棕色时才返回true。对棕色零件进行类似检查

  • 最后,如果棋子捕获了一个“幽灵”棋子,请确保从棋盘上移除相应的“真实”棋子


在没有任何参数的情况下,
isTargetLocationFree
isTargetLocationCaptureable
如何工作?另外,如果你捕获了被捕获的片段,我看不出上面的代码对它有什么作用——它不应该做些什么来让这段片段从黑板上消失吗?@ajb,我已经用isTargetLocationFree和isTargetLocationCaptureable方法更新了我的代码。直到我刚才在谷歌上搜索到这条规则,我才听说过
enpassant捕获规则+为了教我一些新东西:)真的,无论如何都不总是用:)哎呀,这段代码很混乱。看起来在调用此方法之前,您已经将
targetPiece
设置为“源代码片段”移动到的位置的片段。这还不够好,因为对于“顺道而行”,你需要知道哪一块在离你要移动的地方一平方米的地方。我将去掉
targetPiece
,并定义一个函数
pieceAt(行、列)
来返回一个片段。另外,“顺路”只有在另一块棋子是一个刚刚向上移动了两个方块的棋子时才合法,所以你需要一种方法来确定是否是这样。看。谢谢!我写了rook,但我指的是骑士。也许应该提示玩家,看看他们想要的是女王还是骑士。重复状态规则只需要保留上次捕获、城堡或典当移动后的状态。