Beispiel #1
0
        protected override void UpdateMating()
        {
            List <Creature> matingCreatures = new List <Creature>();
            List <Creature> matedCreatures  = new List <Creature>();
            List <Creature> offspringPool   = new List <Creature>();

            foreach (Creature creature in Creatures)
            {
                if (creature.readyToMate && creature.mating)
                {
                    matingCreatures.Add(creature);
                }
            }

            foreach (Creature PartnerA in matingCreatures)
            {
                foreach (Creature PartnerB in PartnerA.collidingCreatures)
                {
                    if (!PartnerB.readyToMate || !PartnerB.mating)
                    {
                        continue;
                    }

                    if (!matedCreatures.Contains(PartnerA) &&
                        !matedCreatures.Contains(PartnerB))
                    {
                        Creature offspring = new Creature(PartnerA.agent.CrossOver(PartnerB.agent), new Position(RandomDouble(), RandomDouble()));
                        offspringPool.Add(offspring);
                        matedCreatures.Add(PartnerA);
                        matedCreatures.Add(PartnerB);
                        offspring.lastMatedAtTick = ticksElapsed;
                        PartnerA.lastMatedAtTick  = ticksElapsed;
                        PartnerB.lastMatedAtTick  = ticksElapsed;
                        PartnerA.agent.fitness   += 10;
                        PartnerB.agent.fitness   += 10;
                    }
                }
            }
            Creatures.AddRange(offspringPool);

            if (Creatures.Count > MAX_CREATURES)
            {
                Creatures.Sort();
                double maxKeepScore = Creatures[Creatures.Count - 1].agent.fitness *
                                      CREATURE_MAX_LIFESPAN;
                while (Creatures.Count > MAX_CREATURES)
                {
                    int i = RandomInt(Creatures.Count);

                    if (Creatures[i].agent.fitness *
                        (CREATURE_MAX_LIFESPAN - Creatures[i].lifeTime) /
                        maxKeepScore < RandomDouble())
                    {
                        KillCreature(Creatures[i]);
                    }
                }
            }
        }
Beispiel #2
0
        public void LoadEntities()
        {
            var creatures    = LoadCreatures();
            var environments = LoadEnvironments();

            Creatures.AddRange(creatures);
            Environments.AddRange(environments);
            EntitiesLoaded?.Invoke(this, new EventArgs());
        }
Beispiel #3
0
        private void TenSecondUpdate(float time, Random random)
        {
            TerrorLevel += Creatures.Count;
            // each open spawns creatures.
            Console.WriteLine("Time: {2}, Player Kills: {0} | Terrorlevel: {1}", Player.Kills, TerrorLevel, time);
            //spawn cards
            Player.SpawnCards(Player.Kills);

            totalKills  += Player.Kills;
            Player.Kills = 0;
            var validPortals = this.Portals.Where((p) => (!p.Destroyed)).ToList();

            if (validPortals.Count > 0)
            {
                int openingPortalIndex = random.Next(0, validPortals.Count - 1);
                if (validPortals[openingPortalIndex].isOpen)
                {
                    validPortals[openingPortalIndex].Size += 1;
                }
                else
                {
                    validPortals[openingPortalIndex].isOpen = true;
                }
                var portal = validPortals[openingPortalIndex];
                Console.WriteLine("DOOOOM! at {0}, {1}", portal.Location.X, portal.Location.Y);
            }

            /*foreach (var grp in map.ObjectGroups)
             * {
             *  if (grp.Name.Equals("hidden")) {
             *  //ObjectGroup grp = kvpair.Value;
             *      foreach (var tiledobj in grp.Objects)
             *      {
             *          tiledobj.
             *      }
             *  }
             * }*/

            // new direction;
            foreach (var creature in this.Creatures)
            {
                creature.Direction = random.Next(0, 360) * Math.PI / 180;
            }
            WinCondition = true;
            foreach (var portal in validPortals)
            {
                if (portal.isOpen)
                {
                    TerrorLevel += 1;
                    if (Creatures.Count < 100)
                    {
                        Creatures.AddRange(portal.SpawnCreatures(Creatures.Count, TerrorLevel));
                        portal.Size += 0.1f;
                    }
                    else
                    {
                        //portal.Size += 1f;
                        portal.Size = 1f;
                    }
                }
                if (!portal.Destroyed)
                {
                    WinCondition = false;
                }
            }

            time = 0;
        }