示例#1
0
        private void DoMove()
        {
            moveRecursionDepth++;
            Vector2i tribeCenter             = _animal.Tribe.PositionInTiles;
            Vector2i animalPosition          = _animal.PositionInTiles;
            float    difX                    = tribeCenter.X - animalPosition.X;
            float    difY                    = tribeCenter.Y - animalPosition.Y;
            float    distanceToCenterSquared = difX * difX + difY * difY;

            float temperaturAtPosition = _animal.World.GetTileOnPosition(animalPosition).GetTileProperties().TemperatureInKelvin;
            float diffrerenceToPreferredTemperature = Math.Abs(_animal.PreferredTemperature - temperaturAtPosition);

            float HeightAtPosition             = _animal.World.GetTileOnPosition(animalPosition).GetTileProperties().HeightInMeters;
            float diffrerenceToPreferredHeight = Math.Abs(_animal.PreferredAltitude - HeightAtPosition);

            Direction moveDirection = DirectionExtensions.RandomDirection();

            Vector2i newAnimalPosition          = _animal.PositionInTiles + moveDirection.DirectionToVector();
            float    dif2X                      = tribeCenter.X - newAnimalPosition.X;
            float    dif2Y                      = tribeCenter.Y - newAnimalPosition.Y;
            float    newDistanceToCenterSquared = dif2X * dif2X + dif2Y * dif2Y;

            float temperaturAtNewPosition = _animal.World.GetTileOnPosition(newAnimalPosition).GetTileProperties().TemperatureInKelvin;
            float newDiffrerenceToPreferredTemperature = Math.Abs(_animal.PreferredTemperature - temperaturAtNewPosition);
            float temperatureGain = diffrerenceToPreferredTemperature - newDiffrerenceToPreferredTemperature;

            float HeightAtNewPosition             = _animal.World.GetTileOnPosition(newAnimalPosition).GetTileProperties().HeightInMeters;
            float newDiffrerenceToPreferredHeight = Math.Abs(_animal.PreferredAltitude - HeightAtNewPosition);
            float HeightGain = diffrerenceToPreferredHeight - newDiffrerenceToPreferredHeight;

            float penality = 0.8f;


            if (newDistanceToCenterSquared > distanceToCenterSquared)
            {
                penality -= _animal.GroupBehaviour;
            }
            if (newDiffrerenceToPreferredTemperature < diffrerenceToPreferredTemperature)
            {
                penality += temperatureGain * 2.0f;
            }
            if (newDiffrerenceToPreferredHeight < diffrerenceToPreferredHeight)
            {
                penality += HeightGain / 4.0f;
            }



            if (RandomGenerator.Random.NextDouble() <= penality)
            {
                _animal.Move(moveDirection);
            }
            else
            {
                if (moveRecursionDepth < 20)
                {
                    DoMove();
                }
                else
                {
                    return;
                }
            }
        }
示例#2
0
 private void DoMove()
 {
     _animal.Move(DirectionExtensions.RandomDirection());
 }