2011-12-14 4 views
1

그래서이 프로그램 할당에 대한 머리를 깨고 어떻게 끝내야할지 모르겠다. 나는 이미 그것의 80 %를 완료했으나 마지막 부분은 일반적인 생각조차도 모른다. 문제는추상 수퍼 클래스를 사용하여 임의의 하위 클래스 생성

"그런 방법 무작위 임의의 위치에 승용차와 트럭을 구성하기위한 동일한 확률로, Vehicle 참조를 생성 randomVehicle 물품. 10 번을 호출하고 그들 모두를 그립니다."입니다

나는 주된 방법 인 Abstract Superclass Vehicle과 Car와 Truck의 두 개의 서브 클래스를 가지고있다. 루프를 사용하여 확률을 계산하는 방법을 알고 있지만 그 확률 해답을 취하는 방법을 모릅니다 (1은 트럭, 2는 차가 될 것입니다). 그리고 자동차와 트럭의 미리 정의 된 모양을 참조하는 데 사용합니다.

다른 말로하면 컴파일하고 실행 한 후 무작위로 결정한 자동차와 트럭을 만들고 표시하는 프로그램을 어떻게 만들 수 있습니까?

질문이 혼란 스럽다면 미안하지만 나는 추상적 인 수업을 배우고 있습니다. 여기

는 지금까지 코드 :

홈페이지 방법

import java.awt.*; 
@SuppressWarnings("serial") 
class drawTest extends Canvas{ 
public drawTest(){ 
    setSize(800, 600); 
    setBackground(Color.white); 
} 
public static void main(String[] argS){ 
    drawTest canvas = new drawTest(); 
    Frame aFrame = new Frame(); 
    aFrame.setSize(800, 600); 
    aFrame.add(canvas); 
    aFrame.setVisible(true); 
} 
public void paint(Graphics canvas){ 
    Vehicle car = new CarTest(); 
    car.paint(canvas); 
    paint(canvas); 

} 
} 

CarTest 클래스

import java.awt.*; 
@SuppressWarnings("serial") 
public class CarTest extends Vehicle{ 

public void paint(Graphics canvas){ 
    canvas.drawOval(10+super.x, 30+super.y, 15, 15); // Front Wheel 
    canvas.drawOval(45+super.x, 30+super.y, 15, 15); // Back Wheel 
    canvas.drawRect(5+super.x, 10+super.y, 60, 20);  // Bottom of Car 
    canvas.drawRect(15+super.x, 5+super.y, 40, 5);  // Bottom of Car 
} 
} 

TructTest 클래스

import java.awt.*; 
@SuppressWarnings("serial") 
public class TruckTest extends Vehicle{ 

public void paint(Graphics canvas){ 
    canvas.drawRect(30+super.x, 5+super.y, 100, 30); // Cargo Section 
    canvas.drawOval(30+super.x, 35+super.y, 15, 15); // Wheel Under Cargo 
    canvas.drawOval(45+super.x, 35+super.y, 15, 15); // Wheel Under Cargo 
    canvas.drawOval(100+super.x, 35+super.y, 15, 15); // Wheel Under Cargo 
    canvas.drawOval(115+super.x, 35+super.y, 15, 15); // Wheel Under Cargo 
    canvas.drawRect(5+super.x, 15+super.y, 20, 20);  // Driver Section 
    canvas.drawOval(5+super.x, 35+super.y, 15, 15);  // Wheel Under Driver 
} 
} 

Ab의 트랙트 Vehicle 클래스 얻을

import javax.swing.*; 
import java.awt.*; 
@SuppressWarnings("serial") 
public abstract class Vehicle extends JApplet{ 

public Vehicle(){ 
     // Generates Random position 
    x = (int)(Math.random()*700); 
    y = (int)(Math.random()*550); 
} 
public abstract void paint(Graphics canvas); 

public void randomVehicle(){ 
    int carTruckChoice = (int)(1+Math.random()*2); 
     if (carTruckChoice == 1){ 
      // don't know if this is the right implementation 
     } 
     else if (carTruckChoice == 2){ 
      // don't know if this is the right implementation 

     } 
} 
public int x; 
public int y; 
} 
+0

어떤 부분에 문제가 있습니까? 난수 생성? 또는 조건에 따라 클래스 a 또는 클래스 b의 인스턴스를 만들 수 있습니까? – Thilo

+0

