2015-04-19 2 views
1
public class Pond { 

    public static void allcreationco(){ 
    for (int i = 0; i < 100; i++){ 
     int radius = 100; 
     int x = (int) (Math.random() * 2 * radius - radius); 
     int ylim = (int) Math.sqrt(radius * radius - x * x); 
     int y = (int) (Math.random() * 2 * ylim - ylim); 
     Fish.xfishc.add((int) x); 
     Fish.yfishc.add((int) y); 
    } 

    allcreationdir(); 

    } 

    public static void allcreationdir(){ 

    for (int i = 0; i < Fish.xfishc.size(); i++){ 
     double radius = Math.random()*1; 
     double angle = Math.random()*2*Math.PI; 
     double x = Math.cos(angle)*radius + 0; 
     if (x > 0){ 

      Fish.xfishcb1.add(true); 




     } 
     else { 
      Fish.xfishcb1.add(false); 

     } 


    } 
    for (int i = 0; i < Fish.yfishc.size(); i++){ 
     double radius = Math.random()*1; 
     double angle = Math.random()*2*Math.PI; 
     double x = Math.cos(angle)*radius + 0; 
     if (x > 0){ 

      Fish.yfishcb1.add(true); 




     } 
     else { 
      Fish.yfishcb1.add(false); 

     } 

    } 

Привет, моя цель состоит в том, чтобы создать имитацию (без визуального рисунка нужно, просто что-то легко напечатать информацию о) круговой пруд с рыбой беспорядочно плавая в нем. Вышеприведенный код - способ инициировать 100 гипотетических рыб в Arraylists в виде координат x и y на основе гипотетического круга с радиусом 100 (лучше всего это сделать). Я хотел бы, чтобы каждая из 100 рыб могла плавать в случайных направлениях и каждый раз, когда они доходили до конца пруда, каждый раз переходила к новым случайным направлениям. Может быть, я хотел бы, чтобы они воспроизвели через некоторое время или включили другую рыбу, которая двигалась прямыми линиями и могла есть другую рыбу.Симуляция объекты бассейна (как рыба) в круговом пруду (в Java)

public class Salmon extends Fish { 
public static int salmonre = 0; 
    public static void salmonmove(){ 


    for (int i = 0; i < xfishc.size(); i++){ 
     if (xfishcb1.get(i) == true){ 
      int d = xfishc.get(i); 
      int e = d + 1; 
      xfishc.set(i , e); 

     } 
     else{ 

      int d = xfishc.get(i); 
      int e = d - 1; 
      xfishc.set(i , e); 
     } 
    } 
    for (int i = 0; i < yfishc.size(); i++){ 
     if (yfishcb1.get(i) == true){ 
      int d = yfishc.get(i); 
      int e = d + 1; 
      yfishc.set(i , e); 

     } 
     else{ 
      int d = yfishc.get(i); 
      int e = d - 1; 
      yfishc.set(i , e); 

     } 

     } 
    salmonre++; 


    } 




    } 

Я также использовал булевы ArrayLists случайным образом определить, какие направления рыба должна двигаться. Пожалуйста, будьте нежны со мной в своей риторике, потому что я хорошо понимал, что мои подходы смешны. Я знаю, что лучше использовать тригонометрию при моделировании объектов и их поведении в круге, но по какой-то причине я не могу обернуть голову вокруг этого, глядя в Интернете (я продолжаю находить вещи более сложными, включая визуальные иллюстрации) , Не могли бы вы «угодить» дать мне исчерпывающие ответы с идеями? Я разочарован.

+0

Я удалил свой ход тега и рыба тег, потому что они не должны были быть включены – Ungeheuer

ответ

2

Я не был полностью в состоянии понять, как вы хотели ваш класс рыбы работать на основании кода, но некоторые советы:

  1. В объектно-ориентированном программировании, вы не хотите, чтобы иметь класс Рыба, которая имеет статические методы для обновления двух списков, содержащих координаты X и Y для всех рыб.

    Вместо этого вы хотите, чтобы объект класса Fish представлял все, что касается одной рыбы. Затем вы можете иметь список объектов Fish.

  2. Пара boolean s действительно слишком грубо для направлений. Вместо этого используйте double, по одному для каждой рыбы (хранящейся в экземпляре Fish).

  3. Чтобы реализовать изменение направления движения, просто проверьте, будет ли следующий ход перемещать рыбу из воды, и если да, выберите другое направление.

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

class Fish { 
    private double x, y; 
    private double angle, speed; 

    public Fish() { 
     x = y = angle = 0; 
     speed = 5; 
    } 

    void move() { 
     // If we swim at this angle, this is where we'll end up 
     double newX = x + Math.cos(angle) * speed; 
     double newY = y + Math.sin(angle) * speed; 

     if (isInPond(newX, newY)) { 
      // That's still in the pond, go there 
      x = newX; 
      y = newY; 
     } else { 
      // That's outside the pond, change direction 
      angle = Math.random() * 2 * Math.PI; 
     } 
    } 

    public String toString() { 
     return String.format(
      "Position: %.0f,%.0f. Angle: %.0f degrees.", 
      x, y, angle * 180/Math.PI); 
    } 

    // Check whether some coordinates are within a circular pond with radius 100 
    static boolean isInPond(double x, double y) { 
     return Math.sqrt(x*x+y*y) < 100; 
    } 

    public static void main(String[] args) throws Exception { 
     Fish nemo = new Fish(); 
     Fish marlin = new Fish(); 
     while(true) { 
      nemo.move(); 
      marlin.move(); 
      System.out.println("Nemo: " + nemo); 
      System.out.println("Marlin: " + marlin); 
      Thread.sleep(500); 
     } 
    } 
} 
Смежные вопросы