2015-12-09 2 views
0

Мне было поручено разрешить животным размножаться в моем зоопарке. Если мужчина и женщина одного и того же животного находятся в одном окружении, тогда есть случайный шанс, что у них будет ребенок. Основным расположением моего зоопарка является абстрактный класс животных, который распространяется на множество животных, таких как львы. Каждое животное имеет ряд переменных, которые они наследуют от класса животных, и одна из них представляет собой строчную гендерную переменную. Пол определяется, когда животное создано из его конструктора. Я ограничил эту переменную, поэтому она может принимать только строки «m» и «f». Мой зоопарк моделируется методом aMonthPasses().Как я могу позволить животным размножаться со случайными шансами на успех в моем виртуальном зоопарке?

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

животных:

public abstract class Animal { //cannot be instantiated 
protected int age; 
protected String gender; 
protected String[] eats = new String[] {"steak", "celery", "hay", "fruit", "fish", "iceCream"}; //an array of strings 
protected int health; 
protected int lifeExpectancy; 
protected Enclosure enclosure; 

protected Animal(int age, String gender, String[] eats, int health, int lifeExpectancy) { //animal constructor 
    this.age = age; 
    this.eats = eats; 
    this.health = 10; //base health for each animal will be 10 
    this.lifeExpectancy = lifeExpectancy; 
    if(gender.equals("m") || gender.equals("f)")) {  //this if statement will limit the gender variable to "m" or "f" for male or female 
     this.gender = gender; 
    } 
} 

protected int getAge() { 
    return age;    //returns the age value 
} 

protected String getGender() { 
    return gender; 
    } 
} 

конструктор в каждом отдельном животном:

