Beispiel #1
0
        public Contract GetBestUndoubledContract(IQueryable <Contract> contractList, SysVulnerabilityEnum vulnerability)
        {
            var bestNSContract = contractList
                                 .PlayedByNS()
                                 .OrderByDescending(c => CalculateScore(c, c.TricksToBeMade, vulnerability))
                                 .FirstOrDefault();

            var bestEWContract = contractList
                                 .PlayedByEW()
                                 .OrderBy(c => CalculateScore(c, c.TricksToBeMade, vulnerability))
                                 .FirstOrDefault();

            if (bestNSContract == null && bestEWContract == null)
            {
                return(null);
            }
            if (bestNSContract == null)
            {
                return(bestEWContract);
            }
            if (bestEWContract == null)
            {
                return(bestNSContract);
            }

            return(bestNSContract.CanBidOver(bestEWContract) ? bestNSContract : bestEWContract);
        }
Beispiel #2
0
        public void TestBestUndoubledContractIsComputed()
        {
            //Arrange
            const string pbnDeal = "W:752.854.Q3.A8732 AT83.T.AK9752.K9 KJ6.AKQJ732..J54 Q94.96.JT864.QT6";
            const SysVulnerabilityEnum vulnerability = SysVulnerabilityEnum.None;

            var module            = new ContractScoreCalculatorModule();
            var makeableContracts = DoubleDummyModule.CalculateMakeableContracts(pbnDeal);
            //Act
            var result = module.GetBestUndoubledContract(makeableContracts.AsQueryable(), vulnerability);

            //Assert
            Assert.AreEqual(3, result.Level);
            Assert.AreEqual(Trump.Spades, result.Trump);
        }
Beispiel #3
0
        public void TestOptimalContractIsComputed()
        {
            //Arrange
            const string pbnDeal = "W:752.854.Q3.A8732 AT83.T.AK9752.K9 KJ6.AKQJ732..J54 Q94.96.JT864.QT6";
            const SysVulnerabilityEnum vulnerability = SysVulnerabilityEnum.None;

            var module = new ContractScoreCalculatorModule();

            //Act
            var result = module.ComputeOptimalContract(pbnDeal, vulnerability);

            //Assert
            Assert.AreEqual(100, result.Item1);
            Assert.AreEqual(4, result.Item2.Level);
            Assert.AreEqual(Trump.Hearts, result.Item2.Trump);
            Assert.IsTrue(result.Item2.PlayerPosition == PlayerPosition.East || result.Item2.PlayerPosition == PlayerPosition.West);
        }
Beispiel #4
0
        public int CalculateScore(Contract c, string tricksMade, SysVulnerabilityEnum vulnerability)
        {
            if (tricksMade.Length == 0)
            {
                return(0);
            }

            var firstLetter = tricksMade.ElementAt(0);

            if (firstLetter == '=')
            {
                return(CalculateScore(c, c.TricksToBeMade, vulnerability));
            }
            var tricks = int.Parse(tricksMade.ElementAt(1).ToString(CultureInfo.InvariantCulture));

            return(firstLetter == '+' ? CalculateScore(c, c.TricksToBeMade + tricks, vulnerability) : CalculateScore(c, c.TricksToBeMade - tricks, vulnerability));
        }
Beispiel #5
0
        public int CalculateScore(Contract c, int tricksMade, SysVulnerabilityEnum vulnerability)
        {
            _contract = c;

            if (c.Level == 0)
            {
                return(0);
            }

            SetVulnerability(vulnerability);
            SetContractType();

            var trickDifference = tricksMade - _contract.TricksToBeMade;

            var score = trickDifference >= 0 ? CalculateContractMadePoints(trickDifference) : -1 * CalculateContractPenaltyPoints(Math.Abs(trickDifference));

            return(_contract.PlayerPosition == PlayerPosition.North || _contract.PlayerPosition == PlayerPosition.South ? score : -1 * score);
        }
