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]); } } } }
public void LoadEntities() { var creatures = LoadCreatures(); var environments = LoadEnvironments(); Creatures.AddRange(creatures); Environments.AddRange(environments); EntitiesLoaded?.Invoke(this, new EventArgs()); }
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; }