我正在开发一个国际象棋游戏,并且能够让我的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;
}
答案 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类,那么您应该在名为firstmove
或numMoves
的类中创建一个字段。这将分别设置为true
或0
,并在第一次移动设置为false
或numMoves++
后。然后,在您的有效性检查器中,您可以说
if p.firstMove
//accept 1 or 2
else
//accept only 1
答案 3 :(得分:0)
我会采用以下两种方式之一: