2012-10-29 3 views
7

질문이 명확하지 않은 경우 죄송하지만 다른 방법으로 생각할 수는 없습니다.Java 콜렉션을 반복하면서이 볼들이 튀어 오를 때 어떤 힌트가 필요합니까?

이것은 주말 내내 BlueJ에서 작업 한 수업 과제입니다. 나는 방법 (바운스)을 변경하여 사용자가 얼마나 많은 볼이 튀는 지 선택하도록해야합니다.

다른 요구 사항은 다음과 같습니다. 볼의 크기가 달라야하며 화면이 튀어 나오기 전에 화면 맨 위에 연속으로 표시되어야합니다.

이렇게하려면 컬렉션 (ArrayList, HashMap, HashSet)을 사용해야합니다. 지금까지 HashMap을 사용하여 사용자가 화면 상단의 임의의 위치에 임의의 크기의 "공"을 여러 개 선택할 수있게했습니다.

각 공이 화면 상단의 위치에서 튀어 오르게하려고 할 때 오른쪽에서 끝나서 붙어 있습니다. 코드를 하나의 공을 그릴 수 있고, 그 다음 다른 공을 그립니다. 사용자가 선택한 개수의 공이 반복 될 때까지 바운스합니다.

두 가지 다른 클래스가 있습니다. 하나는 캔버스를 그리는 클래스이고 다른 하나는 볼을 그리고 이동시키는 클래스입니다. 둘 다 나는 만질 수 없다.

나는 잘못된 길을 가고 있습니다. 아마도 제 앞에있을 것입니다.하지만 나는이 코드를 쳐다 보면서 오랫동안 물어볼 것이라고 생각했습니다.

코드의 나의 현재 버전은 다음과 같습니다

import java.awt.Color; 
import java.util.HashMap; 
import java.util.Random; 
import java.util.Iterator; 

public class BallDemo 
{ 
    private Canvas myCanvas; 

    private HashMap<Integer, BouncingBall> ballMap; 

    private int n; 

    private int j; 

    private BouncingBall ball; 

    /** 
    * Create a BallDemo object. Creates a fresh canvas and makes it visible. 
    */ 
    public BallDemo() 
    { 
     myCanvas = new Canvas("Ball Demo", 600, 500); 
    } 

내가 볼 반송 편집 할 수있는 방법

public void bounce(int numBalls) 
    { 
     ballMap = new HashMap<Integer, BouncingBall>(); 
     int ground = 400; // position of the ground line 
     Random randomD1 = new Random(); 
     Random xpos = new Random(); 


     myCanvas.setVisible(true); 

     // draw the ground 
     myCanvas.drawLine(50, ground, 550, ground); 

     // add balls to HashMap 
      for(n = 0; n < numBalls; n++) { 
     ballMap.put(numBalls, (ball = new BouncingBall(xpos.nextInt(300), 50, randomD1.nextInt(200), Color.BLUE, ground, myCanvas))); 
     // 
      for(j= 0; j < ballMap.size(); j++) { 
       ball.draw(); 
       boolean finished = false; 
        while(!finished) { 
        myCanvas.wait(50);   // small delay 
        ball.move(); // bounce the ball 

         // stop once ball has travelled a certain distance on x axis 
          if(ball.getXPosition() >= 550) { 
            finished = true; 
           } 



         } 
      } 






     } 
     } 
} 

심지어는 HashMap을 사용하여 올바른 라인 I 오전 ? 키, 값의 조합이 가장 좋은 방법이었습니다. move() 메서드를 사용하여 바운스되도록 컬렉션에있는 항목을 반복해야한다고 생각합니다. 하지만 먼저 사용자가 정의한 것과 관계없이 화면 상단에 연속으로 머물러 있어야합니다.

저는 프로그래밍에 익숙하지 않고 난처하게 될 것입니다.

도움 주셔서 감사합니다. 16dots @

답변

3

numBalls가 변경되지 않는 한 ballMap.put(numBalls, ball);이 끝난

키는 고유해야 ..., 해시 맵마다 같은 값을 기록합니다 제외하고, 부분적으로 권리입니다.

읽어야 ...

for (int n; n < numBalls; n++) { 
    BouncingBall ball = new BouncingBall(xpos.nextInt(300), 50, 
      randomD1. 
      nextInt(200), Color.BLUE, ground, myCanvas); 
    ballMap.put(n, ball); 
} 

boolean finished = false; 
while (!finished) { 
    finished = true; 
    for (int j = 0; j < ballMap.size(); j++) { 
     BouncingBall selectedBall = ballMap.get(j); 
     selectedBall.draw(); 
     // Only move the ball if it hasn't finished... 
     if (selectedBall.getXPosition() < 550) { 
      selectedBall.move(); // bounce the ball 

      // stop once ball has travelled a certain distance on x axis 
      if (selectedBall.getXPosition() < 550) { 
       finished = false; 
      } 
     } 
    } 
    myCanvas.wait(50);   // small delay 
} 
+1

사실은 그의 질문에 만들어진 삭제 된 코멘트에서 변경,하지만, 좋은 캐치를 응답 할 때 어떻게 든 통과 떨어졌다. – 16dots

+0

답장을 보내 주셔서 감사합니다. 귀하의 반응은 제가 루프를 청소하는 데 도움이되었습니다, 저것 감사합니다! 그러나 코드는 이전과 마찬가지로 한 번에 하나의 공을 그립니다. 내가 무엇을 해야하는지에 대한 나의 이해는 사용자 정의 된 수의 볼을 그려서 한 행에 표시 한 다음 마지막 하나가 .getXposition finished = true에 도달 할 때까지 하나씩 바운스되도록하는 것입니다. 내가 할 수있는 능력은 내가 고민하고있다. 그것이 불분명하거나 내가 놓친다면 미안해! – daveyboy

+0

@ 16dots, 만약 당신이 새로운 수정 된 답변을 올리면 나는 그것을 훔친 당신의 생각 이었기 때문에 업보 트에 기뻐할 것입니다. – MadProgrammer