private void AssertEv(Ev aEv, GameRules.PlayerAction aAction, float a2DecimalEv, object aInfo)
        {
            var evDiff = Math.Abs(Math.Round(aEv.m_Ev, 2) - a2DecimalEv);

            Assert.AreEqual(aEv.m_PlayerAction, aAction);
            Assert.IsTrue(evDiff < 0.01, aAction + " EvDiff is: " + evDiff);
            Assert.AreEqual(aEv.m_Info, aInfo);
        }
        private Ev GenerateShortTermCardEv()
        {
            var highestCamelEv = m_CamelRankManager.GetHighestEv(m_CamelCards);
            Ev  retval         = new Ev
            {
                m_PlayerAction = GameRules.PlayerAction.PickShortTermCard,
                m_Ev           = highestCamelEv.Item2,
                m_Info         = GameRules.FullNameCamel(highestCamelEv.Item1)
            };

            return(retval);
        }
        public Ev GetEv()
        {
            Dictionary <char, double[]> camelRanks          = GetAverageCamelRankInfo();
            Tuple <char, double>        highestEvFirstPlace = new Tuple <char, double>('x', -10f);
            Tuple <char, double>        highestEvLastPlace  = new Tuple <char, double>('x', -10f);

            foreach (var cr in camelRanks)
            {
                double ev = LongTermCardGuesser.Instance.GetPriceForFirst(cr.Key) * cr.Value[0];
                if (ev > highestEvFirstPlace.Item2)
                {
                    highestEvFirstPlace = new Tuple <char, double>(cr.Key, ev);
                }

                ev = LongTermCardGuesser.Instance.GetPriceForLast(cr.Key) * cr.Value[4];                //todo magic number
                if (ev > highestEvLastPlace.Item2)
                {
                    highestEvLastPlace = new Tuple <char, double>(cr.Key, ev);
                }
            }

            Tuple <char, double> highest;
            bool isFirst;

            if (highestEvFirstPlace.Item2 > highestEvLastPlace.Item2)
            {
                highest = highestEvFirstPlace;
                isFirst = true;
            }
            else
            {
                highest = highestEvLastPlace;
                isFirst = false;
            }

            string info = String.Format("{0} cards pour le {1}, avec une proportion de {2}",
                                        isFirst? "First" : "Last", GameRules.FullNameCamel(highest.Item1), GetTotalProportionAllRankManagers);

            Ev retval = new Ev
            {
                m_PlayerAction = GameRules.PlayerAction.PickLongTermCard,
                m_Ev           = (float)highest.Item2,
                m_Info         = info
            };

            return(retval);
        }
        private Ev GeneratePutTrapEv()
        {
            List <int> highestCases = new List <int> {
                0
            };

            for (int i = 0; i < m_CasesLandedOn.Length; i++)
            {
                if (m_CasesLandedOn[i] >= m_CasesLandedOn[highestCases[0]])
                {
                    if (m_CasesLandedOn[i] > m_CasesLandedOn[highestCases[0]])
                    {
                        highestCases.Clear();
                    }

                    highestCases.Add(i);
                }
            }

            string casesRank = string.Empty;

            for (int i = 0; i < highestCases.Count; i++)
            {
                if (i != 0)
                {
                    casesRank += ", ";
                }
                casesRank += highestCases[i];
            }

            Ev retval = new Ev
            {
                m_PlayerAction = GameRules.PlayerAction.PutTrap,
                m_Ev           = (float)m_CasesLandedOn[highestCases[0]] / (float)m_TotalSubBoardWithWeight * GameRules.TRAP_REWARD,
                m_Info         = string.Format("Case(s): {0}. Minus Trap. Pas EV exacte.", casesRank)
            };

            return(retval);
        }
        public override string ToString()
        {
            string retval = string.Format("\n\nAnalyze of {0} boards with a weight of {1}\n", m_Boards.Count, m_TotalSubBoardWithWeight);

            retval += "---------------------------------\n";

            //retval += m_CamelRankManager.ToString(m_CamelCards);

            retval += "---------------------------------\n";

            retval += string.Format("Highest card short term is\nEV: {1} {0}\n\n", m_Evs[0].m_Info, m_Evs[0].m_Ev.ToString("N2"));
            retval += string.Format("HighestCase               \nEV: {1} {0}\n\n", m_Evs[1].m_Info, m_Evs[1].m_Ev.ToString("N2"));
            retval += string.Format("Highest card long term is \nEV: {1} {0}\n\n", m_Evs[2].m_Info, m_Evs[2].m_Ev.ToString("N2"));
            retval += string.Format("RollDice                  \nEV: {0} {1}\n\n", m_Evs[3].m_Ev.ToString("N2"), m_Evs[3].m_Info);

            retval += "---------------------------------\n";
            retval += "---------------------------------\n";

            Ev biggestEv = GetSortedtEvs()[0];

            retval += string.Format("BestAction: {0} EV: {1}. {2} \n", biggestEv.m_PlayerAction, biggestEv.m_Ev.ToString("N2"), biggestEv.m_Info);

            return(retval);
        }
        private Ev GenerateRollDiceEv()
        {
            float evNextTurn = 0;

            foreach (var camel in GameRules.IDENTITY_CAMEL_NAME_UNROLLED)
            {
                if (m_OriginBoard.Contains(camel.ToString()))
                {
                    evNextTurn += new BoardAnalyzer(m_OriginBoard, m_Boards, m_CamelCardString, camel.ToString()).GetSortedtEvs()[0].m_Ev;
                }
            }


            evNextTurn = evNextTurn / GameRules.IDENTITY_CAMEL_NAME_UNROLLED.Length;
            float secondEv = GetSortedtEvs()[1].m_Ev;

            Ev retval = new Ev
            {
                m_PlayerAction = GameRules.PlayerAction.RollDice,
                m_Ev           = GameRules.TRAP_REWARD - (evNextTurn - secondEv)
            };

            return(retval);
        }