Генерация случайных экземпляров подклассов с использованием абстрактного суперкласса - PullRequest
1 голос
/ 14 декабря 2011

Так что я ломал голову над этим программным заданием, и я понятия не имею, как его закончить. Я уже выполнил 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
}
}

Аннотация 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;
}

Ответы [ 4 ]

2 голосов
/ 14 декабря 2011

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

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

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

Объяснение:

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

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

Знак вопроса - троичный оператор Java .Если выражение в скобках возвращает true, vehicle инициализируется первым операндом, т. Е. Новым экземпляром Car(), и наоборот для false.

2 голосов
/ 14 декабря 2011
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();
   }
}
2 голосов
/ 14 декабря 2011

Псевдокод для начала работы:

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 и два конкретных подкласса Car и Truck.

0 голосов
/ 14 декабря 2011

Если вы хотите сгенерировать случайные экземпляры подкласса A, вам нужно 2 вещи.

1) структура данных, содержащая все "n" экземпляров классов

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

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

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

...