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) })); }
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); }
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)); }
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(); }