2011-12-14 2 views
1

Так что я разобрался с этой программой, и я понятия не имею, как ее закончить. Я уже выполнил 80%, но в последней части я не знаю даже общей идеи. Вопрос:Генерация случайных экземпляров подклассов с использованием абстрактного суперкласса

«Тогда напишите способ randomVehicle, который случайным образом генерирует ссылки Vehicle с равной вероятностью для построения легковых и грузовых автомобилей со случайными позициями. Назовите его 10 раз и нарисуйте все их».

У меня есть основной метод, абстрактный суперкласс Vehicle и два подкласса автомобиля и грузовика. Я знаю, как делать вероятность с использованием циклов, но я понятия не имею, как принять этот вероятностный ответ (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

Я знаю, как создавать случайные числа, я создал представление о том, как автомобиль и грузовик должны выглядеть с использованием основных форм, я знаю, как создать автомобиль или грузовик при определении их непосредственно в подклассе, но то, что я не знаю, t знать, как это сделать, - создать метод, который будет создавать 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() 

Вы бы абстрактный класс Vehicle, и два конкретных подклассов и грузовых автомобилей.

+0

Thilo, вы решили мою аналогичную проблему. Я хочу поцеловать тебя прямо сейчас, но я не хочу выступать в роли гей-парня. – leonidus

2

Как правило, StackOverflow не принимает домашние задания, но я сделаю исключение, так как это в основном идиома, и, поскольку я принимаю это добросовестно, вы уже пробовали это.

Вот метод, который генерирует один случайный автомобиль:

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

Пояснение:

Math.random() генерирует число между 0 и 1.

выражение в скобках испытаний, если она является менее половины; то есть случайным образом выбирает между true и false.

Вопросительный знак Java ternary operator. Если выражение в круглых скобках возвращает true, vehicle инициализируется первому операнду, то есть новый экземпляр Car() и наоборот для false.

+1

Ха-ха, это гораздо более элегантно, чем мое. Браво – LuxuryMode

+0

Спасибо. Новое к этому и не знал о правиле домашней работы. Не повторится к счастью. Шаги, о которых вы говорили, я уже знаю, как это сделать. У меня есть новый объект, определенный для любого автомобиля или теста, но я не знаю, как его нарисовать/отобразить. vehicle.paint (canvas); Является ли значение по умолчанию для обоих автомобилей и грузовиков для отображения изображения. – 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» экземпляра классов

2) случайное распределение равной вероятности посадки на любое число от 0 до N-1.

Структура данных может быть реализована с использованием любой линейной структуры данных в java (список, массив или перечисление), которая содержит классы. Затем, итерируя через 100 генераций случайных чисел, вы можете использовать отражение для генерации экземпляров своего класса, напрямую обращаясь к классу из вашего массива (или перечисления, или списка и т. Д.) На основе индекса.

Преимущество этого решения заключается в том, что при добавлении новых типов автомобилей вам нужно только добавить имя класса в структуру массива ... Без каких-либо других изменений в основной реализации.

Смежные вопросы