2014-11-25 6 views
1

Я в настоящее время разрабатывает шахматную игру в Java с помощью Eclipse IDE,Закрепление Movement логики в Java

У меня есть все движение частей вниз, кроме пешки, которая является самым трудным, потому что Пешка должен быть в состоянии сделать для различных движений

Пешка должен быть в состоянии двигаться в два раза в начале, а затем только один после этого

в настоящее время я поставил пешку двигаться только два раза, но я застрял на получение остаток логики до wo гк

Я работаю с идеей, если/другое заявление

я мог бы использовать некоторую помощь в написании его

Вот код до сих пор для пешки и я включилкомментария для использования

обновления к задаче это только черная пешка не движется вправо, я был в состоянии установить белую правильный путь, но не черный, я не знаю, почему оно не работа

//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; 
    } 

Спасибо за любую помощь вы можете предоставить

ответ

1

Я думаю, что самое простое решение состоит в явном проверять строки исходного и целевого, как белые пешки могут двигаться только два вперед от второго ранга, так что ваша логика становится (для белого):

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

Очевидно, что вы будете также необходимо проверить, что (sourceColumn, 3) также пуст.

+0

Я добавил это, но не было никаких изменений в движении пешки, я что-то упустил? – ClarkPamler93

+0

Началось ли индексирование строк с 0 или 1? Этот код предполагает 1. Вы можете проверить, как мой шахматный движок делает пешку, перемещая генерацию на https://github.com/BarrySW19/CalculonX/tree/master/src/main/java/nl/zoidberg/calculon/engine – BarrySW19

+0

Был в состоянии его исправить, просто нужно было настроить его, чтобы начать с 0, а не 1 спасибо за помощь, только проблема в том, что он не относится к черной пешке? – ClarkPamler93

0

В своем классе для пешек, вы можете иметь экземпляр логическое значение, скажем,

boolean hasMoved 

и изначально делают его ложным. Если это логическое значение ложно, тогда пешка может перемещать один или два блока. Всякий раз, когда вы перемещаете пешку, вы проверяете это логическое значение, и если оно ложно, установите его значение true после его перемещения. Это должно сработать.

+0

Будет ли счетчик более практичным? – MadProgrammer

+0

Не нужно. Это одноразовая вещь, и вам придется использовать логический оператор, если использовать счетчик (который вы увеличиваете только один раз в любом случае). Кроме того, учитывая, что boolean занимает гораздо меньше места, чем числа, логическое значение, безусловно, лучше. – kirbyquerby

+0

Я думал, что это должно будет увеличиваться в два раза, но я не играю в шахматы, так что я знаю - вы все равно отвечаете на правильный трек;) – MadProgrammer

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.

+0

У меня есть вопрос о freesqure, возможно, вы покажете мне, где я бы добавил этот метод в настоящее время, если я попытаюсь добавить его, я получаю две ошибки, а также я получаю проблему с && sourceRow == ROW_2 – ClarkPamler93

+0

Если ROW_2 не отображается, вы можете написать Piece.ROW_2 или просто «1» без кавычек. У вас есть метод isTargetLocationFree(). Возможно, вы можете развернуть его, чтобы вернуться, если данный квадрат свободен и доставить координаты в качестве аргументов. – TheSlater