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