как рассчитать координаты ху?

1

привет, я новый студент программирования. как я могу вычислить координату x & y?

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

 Каждый класс расширяет суперкласс "Животное", который содержит метод перемещения и поддерживает текущее местоположение животных как координаты xy. Каждый подкласс реализует метод перемещения.

 Программа поддерживает массив Animal, содержащий ссылки на объекты различных подклассов Animal. Чтобы имитировать движения животных, программа отправляет каждому объекту одно и то же сообщение один раз в секунду, а именно, перемещение.

 Каждый конкретный тип Animal реагирует на сообщение о движении уникальным образом:

 Рыба может плавать три фута

 Лягушка может прыгать на пять футов

 Птица могла летать на десять футов.

 Программа выдает одно и то же сообщение (т.е. Перемещение) каждому животному объекту, но каждый объект знает, как соответствующим образом изменить свои координаты xy для своего конкретного типа движения.

 Опираясь на каждый объект, чтобы знать, как "делать правильную вещь" в ответ на тот же вызов метода, является ключевым понятием полиморфизма.

 Одно и то же сообщение, отправленное множеству объектов, имеет "много форм" результатов - отсюда и термин "полиморфизм".

package animals;

public class Animals {

    public static void main(String[] args) { 
        
        Fish F = new Fish ("fish");
        Frog Fr = new Frog ("frog");
        Bird B = new Bird ("bird");
      
        
       Animal[] A = new Animal [3];
        A[0]= F;
        A[1]=Fr;
        A[2]=B;
        
        for (int i=0 ; i <3; i++){
           A[i].toString();
        }
    }
    
}

package animals;

public abstract class Animal {
     private String type;
     
   public Animal (String type){
       this.type = type ;
   }
    
   public abstract int move ();
   
   public String toString (){
       return String.format(type);
   }
    
}

package animals;
public class Fish extends Animal {
    public Fish (String name){
        super(name);
    }
    @Override
    public int move () {
   //here what I write ?
}
    @Override
    public String toString (){
       return String.format("Fish swim "+move()+"  feet");
   }}

я делаю всех таких животных ^^

  • 1
    Вы говорите, что «... Животное ... которое ... поддерживает текущее местоположение животного в виде координат xy.», Но я не вижу ссылки на x или y в классе Animal ; также «Рыба может плавать три фута» ... это просто ограничение движения; кто решает, куда на самом деле движется рыба? Какой-то ИИ?
  • 0
    должно быть создать X и Y ссылку? :( и как я могу сделать метод перемещения?!
Теги:
polymorphism
abstract
extends

1 ответ

0

Есть первый вопрос, который я вижу в вашем дизайне. Когда вы объявляете конструктор специализированного класса с параметром типа, как вы делали в примере с классом Fish:

 public Fish (String name){
    super(name);
}

Это позволило бы мне создать такой пример рыбы:

Fish salmon = new Fish("Parot");

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

public Fish (){
    super("Fish");
}

Таким образом, вы уверены, что тип paramater действительно будет соответствовать рыбе. Теперь, если вы хотите различать разнообразие рыб и разнообразие птиц или лягушек и т.д., Я бы предложил добавить переменную subType, подобную типу, и создать второй уровень специализации классов. Пример:

// 2nd level of inheritance since Parot extents Bird and Bird extends Animal
public class Parot exents Bird {
    public Parot() {
        super ("Parot"); // Parot as a subType and not the type
    }
}

Теперь вернемся к тому, что вы просили, да, вы должны сохранить ссылку на переменные позиции x и y, и вы можете сделать это на уровне базового класса Animal. Я предлагаю вам указать x и y как private double, а затем вы создадите публичные геттеры для x и y, но защищенные сеттеры для них, чтобы их можно было модифицировать только в специализированном классе, таком как Bird, Fish ,...

Вот как я бы изменил ваш базовый класс Animal

public abstract class Animal {

    private String type;
    private double x, y;

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }

    protected void setX(double x) {
        this.x = x;
    }

    protected void setY(double y) {
        this.y = y;
    }

    public Animal (String type){
        this.type = type ;
    }

    public abstract int move ();

    public String toString (){
        return String.format(type);
    }

    public String position() {
        return "[" + x + " , " + y + "]";
    }

}

Я добавил метод position(), чтобы получить хорошее отображение положения x, y животного. Чтобы сделать его более реалистичным, вы можете сохранить предыдущую позицию и вычислить новую позицию из старой позиции, но я оставлю это дополнение к вам.

Теперь вот как я могу изменить класс Fish. Поскольку, согласно вашим приведенным выше спецификациям, рыба перемещается каждый раз на 3 фута, эта информация может храниться в конечной статической переменной. Затем я могу случайным образом получить значение для x, а затем использовать математический треугольник, чтобы вывести значение y.

public class Fish extends Animal {

    public final static int FISH_MOVE_LENGTH = 3;

    public Fish (){
        super("Fish");
    }

    @Override
    public int move () {
        Random r = new Random();
        double xValue = r.nextInt(FISH_MOVE_LENGTH/2)+ 0.0D;
        double yValue = Math.sqrt(FISH_MOVE_LENGTH*FISH_MOVE_LENGTH -     xValue*xValue);
        setX(xValue);
        setY(yValue);

        return (int)Math.sqrt(xValue*xValue + yValue*yValue);

    }

    @Override
    public String toString (){
       return String.format("Fish swim "+move()+"  feet and its current     position is " + position());
    }}

Я использовал тот же подход для другого класса специализации, единственное, что меняется между тремя классами, - это public final static int FISH_MOVE_LENGTH = 3 который изменится, чтобы отразить вашу public final static int FISH_MOVE_LENGTH = 3 выше спецификацию для каждого вида животных.

Я добавил небольшое изменение и к вашему классу Animals. Сначала произвольно выбирайте, какое животное перемещается, а затем перемещать его и отображать информацию о движении вместе с новой позицией

Все, что я перехожу к классу Animals, это прокомментировать вашу петлю

//        for (int i=0 ; i <3; i++){
//           A[i].toString();
//        }

И заменим его на

 Random maestro = new Random();
 while (true) {

    int elementToPick = maestro.nextInt(3);
    System.out.println(A[elementToPick]);
    Thread.sleep(500);

 }

Thread.sleep существует для демонстрационной цели, позволяя мне пройти некоторое время перед различными дисплеями, которые в противном случае будут слишком быстрыми.

Вот пример результата

Изображение 174551

Ещё вопросы

Сообщество Overcoder
Наверх
Меню