Java 需要帮助实施顺路典当捕获和推广
我正在做一个棋盘游戏,能够让我的棋子向前移动一个和两个方块,并阻止它在第一次移动后向前移动两个方块。此外,典当块可以对角抓取,但不执行过路抓取和典当提升。对于典当促销,我需要一个主意,当它的targetRow==0或7时,如何将典当与另一个典当交换。如果有人能为我提供如何实现这两个功能的逻辑或想法,我将不胜感激 这是我的密码:Java 需要帮助实施顺路典当捕获和推广,java,chess,Java,Chess,我正在做一个棋盘游戏,能够让我的棋子向前移动一个和两个方块,并阻止它在第一次移动后向前移动两个方块。此外,典当块可以对角抓取,但不执行过路抓取和典当提升。对于典当促销,我需要一个主意,当它的targetRow==0或7时,如何将典当与另一个典当交换。如果有人能为我提供如何实现这两个功能的逻辑或想法,我将不胜感激 这是我的密码: private boolean isValidPawnMove(int sourceRow, int sourceColumn, int targetRow, i
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,但我指的是骑士。也许应该提示玩家,看看他们想要的是女王还是骑士。重复状态规则只需要保留上次捕获、城堡或典当移动后的状态。