Example #1
0
        /// <summary>
        /// Create a seperate clone of the Wagon without any references.
        /// </summary>
        /// <returns>object containing the wagon.</returns>
        public object Clone()
        {
            Wagon copy = (Wagon)this.MemberwiseClone();    // create a copy

            copy.animals.Clear();                          // remove the references to the original animals
            foreach (Animal a in animals)
            {
                copy.animals.Add((Animal)a.Clone());     // add the cloned animals
            }
            return(copy);                                // return the cloned wagon
        }
        //Beste groepjes van dieren maken en terug geven in een lijst van wagonnen
        public List <Wagon> Arrange(List <Animal> inputAnimals)
        {
            List <Wagon>  wagonsWhichCanBeFilled         = new List <Wagon>();                                                       //Lijst van wagons waar nog plek is
            List <Animal> smallHerbsWhichNeedToBePlaced  = new List <Animal>();
            List <Animal> mediumHerbsWhichNeedToBePlaced = new List <Animal>();
            List <Animal> largeHerbsWhichNeedToBePlaced  = new List <Animal>();
            List <Animal> animalsLeft = new List <Animal>();

            //1. Carnivoren mogen niet bij elkaar, dus geef deze allemaal een eigen wagon
            foreach (Animal animal in inputAnimals)
            {
                if (animal.Carnivore)
                {
                    Wagon w = new Wagon();
                    w.addAnimal(animal);

                    //Als het een grote carnivoor is mag de wagon gesloten worden, grote carnivoren eten alle andere dieren op.
                    if (animal.Size == AnimalSize.Large)
                    {
                        Wagons.Add(w);
                    }
                    else
                    {
                        wagonsWhichCanBeFilled.Add(w); //Wagons waar we nog dieren aan toekunnen voegen.
                    }
                }
                else //Dieren die nog een wagon moeten krijgen, worden in een lijst gezet om makkelijker te vullen
                {
                    switch (animal.Size)
                    {
                    case AnimalSize.Small:
                        smallHerbsWhichNeedToBePlaced.Add(animal);
                        break;

                    case AnimalSize.Medium:
                        mediumHerbsWhichNeedToBePlaced.Add(animal);
                        break;

                    default:                            //Alle overgebleven dieren zijn grote herbivoren
                        largeHerbsWhichNeedToBePlaced.Add(animal);
                        break;
                    }
                }
            }

            //2. Alle middel carnivoren mogen alleen een grote herbivoor bij zich
            if (largeHerbsWhichNeedToBePlaced.Count > 0)                                                                           //Kijken of er überhaupt grote carnivoren zijn
            {
                for (int i = 0; i < wagonsWhichCanBeFilled.Count; i++)                                                             //Kijke door alle wagonnen die al een carnivoor hebben
                {
                    Wagon w = wagonsWhichCanBeFilled[i];
                    if (w.animals.Contains(new Animal(true, AnimalSize.Medium)))                                                   //Als het een middel carnivoor is, mag de grote herbivoor toegevoegd worden
                    {
                        if (w.addAnimal(largeHerbsWhichNeedToBePlaced[0]))
                        {
                            largeHerbsWhichNeedToBePlaced.RemoveAt(0);                                                             //Het toegevoegde dier uit de lijst van dieren zonder wagon halen

                            Wagons.Add(w);
                            wagonsWhichCanBeFilled.RemoveAt(i);                                                                    //Hier kunnen geen dieren meer bij, middel carn(3) grote herb(5) = 3+5=8.
                                                                                                                                   //Er mogen geen kleine dieren bij worden opgegeten
                            if (largeHerbsWhichNeedToBePlaced.Count <= 0)                                                          //kijken of er nog grote herbivoren zijn anders stoppen, zonder dit kun je out of range krijgen
                            {
                                break;
                            }
                        }
                    }
                }
            }

            //3. Overgebleven dieren nog in een wagon doen
            animalsLeft.AddRange(smallHerbsWhichNeedToBePlaced);
            animalsLeft.AddRange(mediumHerbsWhichNeedToBePlaced);
            animalsLeft.AddRange(largeHerbsWhichNeedToBePlaced);
            List <Animal> animalsToAdd;

            while ((animalsLeft.Count) > 0)                                                                                         //Kijken of er dieren zijn
            {
                if (wagonsWhichCanBeFilled.Count <= 0)                                                                              //Kijken of er wagonnetjes zijn waar al dieren in zitten
                {
                    wagonsWhichCanBeFilled.Add(new Wagon());
                }

                //Kijken naar de best mogelijke combinatie om de wagon te vullen
                animalsToAdd = SortWagonWithCheckCombinations(wagonsWhichCanBeFilled[0], animalsLeft);

                //Plaats de dieren in de wagon
                for (int i = animalsToAdd.Count - 1; i >= 0; i--)
                {
                    if (wagonsWhichCanBeFilled[0].addAnimal(animalsToAdd[i]))
                    {
                        animalsLeft.RemoveAt(animalsLeft.IndexOf(animalsToAdd[i]));
                    }
                    animalsToAdd.RemoveAt(i);
                }

                //Verplaats de wagon naar de trein
                Wagons.Add(wagonsWhichCanBeFilled[0]);
                wagonsWhichCanBeFilled.RemoveAt(0);

                //Opschonen
                animalsToAdd.Clear();
            }

            //Als de animals eerder geplaatst zijn, dan dat alle wagons gevuld zijn:
            //Voeg alle wagons toe aan de trein
            Wagons.AddRange(wagonsWhichCanBeFilled);
            wagonsWhichCanBeFilled.Clear();

            return(Wagons);
        }
        //best mogelijke optie om een wagon te vullen
        public List <Animal> SortWagonWithCheckCombinations(Wagon originalWagon, List <Animal> unplacedAnimals)
        {
            List <Animal> AnimalsToAdd  = new List <Animal>();
            bool          hasCarnivore  = false;
            AnimalSize    carnivoreSize = 0;

            int[] animalAmounts = new int[] { 0, 0, 0, 0, 0, 0 }; // small herbivore, medium herbivore, large herbivore, small carnivore, medium carnivore, large carnivore

            //1. Verwijder de dieren uit de lijst die niet geplaatst kunnen worden
            //Bekijk alle dieren in de wagon of er een carnivoor in zit
            foreach (Animal a in originalWagon.animals)
            {
                if (a.Carnivore)
                {
                    hasCarnivore  = true;
                    carnivoreSize = a.Size;
                    break;
                }
            }

            //Bekijk alle dieren die nog geplaatst moeten worden
            for (int i = 0; i < unplacedAnimals.Count; i++)
            {
                //Carnivoren kunnen niet geplaatst worden als er al een carnivoor in de wagon zit
                //Daarnaast kunnen alle dieren verwijderd worden als de carnivoor groter of gelijke grootte is
                if (hasCarnivore && (unplacedAnimals[i].Carnivore || carnivoreSize >= unplacedAnimals[i].Size))
                {
                    continue;
                }

                //Tel het geheel van dieren in de wagon
                if (unplacedAnimals[i].Carnivore)
                {
                    switch (unplacedAnimals[i].Size)
                    {
                    case AnimalSize.Small:
                        animalAmounts[3]++;
                        break;

                    case AnimalSize.Medium:
                        animalAmounts[4]++;
                        break;

                    case AnimalSize.Large:
                        animalAmounts[5]++;
                        break;
                    }
                }
                else
                {
                    switch (unplacedAnimals[i].Size)
                    {
                    case AnimalSize.Small:
                        animalAmounts[0]++;
                        break;

                    case AnimalSize.Medium:
                        animalAmounts[1]++;
                        break;

                    case AnimalSize.Large:
                        animalAmounts[2]++;
                        break;
                    }
                }
            }


            //Kijk naar de vrije plek in de wagon, als dit 10 is kun je de wagon terug geven. Dat wil zeggen dat die leeg is

            //2. Kijk naar de plek in de wagon
            switch (originalWagon.GetAvailableSpace())
            {
            //3. Alle mogelijke combinaties
            case 10:
                //2 grote herbivoren
                if (animalAmounts[2] >= 2)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Large));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Large));
                    return(AnimalsToAdd);
                }
                //1 grote herbivoor, 1 middel herbivoor, 2 kleine herbivoren
                if (animalAmounts[2] >= 1 && animalAmounts[1] >= 1 && animalAmounts[0] >= 2)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Large));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    return(AnimalsToAdd);
                }
                //3 middel herbivoren, 1 kleine herbivoor
                if (animalAmounts[1] >= 3 && animalAmounts[0] >= 1)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    return(AnimalsToAdd);
                }
                //1 grote herbivoor 5 kleine herbivoren
                if (animalAmounts[2] >= 1 && animalAmounts[0] >= 5)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Large));
                    for (int i = 0; i < 5; i++)
                    {
                        AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    }
                    return(AnimalsToAdd);
                }
                //2 middel herbivoren, 4 kleine herbivoren
                if (animalAmounts[1] >= 2 && animalAmounts[0] >= 4)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    return(AnimalsToAdd);
                }
                //1 middel herbivoor, 7 kleine herbivoren
                if (animalAmounts[1] >= 1 && animalAmounts[0] >= 7)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    for (int i = 0; i < 7; i++)
                    {
                        AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    }
                    return(AnimalsToAdd);
                }
                //10 kleine herbivoren
                if (animalAmounts[0] >= 10)
                {
                    for (int i = 0; i < 10; i++)
                    {
                        AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    }
                    return(AnimalsToAdd);
                }
                goto case 9;

            case 9:
                //1 grote herbivoor, 1 middel herbivoor, 1 kleine herbivoor
                if (animalAmounts[2] >= 1 && animalAmounts[1] >= 1 && animalAmounts[0] >= 1)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Large));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    return(AnimalsToAdd);
                }
                //3 middel herbivoren
                if (animalAmounts[1] >= 3)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    return(AnimalsToAdd);
                }
                //1 grote herbivoor, 4 kleine herbivoren
                if (animalAmounts[2] >= 1 && animalAmounts[0] >= 4)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Large));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    return(AnimalsToAdd);
                }
                //2 middel herbivoren, 3 kleine herbivoren
                if (animalAmounts[1] >= 2 && animalAmounts[0] >= 3)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    return(AnimalsToAdd);
                }
                //1 middel herbivoor, 6 kleine herbivoren
                if (animalAmounts[1] >= 1 && animalAmounts[0] >= 6)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    for (int i = 0; i < 6; i++)
                    {
                        AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    }
                    return(AnimalsToAdd);
                }
                //9 kleine herbivoren
                if (animalAmounts[0] >= 9)
                {
                    for (int i = 0; i < 9; i++)
                    {
                        AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    }
                    return(AnimalsToAdd);
                }
                goto case 8;

            case 8:
                //1 grote herbivoor, 1 middel herbivoor
                if (animalAmounts[2] >= 1 && animalAmounts[1] >= 1)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Large));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    return(AnimalsToAdd);
                }
                //1 grote herbivoor, 3 kleine herbivoren
                if (animalAmounts[2] >= 1 && animalAmounts[0] >= 3)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Large));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    return(AnimalsToAdd);
                }
                //2 middel herbivoren, 2 kleine herbivoren
                if (animalAmounts[1] >= 2 && animalAmounts[0] >= 2)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    return(AnimalsToAdd);
                }
                //1 middel herbivoor, 5 kleine herbivoren
                if (animalAmounts[1] >= 1 && animalAmounts[0] >= 5)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    for (int i = 0; i < 5; i++)
                    {
                        AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    }
                    return(AnimalsToAdd);
                }
                //8 kleine herbivoren
                if (animalAmounts[0] >= 8)
                {
                    for (int i = 0; i < 8; i++)
                    {
                        AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    }
                    return(AnimalsToAdd);
                }
                goto case 7;

            case 7:
                //2 middel herbivoren, 1 kleine herbivoor
                if (animalAmounts[1] >= 2 && animalAmounts[0] >= 1)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    return(AnimalsToAdd);
                }
                //1 grote herbivoor, 2 kleine herbivoren
                if (animalAmounts[2] >= 1 && animalAmounts[0] >= 2)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Large));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    return(AnimalsToAdd);
                }
                //1 middel herbivoor, 4 kleine herbivoren
                if (animalAmounts[1] >= 1 && animalAmounts[0] >= 4)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    for (int i = 0; i < 4; i++)
                    {
                        AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    }
                    return(AnimalsToAdd);
                }
                //7 kleine herbivoren
                if (animalAmounts[0] >= 7)
                {
                    for (int i = 0; i < 7; i++)
                    {
                        AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    }
                    return(AnimalsToAdd);
                }
                goto case 6;

            case 6:
                //1 grote herbivoor, 1 kleine herbivoor
                if (animalAmounts[2] >= 1 && animalAmounts[0] >= 1)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Large));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    return(AnimalsToAdd);
                }
                //2 middel herbivoren
                if (animalAmounts[1] >= 2)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    return(AnimalsToAdd);
                }
                //1 middel herbivoor, 3 kleine herbivoren
                if (animalAmounts[1] >= 1 && animalAmounts[0] >= 3)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    return(AnimalsToAdd);
                }
                //6 kleine herbivoren
                if (animalAmounts[0] >= 6)
                {
                    for (int i = 0; i < 6; i++)
                    {
                        AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    }
                    return(AnimalsToAdd);
                }
                goto case 5;

            case 5:
                //1 grote herbivoor
                if (animalAmounts[2] >= 1)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Large));
                    return(AnimalsToAdd);
                }
                //1 middel herbivoor, 2 kleine herbivoren
                if (animalAmounts[1] >= 1 && animalAmounts[0] >= 2)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    return(AnimalsToAdd);
                }
                //5 kleine herbivoren
                if (animalAmounts[0] >= 5)
                {
                    for (int i = 0; i < 5; i++)
                    {
                        AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    }
                    return(AnimalsToAdd);
                }
                goto case 4;

            case 4:
                //1 middel herbivoor, 1 kleine herbivoor
                if (animalAmounts[1] >= 1 && animalAmounts[0] >= 1)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    return(AnimalsToAdd);
                }
                //4 kleine herbivoren
                if (animalAmounts[0] >= 4)
                {
                    for (int i = 0; i < 4; i++)
                    {
                        AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    }
                    return(AnimalsToAdd);
                }
                goto case 3;

            case 3:
                //1 middel herbivoor
                if (animalAmounts[1] >= 1)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Medium));
                    return(AnimalsToAdd);
                }
                //3 kleine herbivoren
                if (animalAmounts[0] >= 3)
                {
                    for (int i = 0; i < 3; i++)
                    {
                        AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    }
                    return(AnimalsToAdd);
                }
                goto case 2;

            case 2:
                //2 kleine herbivoren
                if (animalAmounts[0] >= 2)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    return(AnimalsToAdd);
                }
                goto case 1;

            case 1:
                //1 kleine herbivoor
                if (animalAmounts[0] >= 1)
                {
                    AnimalsToAdd.Add(new Animal(false, AnimalSize.Small));
                    return(AnimalsToAdd);
                }
                break;
            }

            return(AnimalsToAdd);
        }