private Bear(int age, String gender, String[] eats, int health, int lifeExpectancy) { 
    super(age, gender, new String[]{"steak", "fish"}, health, lifeExpectancy); 
    this.lifeExpectancy = 18; //the bear has a life expectancy of 18 months 
}` 
+0

Да, пожалуйста, разместите свой код. – Berger

+0

добавил мой код класса животных –

+0

У меня есть предложение, сделайте пол enum, – user902383

ответ

0

Прежде всего, давайте определим направление ролей в период беременности. Сделав несколько предположений, что животные должны достичь половой зрелости, прежде чем они могут размножаться, имеет максимальный репродуктивный возраст и т.д., мы можем написать что-то вроде:

import java.util.Optional; 
import java.util.Random; 
import java.util.function.BiFunction; 

public enum Gender implements BiFunction<Animal, Animal, Optional<Animal>> { 
    MALE { 
     @Override 
     public Optional<Animal> apply(final Animal self, 
             final Animal other) { 
      // example - animal reaches sexual maturity at 2 - you should make this a property of animal 
      return self.age > 2 ? other.gender.apply(other, self) 
           : Optional.empty(); 
     } 
    }, 
    FEMALE { 
     @Override 
     public Optional<Animal> apply(final Animal self, 
             final Animal other) { 
      final Optional<Animal> child; 
      // must be at least 2 to get pregnant, infertile 3 years before death. Again, just examples 
      if (self.age > 2 && self.age < self.lifeExpectancy - 3 
       && self.health > 5) { 
       final int chance = new Random().nextInt(10); 
       child = (chance == 3 || chance == 6 || chance == 9) ? Optional.of(self.reproduce()) 
                    : Optional.empty(); 
      } else { 
       child = Optional.empty(); 
      } 
      return child; 
     } 
    }; 
} 

Затем изменить животное, чтобы использовать Gender перечисления вместо String.

Ограждения могут содержать много разных видов животных, поэтому нам нужно различать виды и пол.

import java.util.HashSet; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.Set; 
import java.util.stream.Collectors; 

public class Enclosure { 
    private final List<Animal> animals = new LinkedList<>(); 

    public void add(final Animal animal) { 
     this.animals.add(animal); 
    } 

    public Set<Class<? extends Animal>> getSpecies() { 
     final Set<Class<? extends Animal>> species = new HashSet<>(); 
     for (Animal animal : animals) { 
      species.add(animal.getClass()); 
     } 
     return species; 
    } 

    public List<Animal> getMales(final Class<? extends Animal> species) { 
     return byGender(species, 
         Gender.MALE); 
    } 

    public List<Animal> getFemales(final Class<? extends Animal> species) { 
     return byGender(species, 
         Gender.FEMALE); 
    } 

    private List<Animal> byGender(final Class<? extends Animal> species, 
            final Gender gender) { 
     return animals.stream() 
         .filter(animal -> animal.gender == gender) 
         .filter(animal -> animal.getClass().equals(species)) 
         .collect(Collectors.toList()); 
    } 
} 

Я не большой поклонник фильтрации по типу класса, так что вы можете захотеть добавить абстрактную public String getSpecies() метод Animal.

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

public abstract Animal reproduce(); 

В, к примеру, ваш класс Медведь вы могли бы реализовать это как

public Animal reproduce() { 
    // you'll need to randomize gender and health 
    return gender == Gender.FEMALE ? new Bear(...) : null; 
} 

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

Enclosure enclosure = new Enclosure(); 
// enclosure is populated with animals 

// each month... 
final Set<Class<? extends Animal>> allSpecies = enclosure.getSpecies(); 
for (Class<? extends Animal> species : allSpecies) { 
    final List<Animal> females = enclosure.getFemales(species); 
    final List<Animal> males = enclosure.getFemales(species); 
    for (Animal male : males) { 
     for (Animal female : females) { 
      final Optional<Animal> maybeOffspring = male.gender.apply(male, 
                    female); 
      maybeOffspring.ifPresent(enclosure::add); 
     } 
    } 
} 
+0

wow большое спасибо –

0

Это может быть отправной точкой, давайте представим себе некоторую полезность класс с помощью этого метода:

public double evaluateBabyProbability(Animal a, Animal b){ 

    // animals are of different kind, no chance 
    if(!a.getClass().equals(b.getClass())) 
    return 0d; 

    // animals have different enclosures, no chance 
    if(!a.getEnclosure().equals(b.getEnclosure())) 
    return 0d; 

    // animals have the same gender, no chance 
    if(a.getGender().equals(b.getGender())) 
    return 0d; 

    // Here, evaluate the probability based on any variables you need (age, month, health...) 


    // return result 

    } 
+0

спасибо за вашу помощь, я придумал следующее, но теперь ему не нравится тот факт, что у меня есть двойной тип возврата. –

+0

отправил его как ответ, так как не знал, как прокомментировать код –

+0

«не нравится»: что именно происходит? – Berger

0
public double evaluateBabyProbability(Animal a, Animal b){ 

     if(!a.getClass().equals(b.getClass())) // animals are of different kind, no chance 
     return 0; 

     if(!a.getEnclosure().equals(b.getEnclosure())) // animals have different enclosures, no chance 
     return 0; 

     if(a.getGender().equals(b.getGender())) // animals have the same gender, no chance 
     return 0; 

     if(!a.getGender().equals(b.getGender())) //animals of different gender have chance of breeding of 0.5 each month 
     return 0.5; 
     } 

    private Object getEnclosure() { 
     return enclosure; 
    } 
+0

О, и вы можете подумать о возврате 0d и 0.5d, чтобы сообщить программе, что они являются двойными значениями. – Berger

0

Сладкая задача. Это будет мой подход к этому.

public class Zoo{ 
    abstract class Animal{ 
     protected String gender; 
     protected String name; 
     public Animal(String _gender, String _name){ 
      gender = _gender; 
      name = _name; 
     } 
     public String getGender(){return gender;} 
     public String toString(){return gender + name;} 
    } 
    class Lion extends Animal{ 
     public Lion(String _gender, String _name){ 
      super(_gender, _name); 
     } 
    } 
    class Hippo extends Animal{ 
     public Hippo(String _gender, String _name){ 
      super(_gender, _name); 
     } 
    } 
    ArrayList<Animal> animals; 
    Random rnd = new Random(); 
    final int BREED_CHANCE = 1; // for test let them breed always 

    public Zoo(){ 

     animals = new ArrayList<Animal>(); 
     animals.add(new Lion("m", "Lion1")); 
     animals.add(new Lion("m", "Lion2")); 
     animals.add(new Lion("f", "Lion3")); 
     animals.add(new Lion("f", "Lion4")); 
     animals.add(new Lion("f", "Lion5")); 

     animals.add(new Hippo("m", "Hippo1")); 
     animals.add(new Hippo("m", "Hippo2")); 
     animals.add(new Hippo("f", "Hippo3"));  
    } 

    public ArrayList<Animal> findAllPossibleMaleBreedPartners(Animal femaleAnimal){ 
     ArrayList<Animal> result = new ArrayList<>(); 
     // find an animal 
     for(Animal animal : animals){ 
      // that is male and same species as female Animal 
      if(animal.getGender().equals("m") && 
       animal.getClass() == femaleAnimal.getClass()){ 
       // then its a possible breed partner 
       result.add(animal); 
      } 
     } 
     return result;  
    } 

    public void breed(){ 
     // for each Animal 
     for(Animal female : animals){ 
      // if its female 
      if(female.getGender().equals("f")){ 
       // find all possible male breed partners 
       ArrayList<Animal> partners = findAllPossibleMaleBreedPartners(female); 
       // if there are any and chance is given 
       if(!partners.isEmpty() && rnd.nextInt(BREED_CHANCE) == 0){ 
        //pick one of them 
        Animal male = partners.get(rnd.nextInt(partners.size())); 
        // and let them breed 
        System.out.println(female + " & " + male + " making a baby!"); 
       } 
      } 
     } 
    } 

    public void aMonthPasses(){ 
     breed(); 
    } 

    public static void main(String[] args){ 
     Zoo zoo = new Zoo(); 
      zoo.aMonthPasses(); 
    } 
} 
Смежные вопросы