Почему изменения переменных не сохраняются при вызове метода? - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь запрограммировать ошибку для перемещения по массиву, прикрепленному к пользовательскому объекту Room, сохраняя при этом счет того, сколько раз на каждую плитку наступал шаг.

Объект Room работает нормально, так же как и движение и счет. Однако координаты ошибки bugX и bugY возвращаются к 0 после выхода из метода nextMove. Их значения возвращаются только при выходе из метода; даже последняя строка кода в самом методе nextMove использует их новые значения.

Соответствующая часть метода прилагается, но другие разделы могут быть добавлены по запросу.

if (dirNum == 0 && bugY < length-1)         //Move up
    bugY++;
else if (dirNum == 1 && bugX < width-1)     //Move right
    bugX++;
else if (dirNum == 2 && bugY > 0)           //Move down
    bugY--;
else if (dirNum == 3 && bugX > 0)           //Move left
    bugX--;
else {
    System.out.println("Error: Cannot move " + direction + ".");
    canMove = false;
    dirNum = generator.nextInt(4);
    continue;
}

Это контекст самой команды.

while (endSim == false) {
    nextMove(bugX, bugY);
    System.out.print(room.printRoom() + "\n\nNext move? (y/n) ");
    simSentinel = in.next();
    if (simSentinel.charAt(0) == 'n')
        endSim = true;
}

Объявления, где назначены начальные координаты, не находятся внутри каких-либо циклов, не говоря уже о том, где вызывается сама переменная.

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Проблема описана @ T.J.Crowder в его ответе, хотя и применима к Java.

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

Что вы можете сделать, это инкапсулировать координаты в объекте и передать инкапсулирующий объект в качестве параметра. Затем метод получит объект по значению и изменит его состояние (вместо значения объекта).

Для более глубокого понимания см. этот вопрос

РЕДАКТИРОВАТЬ I:

Я немного проясняю код. Хотя в нем отсутствуют объявления room и simSentinel, если вы добавите, что у вас должен быть работающий пример.

public class Bug{
    public int x=0;
    public int y=0; 
}

    public class SimpleSim {

    private int  dirNum = 0;
    private int length = 20;
    private int width = 20;
    private boolean canMove = true;
    private Random generator = new Random();
    private boolean endSim = false;

    public static void main(String [] args) {
        SimpleSim simpleSim = new SimpleSim();
        simpleSim.start();

    }

    private void start() {
        Bug myBug = new Bug();
        // Give the bug some initial x, y values.
        myBug.x = 0;
        myBug.y = 0;

        while (endSim == false) {
            nextMove(myBug);
            System.out.print(room.printRoom() + "\n\nNext move? (y/n) ");
            simSentinel = in.next();
            if (simSentinel.charAt(0) == 'n')
               endSim = true;
            }

        }
    }

    public void nextMove(Bug bug){
        if (dirNum == 0 && bug.y < length-1)         //Move up
           bug.y++;
        else if (dirNum == 1 && bug.x < width-1)     //Move right
           bug.x++;
        else if (dirNum == 2 && bug.y > 0)           //Move down
           bug.y--;
        else if (dirNum == 3 && bug.x > 0)           //Move left
           bug.x--;
        else {
           System.out.println("Error: Cannot move " + "?" + ".");
           canMove = false;
           dirNum = generator.nextInt(4);
        }

     }

}
0 голосов
/ 09 сентября 2018

Похоже, что вы передаете параметры bugX и bugY по значению. В этом случае изменение их значения внутри метода не повлияет на их значения вне метода. Возможно, вы захотите, чтобы ваш метод nextMove возвращал новые значения для bugX и bugY после того, как они были вычислены, чтобы вы могли собрать их обратно в ваши фактические bugX и bugY переменные

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...