2016-07-15 2 views
0

공을 수신 거부하는 방법을 설명하는 인터넷에서 답변을 찾았지만 일부는 나를 도왔습니다 (반송은 임의가 아니기 때문에). 일부는 매우 어려움 (물리학에 대한 지식이 제한적입니다.).랜덤 수신 공

문제 : 나는 무작위로 움직이지 않고 튀어 오르는 공을 가지고 있습니다. 나는이 공을 무작위로 튀게하고 싶습니다.

는 이미이 코드 조각이 : 그것은 완벽하게 작동

Public Class Ball{ 

    /** Coordinates */ 
    private int x, y; 

    /** Speed of the ball*/ 
    private int speedX, speedY; 

    public Ball(int x, int y, int speedX, int speedY) { 
     this.x = x ; 
     this.y = y ; 
     this.speedX = speedX; 
     this.speedY = speedY; 
    } 

    public void moveAndBounce() { 
     x += speedX ; 
     y += speedY ; 

     // Assuming that touchWallHorizontal() and touchWallHorizontal() work 
     if (touchHorizontalWall()) { 
      speedX = -speedX ; 
     } 
     if (touchVerticalWall()) { 
      speedY = -speedY ; 
     } 
    } 

    public static void main (String [] args){ 
     Ball ball = new Ball(); // Initialisation 
     while (true){ 
      ball.moveAndBounce() ; 
     } 
    } 
} 

을으나, 볼 운동은 항상 (사각형) 동일합니다.

질문 : 공에 속성을 추가하지 않고 무작위로 튀게하는 방법이 있습니까 (좌표 및 속도 만)?

만약 그렇다면이 문제를 해결하기에는 너무 어려운 해결책이 아닙니까?

미리 감사드립니다.

+1

당신이 반송해야합니다 여기 moveAndBounce() 메소드에 대한 새로운 코드 (johnHopkins 덕분에)인가? 그러나 그것은 당신이 얼마나 빨리 진행되는지 신경 쓰지 않는 경우에만 작동합니다. 일정한 속도를 보장해야하지만 임의의 방향이 필요한 경우 임의의 각도를 생성하고 속도를 계산하십시오. – jonhopkins

+0

'setSpeedX (int) Math.random() * 10)'을 시도했습니다. 그러나 볼은 단지 사라지고 튀지 않습니다. 나는 새로운 속도가지도의 "내부"에 머물러 있어야하기 때문에 난수가 작동하지 않을 것이라고 생각한다. 그러나 나는 각도로 일하려고 노력할 것입니다. 당신의 대답에 감사드립니다. –

+1

첫 번째 코멘트에서이 문제를 언급해야합니다. 임의 번호가 작동 할 수 있습니다. 현재 속도가 양수이면 난수를 음수로 만듭니다. 현재 속도가 음수이면 난수를 양수로 만듭니다. 임의의 각도로 동일한 문제가 발생합니다. 벽과의 충돌 여부를 확인하는 방법에 따라 또 다른 문제는 속도가 너무 빠르면 공이 바로 지나갈 것입니다. 공이 박스 밖에 있는지 확인해 볼 수 있습니다. 그렇다면 상자를 상자 안쪽으로 돌려 놓습니다. – jonhopkins

답변

1

문제가 해결되었습니다. 다만 임의의 숫자로`speedX` /`speedY`를 설정하지 왜

public void moveAndBounce() { 
    x += speedX ; 
    y += speedY ; 

    Random random = new Random(); 
    if (touchHorizontalWall()) { 
     if (speedX > 0) { 

      // New speed between 10 and 15 (you can choose other) 
      setSpeedX(-random.nextInt(15) + 10); 
     } else { 
      setSpeedX(random.nextInt(15) + 10 
     } 
    } 
    if (touchVerticalWall()) { 
     if (speedY > 0) { 
      setSpeedY(-random.nextInt(15) + 10); 
     } else { 
      setSpeedY(random.nextInt(15) + 10); 
     } 
    } 
}