Beispiel #6
0
        public Tuple <int, Contract> ComputeOptimalContract(string pbnDeal, SysVulnerabilityEnum vulnerabilty)
        {
            var makeableContracts = DoubleDummyModule.CalculateMakeableContracts(pbnDeal).AsQueryable();

            var bestContract = GetBestUndoubledContract(makeableContracts, vulnerabilty);

            var bestScore = CalculateScore(bestContract, bestContract.TricksToBeMade, vulnerabilty);

            var contractPlayedByNs = bestContract.PlayerPosition == PlayerPosition.North ||
                                     bestContract.PlayerPosition == PlayerPosition.South;

            var nextContract = bestContract;

            for (var i = 0; i < 5; i++)
            {
                nextContract = nextContract.GetNextContract();
                if (nextContract == null)
                {
                    break;
                }

                var contracts = makeableContracts.GetContractsByTrumpAndPlayingSide(contractPlayedByNs, nextContract.Trump)
                                .ToList();

                nextContract.Doubled        = true;
                nextContract.PlayerPosition = contractPlayedByNs ? PlayerPosition.East : PlayerPosition.North;

                contracts.ForEach(contract =>
                {
                    var tricksDown = nextContract.Level - contract.Level;
                    var score      = CalculateScore(nextContract, nextContract.TricksToBeMade - tricksDown, vulnerabilty);
                    if (Math.Abs(score) >= Math.Abs(bestScore))
                    {
                        return;
                    }

                    bestScore    = score;
                    bestContract = nextContract.Clone();
                });
            }

            return(new Tuple <int, Contract>(bestScore, bestContract));
        }
Beispiel #7
0
        private void SetVulnerability(SysVulnerabilityEnum vulnerability)
        {
            switch (vulnerability)
            {
            case SysVulnerabilityEnum.All:
                _vulnerable = true;
                break;

            case SysVulnerabilityEnum.NS:
                _vulnerable = _contract.PlayerPosition == PlayerPosition.North ||
                              _contract.PlayerPosition == PlayerPosition.South;
                break;

            case SysVulnerabilityEnum.EW:
                _vulnerable = _contract.PlayerPosition == PlayerPosition.East ||
                              _contract.PlayerPosition == PlayerPosition.West;
                break;

            default:
                _vulnerable = false;
                break;
            }
        }
        /// <summary>
        /// We use LIN format ex: http://www.bridgebase.com/tools/handviewer.html?lin=md|1S2389JHTD3JC237KA,S7TH4QKD678TC4569,S456KAH25D25KACJQ,|rh||ah|Board%207|sv|e|
        /// </summary>
        /// <param name="pbnRepresentation"></param>
        /// <param name="boardNo"></param>
        /// <param name="vulnerability"></param>
        /// <returns></returns>
        public static string ConvertPBNToHandViewerInput(string pbnRepresentation, int boardNo, SysVulnerabilityEnum vulnerability)
        {
            var split = pbnRepresentation.Split(':');

            var dealer = split[0].ToLower();
            var hands  = split[1].Split(' ');
            var order  = new List <string> {
                "s", "w", "n", "e"
            };
            var suitOrder = new List <string> {
                "S", "H", "D", "C"
            };

            var indexOfDeclarer = order.IndexOf(dealer);
            var parsedHands     = new string[4];

            var sb = new StringBuilder("http://www.bridgebase.com/tools/handviewer.html?lin=md|");

            sb.Append(String.Format("{0}", (indexOfDeclarer + 1)));

            for (var i = indexOfDeclarer; i < indexOfDeclarer + 4; i++)
            {
                var currentHand = hands[i - indexOfDeclarer];
                var suits       = currentHand.Split('.');

                var hand = new StringBuilder();

                for (var j = 0; j < 4; j++)
                {
                    hand.Append(suitOrder[j]).Append(suits[j]);
                }

                parsedHands[i % 4] = hand.ToString();
            }

            for (var i = 0; i < 4; i++)
            {
                sb.Append(String.Format("{0},", parsedHands[i]));
            }

            sb.Append(String.Format("|rh||ah|Board {0}|sv|", boardNo));
            //It takes values of n, e, b, and -
            switch (vulnerability)
            {
            case SysVulnerabilityEnum.All:
                sb.Append("b|"); break;

            case SysVulnerabilityEnum.EW:
                sb.Append("e|"); break;

            case SysVulnerabilityEnum.NS:
                sb.Append("n|"); break;

            case SysVulnerabilityEnum.None:
                sb.Append("-|"); break;
            }

            return(sb.ToString());
        }