Использование логической переменной в операторе while - PullRequest
0 голосов
/ 07 декабря 2009

Вопрос новичка. У меня есть следующий фрагмент кода Java:

 import acm.program.*;
 import java.awt.Color;
 import acm.graphics.*;

 public class ufo extends GraphicsProgram{

    private GRect ufo_ship;
    boolean hasNotLost;
    public void run (){
        setup(); //places ufo_ship to initial position
        hasNotLost = ufo_ship.getY() < 200; //checks if ufo_ship is 
                                        //above the bottom edge of window
        while(hasNotLost){
            move_ufo(); //moves ufo_ship
        }
        showMessage(); //shows that program ended
    }
//remaining methods are here
}

Когда я запускаю этот код, прямоугольник ufoship не останавливается, когда достигает нижней части окна. Я предполагаю, что это потому, что он проверяет положение уфосипа только один раз, а не каждый раз, когда прямоугольник движется.

Есть ли способ исправить это, не написав просто while(ufo_ship.getY() < 200)?

Ответы [ 4 ]

4 голосов
/ 07 декабря 2009

hasNotLost = ufo_ship.getY() < 200; <- Не присваивает выражение переменной, но значение, для которого вычисляется это выражение, поэтому оно, конечно, вычисляется только один раз. Вы можете извлечь его другим методом </p>

boolean hasNotLost(GRect ufo_ship){ return ufo_ship.getY() < 200; }

while(hasNotLost(ufo_ship))
{
  ...
}

НЛО может иметь собственный класс и этот метод, так что вы просто вызовите while (ufoShip.hasNotLost ())

1 голос
/ 07 декабря 2009
while(hasNotLost){
    move_ufo(); //moves ufo_ship
    hasNotLost = ufo_ship.getY() < 200; //checks if ufo_ship is 
                                        //above the bottom edge of window
}
1 голос
/ 07 декабря 2009

Есть несколько способов сделать это, один из которых вы подчеркнули в своем вопросе:

while(ufo_ship.getY() < 200)

Вы также можете сделать:

while(hasNotLost) { move_ufo(); hasNotLost = ufo_ship.getY() < 200; }

Или может передать hasNotLost по ссылке в move_ufo () и выполнить проверку в конце move_ufo (), или вы можете даже интегрировать проверку в move_ufo и вернуть из нее false, так что вы можете просто сказать:

while(move_ufo()) {}
0 голосов
/ 07 декабря 2009

Нет, в вашем примере кода вы оцениваете hasNotLost один раз и используете это (теперь статическое) значение в операторе while. Это всегда будет правдой (как оценить изначально)

Правильное решение действительно

while(ufo_ship.getY() < 200) {
  move_ufi();
}

или извлеките метод и сделайте что-то вроде

while(ufoStillOnScreen(ufo)) {
  move_ufi();
}

и оцените позицию в этом извлеченном методе.

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