В настоящее время я разрабатываю шахматную игру в java, используя Eclipse IDE,
У меня есть все перемещение кусочков отдельно от Пешки, что является самым сложным, потому что Пешка должна быть способна совершать разные движения
Пешка должна иметь возможность перемещаться дважды в начале, а затем только один после этого
В настоящее время я заставил пешку двигаться только дважды, но я застрял на том, чтобы заставить остальную логику работать
Я работал с идеей выражения if/else
Я мог бы использовать некоторую помощь, написав его
Вот код до сих пор для Пешки, и я включил комментарий для вашего использования
Обновление до проблемы только с черной пешкой не движется вправо Я был в состоянии установить белый один правильный путь, но не черный Я не знаю, почему он не работает
//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 opponents 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;
}
Спасибо за любую помощь, которую вы можете предоставить
Я думаю, что самым простым решением является явная проверка исходных и целевых строк, поскольку белые пешки могут перемещать только два вперед со второго ранга, поэтому ваша логика становится (для белого):
if( sourceRow+1 == targetRow || sourceRow == 2 && targetRow == 4) {
Очевидно, вам также нужно будет проверить, что (sourceColumn, 3) также пуст.
В шахматах пешка может выбрать, хочет ли она идти на один или два квадрата вперед, если она никогда не двигалась и, следовательно, все еще стоит во втором ряду. Вы должны спросить, есть ли это на второй строке и на двух квадратах перед ней пустые и не только "целевое местоположение".
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.
В вашем классе для пешек вы можете иметь экземпляр boolean, скажем,
boolean hasMoved
и изначально сделать это ложным. Если это логическое значение ложно, тогда пешка может перемещать один или два блока. Всякий раз, когда вы перемещаете пешку, вы проверяете это логическое значение, и если оно ложно, установите его значение true после его перемещения. Это должно сработать.