示例#1
0
        public Env(double?positiveness1 = 1, bool allowChange1    = false,
                   double?positiveness2 = null, bool allowChange2 = true,
                   bool increase2       = false,
                   double?positiveness3 = null)
        {
            if (positiveness1 < 0 || positiveness1 > 1 ||
                positiveness2 < 0 || positiveness2 > 1 ||
                positiveness3 < 0 || positiveness3 > 1)
            {
                throw new ArgumentException("Позитивность должна быть в интервале 0..1");
            }

            PersonageMatrix = new Personage[Width, Height];
            AllPersonages   = new List <Personage>();

            for (int x = 0; x < PersonageMatrix.GetLength(0); x++)
            {
                for (int y = 0; y < PersonageMatrix.GetLength(1); y++)
                {
                    Personage p = new Personage(x, y, null);
                    p.Positiveness        = positiveness3;
                    PersonageMatrix[x, y] = p;
                    AllPersonages.Add(p);
                }
            }

            int p1X = 3;
            int p2X = Width - 4;

            if (p1X >= p2X)
            {
                throw new ArgumentException("Слишком малый размер поля по X", nameof(Width));
            }

            /// делаем персонажи в центре поля ключевыми
            var p1 = PersonageMatrix[p1X, Height / 2];

            p1.Positiveness            = positiveness1;
            p1.IsKey                   = true;
            p1.AllowChangePositiveness = allowChange1;

            var p2 = PersonageMatrix[p2X, Height / 2];

            p2.Positiveness = positiveness2;
            p2.IsKey        = true;
            /// тут лучше даже true поставить в будущем, но интересны оба значения
            p2.AllowChangePositiveness  = allowChange2;
            p2.AutoIncreasePositiveness = increase2;
            if (p2.AutoIncreasePositiveness)
            {
                p2.AllowChangePositiveness = true;
            }
        }
示例#2
0
 double GetPositivenessChangeEffectiveness(Personage source)
 {
     /// у более богатых стратегия перенимается быстрее, потому
     /// что подсознательно есть стремление жить так же хорошо
     if (source.Wealth > Wealth)
     {
         return(1);
     }
     else if (source.Wealth >= Wealth / 2.0)
     {
         return(0.5);
     }
     else
     {
         return(0.2);
     }
 }
示例#3
0
        double GetInfluenceEffectiveness(Personage target, bool isHelp)
        {
            double eff1;

            if (Wealth < target.Wealth / 2.0)
            {
                eff1 = 0;
            }
            if (Wealth < target.Wealth)
            {
                eff1 = 0.3;
            }
            else if (Wealth < 2 * target.Wealth)
            {
                eff1 = 0.7;
            }
            else
            {
                eff1 = 1;
            }

            double eff2;

            if (!target.Positiveness.HasValue)
            {
                /// типа мало что умеет пока что
                eff2 = 0.5;
            }
            else if (isHelp)
            {
                /// если помогаем более позитивному, то он точно знает как
                /// распорядиться нашей помощью, эффективность 100%
                if (target.Positiveness >= Positiveness)
                {
                    eff2 = 1;
                }
                //// если помогаем тому, кто менее чем в 2 раза отличается
                /// от нашей позитивности в сторону негативности,
                /// то эффективность считаем 70%
                /// (помощь - это не только еда и крыша над головой, но и возможности
                /// для самореализации, которые не каждый умеет использовать с полной отдачей)
                else if (target.Positiveness >= Positiveness / 2.0)
                {
                    eff2 = 0.7;
                }
                else
                {
                    eff2 = 0.3;
                }
            }
            else
            {
                /// если отнимаем у более позитивного, то делается это не сложно
                /// с физической точки зрения
                if (target.Positiveness >= 2 * Positiveness)
                {
                    eff2 = 1;
                }
                if (target.Positiveness >= Positiveness)
                {
                    eff2 = 0.7;
                }
                /// отъем у того, кто более негативен, сложнее
                else if (target.Positiveness >= Positiveness / 2.0)
                {
                    eff2 = 0.5;
                }
                else
                {
                    eff2 = 0.2;
                }

                /// ничего не будет делать
                eff1 = eff2 = 0;
            }

            return(eff1 * eff2);
        }