private IFlower GetTargetFlowerCloserToBee(IBee bee, List <IFlower> blossomingFlowers) { int minimumDistance = -1; int flowerIndex = -1; for (var i = 0; i < blossomingFlowers.Count; i++) { if (blossomingFlowers[i].FlowerPollenArea.Width != 0 && blossomingFlowers[i].FlowerPollenArea.Height != 0) { var distance = _interactionManager.GetDistanceBetweenObjectAandObjectB(bee.BeeInOuterWorldSize, blossomingFlowers[i].FlowerPollenArea); if (i == 0) { minimumDistance = distance; flowerIndex = i; } else if (distance < minimumDistance) { minimumDistance = distance; flowerIndex = i; } } } var selectedFlower = (flowerIndex != -1) ? blossomingFlowers[flowerIndex] : null; return(selectedFlower); }
public IBee UpdateBeeInfo_OnTargetedMovement(IBee bee) { //Indoors if (_beeCommon.BeeIsIndoors(bee.BeeEnvironmentBehavior)) { SetBeeTargetedMovementDirection_Indoors(bee, _beehiveExitDoorDimmensions); SetBeeNewBehaviorOnHittingTarget_Indoors(bee, _beehiveExitDoorDimmensions); } //OuterWorld if (BeeIsGoingTowardsBeehiveEntrance(bee)) { Rectangle beehiveEntranceDoor = _landscapeManager.GetBeehiveEntranceDoorDimmensions(); SetBeeTargetedMovementDirection_OuterWorld(bee, beehiveEntranceDoor); SetBeeNewTargetedBehaviorOnHittingTarget_OuterWorld(bee, beehiveEntranceDoor); } if (BeeIsGoingTowardsFlower(bee)) { SetTargetBehaviorBee_PollenFlower(bee); if (!HasAFlowerIDBeenAssignedToBee(bee)) { SetRandomBehaviorBee_OuterWorld(bee); } else { IFlower selectedFlower = GetSelectedFlowerByID(bee.BeeTargetFlowerID); if (selectedFlower != null) { SetBeeTargetedMovementDirection_OuterWorld(bee, selectedFlower.FlowerPollenArea); SetBeeNewTargetedBehaviorOnHittingTarget_OuterWorld(bee, selectedFlower.FlowerPollenArea); } } } return(bee); }
public void BeeFactory() { BeeFactory beeFactory = null; Console.WriteLine("Choose your bee from 1,2 or 3: "); string bee = Console.ReadLine(); switch (bee) { case "1": beeFactory = new QueenFactory(150, false); break; case "2": beeFactory = new DroneFactory(100, false); break; case "3": beeFactory = new WorkerFactory(80, false); break; default: break; } IBee bee1 = beeFactory.GetBee(); }
/// <summary> /// Выяснить, допущена ли данная пчела к проходу в улей. /// </summary> /// <param name="bee">Пчела.</param> /// <returns>True - пчела допущена к проходу в улей.</returns> internal bool IsBeeAcceptedToEnter(IBee bee) { lock (lockObject) { return(this.list.ContainsKey(bee) && this.list[bee]); } }
/// <summary> /// Отменить разрешение на проход в улей (например, /// до следующей проверки). /// </summary> /// <param name="bee">Пчела.</param> internal void ResetBeeAcceptedState(IBee bee) { lock (lockObject) { list[bee] = false; } }
public void Move(IBee bee, Rectangle environmentDimmensions) { //Random Behavior if (_beeCommon.BeeBehaviorIsRandom(bee.BeeEnvironmentBehavior)) { bee = _beeBehaviorResolver.UpdateBeeInfo_OnRandomMovement(bee, environmentDimmensions); } //targeted Behavior if (_beeCommon.BeeBehaviorIsTargeted(bee.BeeEnvironmentBehavior)) { bee = _beeBehaviorResolver.UpdateBeeInfo_OnTargetedMovement(bee); } //Move Bee Indoors if (_beeCommon.BeeIsIndoors(bee.BeeEnvironmentBehavior)) { Point newLocationPoint = _linearMovementStrategy.GetNewLinearMovementPoint(bee.BeeIndoorsMovementDirection); bee.BeeIndoorsSize = _interactionManager.GetNewLocationPoint(bee.BeeIndoorsSize, newLocationPoint); } //Move Bee Outer World if (_beeCommon.BeeIsInOuterWorld(bee.BeeEnvironmentBehavior)) { Point newLocationPoint = _linearMovementStrategy.GetNewLinearMovementPoint(bee.BeeOuterWorldMovementDirection); bee.BeeInOuterWorldSize = _interactionManager.GetNewLocationPoint(bee.BeeInOuterWorldSize, newLocationPoint); } }
public override void Update(IBee bee, ISessionContext context) { var elapsed = context.Elapsed; var lastUpdated = elapsed; if (false == bee.PropertyExists(LastUpdated)) { bee[LastUpdated] = elapsed; } else { lastUpdated = (TimeSpan)bee[LastUpdated]; } var timeout = elapsed - lastUpdated; if (timeout >= Timeout) { var beehive = context.GetBeehive(bee.NativeBeehiveIndex); var temp = new Bee(bee.NativeBeehiveIndex, new WorkingBeeBehavoiur()); beehive.Bees.Add(temp); temp[LastUpdated] = elapsed; } }
/// <summary> /// Зарегистрировать пчелу, как допущенную к проходу. /// </summary> /// <param name="bee">Пчела.</param> internal void AcceptBeeToEnter(IBee bee) { lock (lockObject) { list[bee] = true; } }
private void SetTargetBehaviorBee_BeehiveExitDoor(IBee bee) { bee.BeeIsOnDisplayIndoors = false; bee.BeeIsOnDisplayOuterWorld = true; bee.BeeIndoorsMovementDirection = MovementDirectionEnum.Static; bee.BeeEnvironmentBehavior = BeeEnvironmentBehaviorEnum.OuterWorldTargetBeehiveEntrance; bee.BeeOuterWorldMovementDirection = _beeCommon.GetSelectedMovement(bee.BeeEnvironmentBehavior); }
private void SetRandomBehaviorBee_OuterWorld(IBee bee) { bee.BeeIsOnDisplayIndoors = false; bee.BeeIsOnDisplayOuterWorld = true; bee.BeeIndoorsMovementDirection = MovementDirectionEnum.Static; bee.BeeEnvironmentBehavior = BeeEnvironmentBehaviorEnum.OuterWorldRandom; bee.BeeOuterWorldMovementDirection = _beeCommon.GetSelectedMovement(bee.BeeEnvironmentBehavior); }
/// <summary> /// Зарегистрировать пчелу в улье, т.е. установить её связь с ульем. /// </summary> /// <param name="bee">Пчела.</param> private void RegisterBee(IBee bee) { this.allBees.Enqueue(bee); bee.BeehiveNumber = this.state.BeehiveNumber; bee.ActionPerformed += this.BeeOnActionPerformed; bee.RequestForBeehiveData += this.BeeOnRequestBeehiveData; }
public static void CreateBee_ExpectedDrone() { IBee result = BeesFactory.CreateBee("Drone", 20, 4); IBee expected = new Drone("Drone", 20, 4); Assert.AreEqual(result.GetType(), expected.GetType()); }
private void SetBeeTargetBlossomingFlowerID(IBee bee) { if (bee.BeeTargetFlowerID == -1 && BeeIsGoingTowardsFlower(bee)) { var selectedFlower = GetTargetFlowerCloserToBee(bee, _flowerManager.GetBlossomingFlowers()); bee.BeeTargetFlowerID = (selectedFlower != null) ? selectedFlower.FlowerID : -1; } }
private void SetBeeTargetedMovementDirection_OuterWorld(IBee bee, Rectangle environmentTargetDimmensions) { if (_beeCommon.BeeIsInOuterWorld(bee.BeeEnvironmentBehavior)) { var beeLocationPoint = new Point(bee.BeeInOuterWorldSize.X, bee.BeeInOuterWorldSize.Y); var targetLocationPoint = new Point(environmentTargetDimmensions.X, environmentTargetDimmensions.Y); bee.BeeOuterWorldMovementDirection = _beeCommon.GetSelectedMovement(bee.BeeEnvironmentBehavior, beeLocationPoint, targetLocationPoint); } }
public override void Update(IBee bee, UpdateContext context) { if (0 == (lifetime - age)) { bee.Die(); return; } age++; }
private void SetBeeNewBehaviorOnHittingTarget_Indoors(IBee bee, Rectangle environmentTargetDimmensions) { if (_beeCommon.BeeIsIndoors(bee.BeeEnvironmentBehavior)) { var beeReachesObject = _interactionManager.ObjectAIntersectsObjectB(bee.BeeIndoorsSize, environmentTargetDimmensions); if (beeReachesObject) { SetRandomBehaviorBee_OuterWorld(bee); } } }
public bool RemoveBeeAtEndOFLifeCycle(IBee bee) { var selectedBee = UpdateBeeLifeCycle(bee); if (selectedBee.BeeIsOnDisplayIndoors && selectedBee.BeeLifeCycleTotalCount <= 0) { bees.Remove(selectedBee); return(true); } return(false); }
private void SetOppositeMovementDirectionOnReachingOuterWorldLimits(IBee bee, Rectangle environmentDimmensions) { if (_beeCommon.BeeIsInOuterWorld(bee.BeeEnvironmentBehavior)) { var beeHitsLimits = _interactionManager.ObjectAIsBeyondObjectB(bee.BeeInOuterWorldSize, environmentDimmensions); if (beeHitsLimits) { bee.BeeOuterWorldMovementDirection = _movementSelector.GetOppositeMovement(bee.BeeOuterWorldMovementDirection); } } }
private void SetTargetBehaviorBee_PollenFlower(IBee bee) { SetBeeTargetBlossomingFlowerID(bee); if (!IsTargetFlowerStillBlossoming(bee)) { if (HasAFlowerIDBeenAssignedToBee(bee)) { RemoveFlowerIDFromBee(bee); } SetBeeTargetBlossomingFlowerID(bee); } }
public IBee UpdateBeeInfo_OnRandomMovement(IBee bee, Rectangle environmentDimmensions) { //Indoors SetRandomChangeOfMovementDirectionIndoors(bee); SetRandomChangeOfBehaviorIndoors(bee); SetOppositeMovementDirectionOnReachingIndoorsLimits(bee, environmentDimmensions); //OuterWorld SetRandomChangeOfMovementDirectionOuterWorld(bee); SetRandomChangeOfBehaviorOuterWorld(bee); SetOppositeMovementDirectionOnReachingOuterWorldLimits(bee, environmentDimmensions); return(bee); }
private void SetRandomChangeOfBehaviorIndoors(IBee bee) { if (_beeCommon.BeeIsIndoors(bee.BeeEnvironmentBehavior)) { if (bee.NextBeeBehaviorType == bee.BeeIterationBehaviorTypeCounter) { bee.BeeEnvironmentBehavior = _movementBehaviorCommandInvoker.SelectBehaviorRandomly(BeeEnvironmentEnum.Indoors); bee.BeeIterationBehaviorTypeCounter = 0; return; } bee.BeeIterationBehaviorTypeCounter++; } }
private void SetRandomChangeOfMovementDirectionOuterWorld(IBee bee) { if (_beeCommon.BeeIsInOuterWorld(bee.BeeEnvironmentBehavior)) { if (bee.NextBeeMovementCycle == bee.BeeIterationMovementCycleCounter) { bee.BeeOuterWorldMovementDirection = _beeCommon.GetSelectedMovement(bee.BeeEnvironmentBehavior); bee.NextBeeMovementCycle = rand.Next(_minNextMovementIteration, _maxNextMovementIteration); bee.BeeIterationMovementCycleCounter = 0; return; } bee.BeeIterationMovementCycleCounter++; } }
public IList<IBee> PopulateHive(GameSettings settings) { var hivePopulation = (settings.GetQueensConfig().Elements+ settings.GetWorkersConfig().Elements + settings.GetDronesConfig().Elements); var random = new Random((int)DateTime.Now.Ticks & 0x0000FFFF); var hive = new IBee[hivePopulation]; //TODO: Use a availableSlot Array splicing used units GenerateBees(beeType: typeof(Queen), container: hive, rule: settings.GetQueensConfig()); GenerateBees(beeType: typeof(Worker), container: hive, rule: settings.GetWorkersConfig()); GenerateBees(beeType: typeof(Drone), container: hive, rule: settings.GetDronesConfig()); return hive; }
private void GenerateBees(Type beeType, IBee[] container, GameRule rule) { var random = new Random((int)DateTime.Now.Ticks & 0x0000FFFF); do { var queenPosition = random.Next(0, container.Length); if (container[queenPosition] == null) { container[queenPosition] = (IBee)Activator.CreateInstance(beeType, new Bee(rule)); } } while (GetBeesNumber(container, beeType) < rule.Elements); }
public override IList<IBee> CheckStatus(IBee bee, IList<IBee> hive) { if (bee.LifeSpan == 0) { foreach (var _bee in hive) { do { _bee.Hit(); } while (_bee.LifeSpan > 0); } } return hive; }
private bool IsTargetFlowerStillBlossoming(IBee bee) { if (!HasAFlowerIDBeenAssignedToBee(bee)) { return(false); } if (bee.BeeTargetFlowerID != -1 && BeeIsGoingTowardsFlower(bee)) { //we get the flower by ID var selectedFlower = GetSelectedFlowerByID(bee.BeeTargetFlowerID); if (selectedFlower != null && selectedFlower.FlowerPollenArea.Width != 0 && selectedFlower.FlowerPollenArea.Height != 0) { return(true); } } return(false); }
private void SetBeeNewTargetedBehaviorOnHittingTarget_OuterWorld(IBee bee, Rectangle environmentTargetDimmensions) { if (_beeCommon.BeeIsInOuterWorld(bee.BeeEnvironmentBehavior)) { var beeReachesTarget = _interactionManager.ObjectAIntersectsObjectB(bee.BeeInOuterWorldSize, environmentTargetDimmensions); if (BeeIsGoingTowardsBeehiveEntrance(bee) && beeReachesTarget) { SetRandomBehaviorBee_Indoors(bee); } if (BeeIsGoingTowardsFlower(bee) && beeReachesTarget) { BeeExtractPollenFromFlower(bee); SetTargetBehaviorBee_BeehiveExitDoor(bee); } } }
//Create a Bee //paint Bee //update lifecycle Bee //remove Bee public void CreateBee() { IBee bee = (IBee)_lifeFactory.CreateLivingBeing(LivingEntityEnum.Bee); List <int> availableIds = bees.Select(a => a.BeeId).ToList(); bee.BeeId = _utilitiesResolver.GetMinimumNumberFromASequenceOfNumbers(availableIds); bee.BeeLifeCycleTotalCount = rand.Next(_minBeeLifeCycle, _maxBeeLifeCycle); int selectedIndex = GetRandomWingIndex(BeeEnvironmentEnum.Indoors); BeeWingMovementCycle beeWingAnimationInfo = _beeWingsMovementInvoker.GetBeeSelectedWingAnimation(selectedIndex, BeeEnvironmentEnum.Indoors); bee.BeeIndexWingAnimation = beeWingAnimationInfo.BeeWingMovementIndex; bee.BeeIsOnDisplayIndoors = true; bee.BeeIndoorsWingAnimationImage = beeWingAnimationInfo.BeeWingMovementImage; var beeRandomLocationPoint = GetIndoorsRandomLocationPoint(); var beeIndoorSize = new Size(_widthBeeIndoors, _heightBeeIndoors); bee.BeeIndoorsSize = new Rectangle(beeRandomLocationPoint, beeIndoorSize); bee.BeeEnvironmentBehavior = _movementBehaviorCommandInvoker.SelectBehaviorRandomly(BeeEnvironmentEnum.Indoors); Point exitDoorLocationPoint = new Point(_beehiveExitDoorDimmensions.X, _beehiveExitDoorDimmensions.Y); bee.BeeIndoorsMovementDirection = _beeCommon.GetSelectedMovement(bee.BeeEnvironmentBehavior, beeRandomLocationPoint, exitDoorLocationPoint); bee.BeeIsOnDisplayOuterWorld = false; BeeWingMovementCycle BeeWingsInOuterWorld = _beeWingsMovementInvoker.GetBeeSelectedWingAnimation(selectedIndex, BeeEnvironmentEnum.OuterWorld); bee.BeeOuterWorldWingAnimationImage = BeeWingsInOuterWorld.BeeWingMovementImage; var beehiveWorldEntranceLocationPoint = new Point(_hiveInWorldEntranceDoorLocationX, _hiveInWorldEntranceDoorLocationY); var beeWorldSize = new Size(_widthBeeWorld, _heightBeeWorld); bee.BeeInOuterWorldSize = new Rectangle(beehiveWorldEntranceLocationPoint, beeWorldSize); bee.BeeOuterWorldMovementDirection = MovementDirectionEnum.Static; bee.NextBeeMovementCycle = rand.Next(_minNextMovementIteration, _maxNextMovementIteration); bee.BeeIterationMovementCycleCounter = 0; bee.NextBeeBehaviorType = rand.Next(_minNextBehaviorIteration, _maxNextBehaviorIteration); bee.BeeIterationBehaviorTypeCounter = 0; bee.BeeTargetFlowerID = -1; bee.BeePollenCarryingCapacity = rand.Next(_beeMinimumPollenCarryingCapacity, _beeMaximumPollenCarryingCapacity); bee.BeePollenCollected = 0; bees.Add(bee); }
private IBee BeeExtractPollenFromFlower(IBee bee) { var selectedFlower = GetSelectedFlowerByID(bee.BeeTargetFlowerID); if (selectedFlower != null) { var flowerRemainingPollen = selectedFlower.FlowerPollenContainer - bee.BeePollenCarryingCapacity; bee.BeePollenCollected = bee.BeePollenCarryingCapacity; selectedFlower.FlowerPollenContainer = flowerRemainingPollen; if (flowerRemainingPollen <= 0) { selectedFlower.FlowerPollenContainer = 0; bee.BeePollenCollected = 0; } } return(bee); }
private void SetRandomChangeOfBehaviorOuterWorld(IBee bee) { if (_beeCommon.BeeIsInOuterWorld(bee.BeeEnvironmentBehavior)) { if (bee.NextBeeBehaviorType == bee.BeeIterationBehaviorTypeCounter) { bee.BeeEnvironmentBehavior = _movementBehaviorCommandInvoker.SelectBehaviorRandomly(BeeEnvironmentEnum.OuterWorld); //If the selected random behavior is OuterWorldTargetBeehiveEntrance we execute the selector again //until the bee goes to random or to target flower if (bee.BeeEnvironmentBehavior == BeeEnvironmentBehaviorEnum.OuterWorldTargetBeehiveEntrance) { SetRandomChangeOfBehaviorOuterWorld(bee); } bee.BeeIterationBehaviorTypeCounter = 0; return; } bee.BeeIterationBehaviorTypeCounter++; } }
public override void Update(IBee bee, UpdateContext context) { var beehive = bee.Beehive; var currentBeesCount = beehive.Bees.Count(); if (beehive.MaximumNumberOfBees > currentBeesCount) { var choice = random.NextDouble(); if (choice < 0.9d) { return; } var newbee = new Bee(beehive, currentBeesCount + 1, new WorkingBeeBehaviour(random.Next(100, 500))); beehive.AddBee(newbee); } }
/// <summary> /// Начать производство пчёл. /// </summary> private async void ProduceBee() { await Task.Delay(this.balance.QueenBalance.TimeToProduceBee); if (!this.isWorking) { return; } IBee newBee = this.CreateRandomBee(); this.SafePerformAction(new BeeActionNotification { SenderBee = this, RelatedBee = newBee, ActionType = BeeActionType.ProduceBee }); await Task.Factory.StartNew(this.ProduceBee); }
public IBee SetNextBeeWingMovementCycle(IBee bee, BeeEnvironmentEnum beeEnvironment) { var nextIndex = bee.BeeIndexWingAnimation + 1; if (nextIndex == _beeWingsMovementInvoker.GetTotalBeeAmimationWingFrames(beeEnvironment)) { nextIndex = 0; } BeeWingMovementCycle nextBeeWingMovement = _beeWingsMovementInvoker.GetBeeSelectedWingAnimation(nextIndex, beeEnvironment); bee.BeeIndexWingAnimation = nextBeeWingMovement.BeeWingMovementIndex; if (_beeCommon.BeeIsIndoors(bee.BeeEnvironmentBehavior)) { bee.BeeIndoorsWingAnimationImage = nextBeeWingMovement.BeeWingMovementImage; } if (_beeCommon.BeeIsInOuterWorld(bee.BeeEnvironmentBehavior)) { bee.BeeOuterWorldWingAnimationImage = nextBeeWingMovement.BeeWingMovementImage; } return(bee); }
private int GetBeesNumber(IBee[] hive, Type beeType) { return hive.Where(b => b != null && b.GetType().Equals(beeType)).Select(b => b).Count(); }
public Worker(IBee bee) :base(bee) { }
public Drone(IBee bee):base(bee) { }
public Bee(IBee bee) : base() { LifeSpan = bee.LifeSpan; DamageOnHit = bee.DamageOnHit; }
public virtual IList<IBee> CheckStatus(IBee bee, IList<IBee> hive) { return hive; }
public Queen(IBee bee) : base(bee) { }