/// <summary> /// Обновляет информацию о последних действиях получения энергии формы жизни /// </summary> /// <param name="world">Мир, для которого происходит обновление</param> public void Update(Simple2DWorld world) { int height = world.Map.LifeForms.GetLength(1); int width = world.Map.LifeForms.GetLength(0); Parallel.For(0, height, y => { for (int x = 0; x < width; x++) { BotLifeForm bot = world.Map.LifeForms[x, y]; if (world.Map.LifeForms[x, y] != null) { if (!bot.Dead) { if (bot.LastEnergyActions.Count >= 15) { bot.LastEnergyActions.Dequeue(); } SetRGB(bot); } else { bot.Color = Color.FromArgb(132, 132, 132); } } } }); }
public void Update(Simple2DWorld world) { foreach (BotLifeForm bot in world.LifeForms) { bot.EnergyState = GetState(bot); } }
static int lifeFormsCount = 5000; // количество форм жизни, создающихся при старте мира #endregion static void Main(string[] args) { BotLifeForm.MutationPercent = 25; // шанс мутации if (sizeX % 2 != 0) sizeX++; if (sizeY % 2 != 0) sizeY++; Simple2DWorld.Simple2DWorld world = new Simple2DWorld.Simple2DWorld(sizeX, sizeY, lifeFormsCount); // создаём мир с размерами (sizeX;sizeY) с lifeFormsCount формами жизни IVisualizer visualizer = new Simple2dVisualizer(); world.Visualizer = visualizer; MainForm mainForm = new MainForm(world); mainForm.ShowDialog(); }
/// <summary> /// Обновляет действия бота в соответствии с геномом /// </summary> /// <param name="metadata"></param> public void Update(Simple2DWorld world) { foreach (BotLifeForm lifeForm in world.LifeForms) { if (lifeForm.EnergyState == EnergyStates.ForsedReproduction) { lifeForm.Action = Actions.ForsedReproduction; NextStep(lifeForm); } else { SetAction(lifeForm); } } }
/// <summary> /// Вызывает обновление состояния энергии всех ботов /// </summary> /// <param name="world">Мир, для которого производится обновление</param> public void Update(Simple2DWorld world) { int height = world.Map.LifeForms.GetLength(1); int width = world.Map.LifeForms.GetLength(0); Parallel.For(0, height, y => { for (int x = 0; x < width; x++) { if (world.Map.LifeForms[x, y] != null) { world.Map.LifeForms[x, y].EnergyState = GetState(world.Map.LifeForms[x, y]); } } }); }
/// <summary> /// Обновляет информацию о последних действиях получения энергии формы жизни /// </summary> /// <param name="worldMetadata"></param> public void Update(Simple2DWorld world) { foreach (BotLifeForm bot in world.LifeForms) { if (!bot.Dead) { if (bot.LastEnergyActions.Count >= 15) { bot.LastEnergyActions.Dequeue(); } SetRGB(bot); } else { bot.Color = Color.FromArgb(132, 132, 132); } } }
/// <summary> /// Инициализирует экземпляр MainForm /// </summary> /// <param name="simple2DWorld"></param> public MainForm(Simple2DWorld.Simple2DWorld simple2DWorld) { world = simple2DWorld; InitializeComponent(); mapPicture2.Height = world.Map.Height; mapPicture2.Width = world.Map.Width; this.Size = Screen.PrimaryScreen.Bounds.Size; while (true) { mapPicture2.Width += world.Map.Width / 10; mapPicture2.Height += world.Map.Height / 10; if (mapPicture2.Width + 500 > this.Width || mapPicture2.Height + 70 > this.Height) { mapPicture2.Width -= world.Map.Width / 10; mapPicture2.Height -= world.Map.Height / 10; break; } } }
/// <summary> /// Вызывает обновление интенсивности в зависимости от текущего сезона /// </summary> /// <param name="world">Мир, для которого происходит обновление</param> public void Update(Simple2DWorld world) { if (!world.NaturalPhenomena.ContainsKey("SeasonsPhenomen")) { ArgumentException ex = new ArgumentException("world metadata isn't contains SeasonPhenomen metadata", nameof(world)); throw ex; } Season season = ((SeasonsPhenomen)world.NaturalPhenomena["SeasonsPhenomen"]).CurSeason; switch (season) { case Season.Autumn: case Season.Spring: { _powerFactor = NormalPowerFactor; } break; case Season.Summer: { _powerFactor = HightPowerFactor; } break; case Season.Winter: { _powerFactor = LowPowerFactor; } break; default: { Exception ex = new Exception("Impossible"); throw ex; } } }
/// <summary> /// Обновляет действия бота в соответствии с геномом /// </summary> /// <param name="world">Мир, для которого происходит обновление</param> public void Update(Simple2DWorld world) { int height = world.Map.LifeForms.GetLength(1); int width = world.Map.LifeForms.GetLength(0); Parallel.For(0, height, y => { for (int x = 0; x < width; x++) { if (world.Map.LifeForms[x, y] != null) { if (world.Map.LifeForms[x, y].EnergyState == EnergyStates.ForsedReproduction) { world.Map.LifeForms[x, y].Action = Actions.ForsedReproduction; NextStep(world.Map.LifeForms[x, y]); } else { SetAction(world.Map.LifeForms[x, y]); } } } }); }
/// <summary> /// Вызывает обновление цветов форм жизни /// </summary> /// <param name="world">Мир, для которого происходит обновление</param> public void Update(Simple2DWorld world) { map = new Bitmap(world.Map.Width, world.Map.Height, PixelFormat.Format32bppArgb); BitmapData bmd = map.LockBits(new Rectangle(0, 0, map.Width, map.Height), ImageLockMode.ReadWrite, map.PixelFormat); int PixelSize = 4; unsafe { for (int y = 0; y < bmd.Height; y++) { byte *row = (byte *)bmd.Scan0 + (y * bmd.Stride); for (int x = 0; x < bmd.Width; x++) { if (world.Map.LifeForms[x, y] != null) { Color color = world.Map.LifeForms[x, y].Color; row[x * PixelSize] = color.B; //Blue row[x * PixelSize + 1] = color.G; //Green row[x * PixelSize + 2] = color.R; //Red row[x * PixelSize + 3] = 255; //Alpha } else if (world.Map.Organic[x, y] != null) { row[x * PixelSize] = 132; //Blue row[x * PixelSize + 1] = 132; //Green row[x * PixelSize + 2] = 132; //Red row[x * PixelSize + 3] = 255; //Alpha } } } map.UnlockBits(bmd); } }