Пример #1
0
        private static void CalculateMakeableContracts(DealMetadata deal)
        {
            var contracts = DoubleDummyModule.CalculateMakeableContracts(deal.PBNRepresentation);

            contracts.ForEach(contract => deal.MakeableContracts.Add(new MakeableContractMetadata
            {
                Contract        = contract.Display(),
                Declarer        = contract.PlayerPosition.ConvertToSysPlayer(),
                Denomination    = contract.Trump.Order,
                Level           = contract.Level,
                HandViewerInput = deal.HandViewerInput + ParsePBNHelpers.ConvertToPbnBiddingSequence(contract, deal.Dealer)
            }));
        }
Пример #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);
        }
Пример #3
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));
        }
Пример #4
0
        static void Main(string[] args)
        {
            var dds     = new DoubleDummyModule();
            var pbnCode = "E:K9742.763.Q.K764 AT6.AJ98.A5.QT53 853.QT.KT742.J92 QJ.K542.J9863.A8";

            Console.WriteLine("Board: " + pbnCode);


            var res = DoubleDummyModule.CalculateMakeableContracts(pbnCode);

            Console.WriteLine("Best results:");
            foreach (var contract in res)
            {
                Console.WriteLine(contract);
            }

            var game = BridgeHelper.GetGameFromPbn(pbnCode, "4S", "W");

            Console.WriteLine("------------- Game Starts ----------------");
            Console.WriteLine("Trump: " + game.Contract.Trump);
            //var player = game.Declarer;
            var player = PlayerPosition.North;

            while (game.CardsRemaning > 0)
            {
                var result = dds.SolveBoardPbnBestCard(game);
                Console.WriteLine(player + ": " + result.Card + ". Score: " + result.Score);
                player = game.PlayCard(result.Card, player);

                if (game.CurrentTrick.Deck.Count == 0)
                {
                    Console.WriteLine("Trick Winner: " + game.Tricks.Last().TrickWinner);
                }
            }

            Console.WriteLine("-----------Results----------");
            Console.WriteLine("South/North: " + game.NorthSouthTricksMade + " tricks");
            Console.WriteLine("East/West: " + game.EastWestTricksMade + " tricks");

            Console.ReadKey();
        }