2009-12-07 7 views
0

새내기 질문입니다. 이 코드를 실행하면 윈도우의 하단에 도달하면, 직사각형 ufoship이 멈추지 않습니다while 문에서 부울 변수 사용

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

hasNotLost = ufo_ship.getY() < 200; < - 변수에 표현식을 할당하지 않고 해당 표현식이 계산되는 값이므로 당연히 한 번만 계산됩니다. 당신은 방금 전화를 할 수 있도록

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

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

UFO가 자신의 클래스와 그 방법을 수있는 다른 방법으로 추출 할 수있는 동안 (ufoShip.hasNotLost())

당신이 할 수있는 여러 가지 방법이 있습니다
+0

+1 질문자가 표현식을 변수에 할당 할 수도 있다는 것을 직관적으로 설명하기 위해 + 정확히 내가하고 있다고 생각하는 것입니다. –

+0

조건을 함수에 인수 분해하면 중복을 제거하고 조건과 정확히 일치하는 변수와 동일한 목적을 수행합니다. –

+1

답변 해 주셔서 감사합니다. 새 메서드 만들기 hasNotLost는 프로그램을 종료하는 조건을 추가하고 싶기 때문에 최상의 솔루션입니다. –

1

, 당신이 당신의 질문에 강조 어느 하나

while(ufo_ship.getY() < 200) 

당신은 할 수 :

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

또는 move_ufo()에 참조로 hasNotLost를 전달하고 move_ufo()의 끝에서 검사를 수행하거나 move_ufo에 검사를 통합하여 false를 반환 할 수도 있으므로 간단히 말할 수 있습니다.

while(move_ufo()) {} 
1
while(hasNotLost){ 
    move_ufo(); //moves ufo_ship 
    hasNotLost = ufo_ship.getY() < 200; //checks if ufo_ship is 
             //above the bottom edge of window 
} 
0

아니요, 예제 코드에서는 hasNotLost를 한 번 평가하고 while 문에서이 값을 사용합니다. 항상 (초기 평가로) 적절한 솔루션이 실제로

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

입니다

사실 또는 추출 방법에 위치를하는 방법을 추출 무언가를

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

추천하고 평가합니다.