나는 난수를 만드는 법을 안다. 자동차와 트럭이 어떻게 기본 모양을 사용하여 보일 것인가에 대한 시각을 만들었고, 자동차 나 트럭을 만드는 방법을 알고있다. 어떻게 해야할지 아는 것은 구체적인 하위 클래스이고 추상적 인 하위 클래스 인 자동차 또는 트럭의 임의 인스턴스 10 개를 만드는 메서드를 만드는 것입니다. – DOHtero

+0

코드로 업데이트되었습니다. 잘하면 문제는 더 의미가있을 것입니다 – DOHtero

답변

2

의사 코드는 시작 :

randomVehicle = 
    randomPosition = randomPosition() 
    randomNumber = randomOneOrTwo() 

    if (randomNumber is 1) 
     vehicle = new Car() 
    else 
     vehicle = new Truck() 

    vehicle.setPosition(randomPosition) 
    return vehicle 

for 1..10 
    randomVehicle().draw() 

당신은 추상 클래스 차량이있을 것이다, 2 개 개의 구상 서브 클래스 자동차 및 트럭.

+0

Thilo, 당신은 내 비슷한 문제를 해결했습니다. 나는 지금 너에게 키스하고 싶다. 그러나 나는 게이 녀석으로 나오기를 원하지 않는다. – leonidus

2

일반적으로 StackOverflow는 숙제 문제를 수락하지 않지만 기본적으로 숙제이므로 여기에서 예외를 만들겠습니다.

가 설명
public static Vehicle randomVehicle(){ 
    return (Math.random() < .5) ? new CarTest() : new TruckTest(); 
} 

: 그것은

Math.random()

발현 0 내지 1 괄호 테스트의 개수를 생성 경우 여기

한 임의의 차량을 생성하는 방법 절반 이하; 즉, truefalse 사이에서 무작위로 선택합니다.

물음표는 Java ternary operator입니다. 괄호 안의 표현식이 true을 반환하면 vehicle은 첫 번째 피연산자, 즉 Car()의 새 인스턴스로 초기화되고 false의 경우 반대가됩니다.

+1

하하, 이것은 나의 것보다 훨씬 더 우아하다. Bravo – LuxuryMode

+0

고맙습니다. 이것에 익숙하지 않고 숙제 규칙을 알지 못합니다. 다행히 다시는 일어나지 않을 것입니다. 당신이 언급 한 단계 나는 이미 고맙게하는 방법을 알고 있습니다. 차 또는 테스트 중 하나에 정의 된 새 객체가 있지만 그릴 방법을 모르거나 표시합니다. vehicle.paint (캔버스); 자동차와 트럭 모두에서 이미지를 표시하는 기본값은 – DOHtero

+0

입니다. 죄송합니다. 단지 "이 과제를 기쁘게하십시오"게시물을 싫어하는 것입니다. 당신은 괜찮습니다 - 당신은 분명히 그것을 시도했습니다, 그리고 당신은 이제 코드와 함께 특정 질문을 게시했습니다. –

2
public void randomVehicle() { 
    Random random = new Random(); 
    Vehicle vehicle; 
    for(int i = 0; i<10; i++) { 
    int randomChoice = random.nextInt(2); 
    if(randomChoice == 1){ 
     vehicle = new Car(); 
    } else { 
     vehicle = new Truck(); 
    } 
//draw vehicle here .. vehicle.draw(); 
    } 
} 
+0

글쎄, 나는 이것과 비슷한 것을 시도해 봤지만 궁극적으로 코드가 "vehicle.paint (canvas)"이기 때문에 무작위로 생성 된 것을 실제로 그리는 방법을 모른다. 캔버스가 정의되지 않았다는 말입니다. – DOHtero

+0

@DOHtero, 그렇다면 어떻게 든 캔버스를 만들어야합니다 ... – LuxuryMode

0

임의의 A 서브 클래스 인스턴스를 생성하려면 2 가지가 필요합니다.

1) N-1에 대한 모든 "N"인스턴스 클래스

2) 0부터 번호에 착지 동일한 확률의 랜덤 분포를 보유하는 데이터 구조.

데이터 구조는 클래스를 보유하고있는 java의 선형 데이터 구조 (목록, 배열 또는 열거 형)를 사용하여 구현할 수 있습니다. 그런 다음 100 개의 난수 생성을 반복하여 인덱스를 기반으로 배열 (또는 열거 형 또는 목록 등)에서 클래스에 직접 액세스하여 리플렉션을 사용하여 클래스의 인스턴스를 생성 할 수 있습니다.

이 솔루션의 장점은 새 자동차 유형을 추가 할 때 배열 구조에 클래스 이름을 추가하기 만하면된다는 것입니다. 기본 구현에 다른 변경 사항은 없습니다.

관련 문제