Исправление логики движения в Java

1

В настоящее время я разрабатываю шахматную игру в 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;
    }

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

Теги:
logic
jframe
chess

3 ответа

1
Лучший ответ

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

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

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

  • 0
    Я добавил это, но в пешечном движении ничего не изменилось, я что-то упустил?
  • 0
    Индексирование строк начинается с 0 или 1? Этот код предполагает 1. Вы можете проверить, как мой шахматный движок выполняет генерацию пешек на github.com/BarrySW19/CalculonX/tree/master/src/main/java/nl/…
Показать ещё 2 комментария
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
    У меня есть вопрос о свободном доступе. Можете ли вы показать мне, где я мог бы добавить этот метод в настоящее время, если я пытаюсь добавить его, я получаю две ошибки, а также у меня проблема с && sourceRow == ROW_2
  • 0
    Если ROW_2 не отображается, вы можете написать Piece.ROW_2 или просто «1» без кавычек. У вас есть метод isTargetLocationFree (). Может быть, вы можете расширить его, чтобы вернуть, если данный квадрат свободен, и передать координаты в качестве аргументов.
0

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

boolean hasMoved

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

  • 0
    Будет ли счетчик более практичным?
  • 0
    Нет нужды. Это одноразовая вещь, и вам придется использовать логическое выражение, если в любом случае вы используете счетчик (который вы все равно увеличиваете только один раз). Кроме того, учитывая, что логические значения занимают гораздо меньше места, чем числа, логические значения определенно лучше.
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню