public FutureTricks SolveBoardPbn(BridgeGame game, int target, int solutions, int mode) { if (game.CurrentTrick.Deck.Count > 3) { throw new ArgumentException("Invalid current trick cards count", "CurrentTrick.Deck.Count"); } var deal = new DealPbn(); deal.trump = game.Contract.Trump.Order; deal.first = game.CurrentTrick.TrickDealer.Order; deal.currentTrickRank = new int[3]; deal.currentTrickSuit = new int[3]; for (int i = 0; i < game.CurrentTrick.Deck.Count; i++) { var card = game.CurrentTrick.Deck.Cards[i]; deal.currentTrickRank[i] = card.Rank.Score; deal.currentTrickSuit[i] = card.Suit.Order; } deal.remainCards = DdsHelper.PbnStringToChars(BridgeHelper.ToPbn(game)); var ddsResult = new Integration.FutureTricks(); //TODO: Support mutiple threads. var res = DdsImport.SolveBoardPBN(deal, target, solutions, mode, ref ddsResult, 0); if (res != 1) { throw new DdsSolveBoardException(res); } var result = new FutureTricks(); result.Cards = ddsResult.cards; result.Nodes = ddsResult.nodes; result.Scores = ddsResult.score.ToList(); for (int i = 0; i < 13; i++) { if (ddsResult.rank[i] != 0) { var rank = new Rank(ddsResult.rank[i]); var suit = new Suit(ddsResult.suit[i]); result.FutureCards.Cards.Add(new Card(rank, suit)); } else { break; } } return(result); }
public static List <Contract> CalculateMakeableContracts(string pbn) { var ret = new List <Contract>(); var results = new DdTableResults(); var dto = new DdTableDealPbn(DdsHelper.PbnStringToChars(pbn)); var res = DdsImport.CalcDDtablePBN(dto, ref results); if (res != 1) { throw new DdsCalcDDtableException(res); } /* * S H D C NT * N 0 4 8 12 16 * E 1 5 9 13 17 * S 2 6 10 14 18 * W 3 7 11 15 19 */ var index = 0; foreach (Trump trump in Trump.Trumps) { foreach (PlayerPosition player in PlayerPosition.Players) { ret.Add(new Contract() { Trump = trump, PlayerPosition = player, Level = results.resTable[index] - 6 }); index++; } } return(ret); }