private void MakeTurn(Membrane currentCreature) { try { var turnResult = currentCreature.Turn(EatMatrix, Creatures); var action = turnResult.Item1; var direction = turnResult.Item2; switch (action) { case ActionEnum.Die: MakeTurnDie(currentCreature.Position); break; case ActionEnum.MakeChild: MakeTurnMakeChild(direction, currentCreature); break; case ActionEnum.Go: MakeTurnGo(direction, currentCreature); break; case ActionEnum.Eat: currentCreature.Eat(EatMatrix); break; default: throw new Exception(); } } catch (Exception) { MakeTurnDie(currentCreature.Position); EXCEPTIONS++; } }
public Matrix(int length, int height, Creator creator, IFoodDistributionStrategy strategy) { Length = length; Height = height; _creator = creator; EatMatrix = new FoodMatrix(length, height, strategy); Creatures = new Membrane[length, height]; }
private void MakeTurnMakeChild(DirectionEnum direction, Membrane creature) { if (direction == DirectionEnum.Stay) { return; } var childPoint = DirectionEx.PointByDirection(direction, creature.Position); if (CommonMethods.IsValidAndFree(childPoint, Creatures)) { Creatures[childPoint.X, childPoint.Y] = creature.MakeChild(childPoint); } }
private void MakeTurnGo(DirectionEnum direction, Membrane creature) { if (direction == DirectionEnum.Stay) { return; } var newPosition = DirectionEx.PointByDirection(direction, creature.Position); if (!CommonMethods.IsValidAndFree(newPosition, Creatures)) { return; } creature.Move(Creatures, newPosition); Stats.AddStats(direction); }
private void MakeTurnMakeChild(DirectionEnum direction, Membrane creature) { if (direction == DirectionEnum.Stay) return; var childPoint = DirectionEx.PointByDirection(direction, creature.Position); if (CommonMethods.IsValidAndFree(childPoint, Creatures)) { Creatures[childPoint.X, childPoint.Y] = creature.MakeChild(childPoint); } }
private void MakeTurnGo(DirectionEnum direction, Membrane creature) { if (direction == DirectionEnum.Stay) return; var newPosition = DirectionEx.PointByDirection(direction, creature.Position); if (!CommonMethods.IsValidAndFree(newPosition, Creatures)) return; creature.Move(Creatures, newPosition); Stats.AddStats(direction); }
private DirectionEnum GetDirectionForChild(Membrane[,] creatures) { var points = CommonMethods.GetPoints(Position); var directions = (from item in points where CommonMethods.IsValidAndFree(item, creatures) select DirectionEx.DirectionByPoints(Position, item)).ToList(); return directions.Count == 0 ? DirectionEnum.Stay : directions.ElementAt(_random.Next(directions.Count)); }
public Tuple<ActionEnum, DirectionEnum> Turn(FoodMatrix eatMatrix, Membrane[,] creatures) { if (HasToDie()) return Tuple.Create(ActionEnum.Die, DirectionEnum.Stay); _energyPoints -= CreatureConstants.MinFoodToSurvive; var result = Creature.MyTurn(eatMatrix, creatures, Position, _random, HasOneBite(eatMatrix), _energyPoints); return result.Item1 == ActionEnum.MakeChild ? Tuple.Create(ActionEnum.MakeChild, GetDirectionForChild(creatures)) : result; }
public void Move(Membrane[,] creatures, Point newPosition) { creatures[Position.X, Position.Y] = null; Position = newPosition; creatures[Position.X, Position.Y] = this; }