From d76442512fd4314fcedbdc28a611f676ab70ce2b Mon Sep 17 00:00:00 2001 From: emkael Date: Wed, 25 May 2016 13:28:25 +0200 Subject: * project directory structure --- src/DDTable.cs | 148 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 src/DDTable.cs (limited to 'src/DDTable.cs') diff --git a/src/DDTable.cs b/src/DDTable.cs new file mode 100644 index 0000000..7ba8568 --- /dev/null +++ b/src/DDTable.cs @@ -0,0 +1,148 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Runtime.InteropServices; +using System.Text.RegularExpressions; + +namespace BCDD +{ + class DDTableInvalidException : FieldNotFoundException + { + public DDTableInvalidException() : base() { } + public DDTableInvalidException(String msg) : base(msg) { } + } + + class DDTable + { + private PBNBoard board; + + private int[,] getEmptyTable() + { + int[,] result = new int[4, 5]; + for (int i = 0; i < 4; i++) + { + for (int j = 0; j < 5; j++) + { + result[i, j] = -1; + } + } + return result; + } + + private int[,] validateTable(int[,] table) + { + foreach (int t in table) + { + if (t > 13 || t < 0) + { + throw new DDTableInvalidException("Invalid number of tricks: " + t.ToString()); + } + } + return table; + } + + public DDTable(PBNBoard board) + { + this.board = board; + } + + public int[,] GetBCalcTable() + { + int[,] result = this.getEmptyTable(); + String deal = this.board.GetLayout(); + IntPtr solver = BCalcWrapper.bcalcDDS_new(Marshal.StringToHGlobalAnsi("PBN"), Marshal.StringToHGlobalAnsi(deal), 0, 0); + for (int denom = 0; denom < 5; denom++) + { + BCalcWrapper.bcalcDDS_setTrumpAndReset(solver, denom); + for (int player = 0; player < 4; player++) + { + BCalcWrapper.bcalcDDS_setPlayerOnLeadAndReset(solver, BCalcWrapper.bcalc_declarerToLeader(player)); + result[player, denom] = 13 - BCalcWrapper.bcalcDDS_getTricksToTake(solver); + String error = Marshal.PtrToStringAuto(BCalcWrapper.bcalcDDS_getLastError(solver)); + if (error != null) + { + throw new DDTableInvalidException("BCalc error: " + error); + } + } + } + BCalcWrapper.bcalcDDS_delete(solver); + return this.validateTable(result); + } + + public int[,] GetJFRTable() + { + int[,] result = this.getEmptyTable(); + String ability = this.board.GetAbility(); + MatchCollection abilities = this.board.ValidateAbility(ability); + foreach (Match playerAbility in abilities) + { + char player = playerAbility.Groups[1].Value[0]; + int playerID = Array.IndexOf(BCalcWrapper.PLAYERS, player); + int denomID = 4; + foreach (char tricks in playerAbility.Groups[2].Value.ToCharArray()) + { + result[playerID, denomID] = (tricks > '9') ? (tricks - 'A' + 10) : (tricks - '0'); + denomID--; + } + } + return this.validateTable(result); + } + + public int[,] GetPBNTable() + { + List table = this.board.GetOptimumResultTable(); + List parsedTable = this.board.ValidateOptimumResultTable(table); + int[,] result = this.getEmptyTable(); + foreach (Match lineMatch in parsedTable) + { + char player = lineMatch.Groups[1].Value[0]; + char denom = lineMatch.Groups[2].Value[0]; + int tricks = Int16.Parse(lineMatch.Groups[3].Value); + int playerID = Array.IndexOf(BCalcWrapper.PLAYERS, player); + int denomID = Array.IndexOf(BCalcWrapper.DENOMINATIONS, denom); + result[playerID, denomID] = tricks; + } + return this.validateTable(result); + } + + public int[,] GetDDTable() + { + try + { + return this.GetJFRTable(); + } + catch (FieldNotFoundException) + { + try + { + return this.GetPBNTable(); + } + catch (FieldNotFoundException) + { + return this.GetBCalcTable(); + } + } + } + + public static void PrintTable(int[,] ddTable) + { + foreach (char header in BCalcWrapper.DENOMINATIONS) + { + Console.Write('\t'); + Console.Write(header); + } + Console.WriteLine(); + for (int i = 0; i < 4; i++) + { + Console.Write(BCalcWrapper.PLAYERS[i]); + for (int j = 0; j < 5; j++) + { + Console.Write('\t'); + Console.Write(ddTable[i, j].ToString()); + } + Console.WriteLine(); + } + } + } +} -- cgit v1.2.3