public Playing(int deviceNumber, Table table) { DeviceNumber = deviceNumber; Device device = AppData.DeviceList[deviceNumber]; BoardNumber = table.BoardNumber; // All directionNumbers are relative to the direction that is 0 int directionNumber = Utilities.DirectionToNumber(device.Direction); int northDirectionNumber = (4 - directionNumber) % 4; Direction = new string[4]; Direction[northDirectionNumber] = "North"; Direction[(northDirectionNumber + 1) % 4] = "East"; Direction[(northDirectionNumber + 2) % 4] = "South"; Direction[(northDirectionNumber + 3) % 4] = "West"; PairNumber = new int[4]; PlayerName = new string[4]; for (int i = 0; i < 4; i++) { PairNumber[i] = table.PairNumber[(directionNumber + i) % 4]; PlayerName[i] = table.PlayerName[(directionNumber + i) % 4]; } if (northDirectionNumber % 2 == 0) { Vuln02 = Utilities.NSVulnerability[(BoardNumber - 1) % 16]; Vuln13 = Utilities.EWVulnerability[(BoardNumber - 1) % 16]; } else { Vuln02 = Utilities.EWVulnerability[(BoardNumber - 1) % 16]; Vuln13 = Utilities.NSVulnerability[(BoardNumber - 1) % 16]; } // Set default values for no plays PlayCounter = -999; LastCardNumber = -1; LastCardString = ""; TrickNumber = 1; TricksNS = 0; TricksEW = 0; TrickLeadSuit = ""; TrickCardString = new string[4]; TrickRank = new int[4]; TrickSuit = new string[4]; TrickDisplayRank = new string[4]; TrickDisplaySuit = new string[4]; PreviousTrickDisplayRank = new string[4]; PreviousTrickDisplaySuit = new string[4]; for (int i = 0; i < 4; i++) { TrickCardString[i] = ""; TrickRank[i] = 0; TrickSuit[i] = ""; TrickDisplayRank[i] = ""; TrickDisplaySuit[i] = ""; PreviousTrickDisplayRank[i] = ""; PreviousTrickDisplaySuit[i] = ""; } PollInterval = Settings.PollInterval; if (AppData.IsIndividual) { PairOrPlayer = "Player"; } else { PairOrPlayer = "Pair"; } List <Play> playList = new List <Play>(); using (OdbcConnection connection = new OdbcConnection(AppData.DBConnectionString)) { connection.Open(); // Get contract details string SQLString = $"SELECT [NS/EW], Contract FROM IntermediateData WHERE Section={device.SectionID} AND [Table]={device.TableNumber} AND Round={device.RoundNumber} AND Board={BoardNumber}"; OdbcCommand cmd = new OdbcCommand(SQLString, connection); OdbcDataReader reader = null; string declarerNSEW = ""; try { ODBCRetryHelper.ODBCRetry(() => { reader = cmd.ExecuteReader(); if (reader.Read()) { declarerNSEW = reader.GetString(0); string contractString = reader.GetString(1); string[] temp = contractString.Split(' '); ContractLevel = Convert.ToInt32(temp[0]); ContractSuit = temp[1]; if (temp.Length > 2) { ContractX = temp[2]; } else { ContractX = ""; } } }); } finally { reader.Close(); cmd.Dispose(); } DisplayContract = Utilities.DisplayContract(ContractLevel, ContractSuit, ContractX); if (declarerNSEW == "N") { Declarer = "North"; } else if (declarerNSEW == "E") { Declarer = "East"; } else if (declarerNSEW == "S") { Declarer = "South"; } else if (declarerNSEW == "W") { Declarer = "West"; } PlayDirectionNumber = (northDirectionNumber + Utilities.DirectionToNumber(Declarer) + 1) % 4; DummyDirectionNumber = (northDirectionNumber + Utilities.DirectionToNumber(Declarer) + 2) % 4; // Get hand records and set cards HandRecord handRecord = HandRecords.HandRecordsList.Find(x => x.SectionID == device.SectionID && x.BoardNumber == BoardNumber); if (handRecord == null) // Can't find matching hand record, so use default SectionID = 1 { handRecord = HandRecords.HandRecordsList.Find(x => x.SectionID == 1 && x.BoardNumber == BoardNumber); } CardString = handRecord.HandTable(northDirectionNumber, ContractSuit); DisplayRank = new string[4, 13]; DisplaySuit = new string[4, 13]; CardPlayed = new bool[4, 13]; for (int i = 0; i < 4; i++) { for (int j = 0; j < 13; j++) { DisplayRank[i, j] = Utilities.DisplayRank(CardString[i, j]); DisplaySuit[i, j] = Utilities.DisplaySuit(CardString[i, j]); CardPlayed[i, j] = false; } } SuitLengths = handRecord.SuitLengths(northDirectionNumber, ContractSuit); // Check PlayData table for any previous plays SQLString = $"SELECT Counter, Direction, Card FROM PlayData WHERE Section={device.SectionID} AND Table={device.TableNumber} AND Round={device.RoundNumber} AND Board={BoardNumber}"; cmd = new OdbcCommand(SQLString, connection); try { ODBCRetryHelper.ODBCRetry(() => { reader = cmd.ExecuteReader(); while (reader.Read()) { string tempPlayDirection = reader.GetString(1); string tempCardString = reader.GetString(2); int tempPlayCounter = Convert.ToInt32(reader.GetValue(0)); if (tempPlayDirection == "N") { tempPlayDirection = "North"; } else if (tempPlayDirection == "E") { tempPlayDirection = "East"; } else if (tempPlayDirection == "S") { tempPlayDirection = "South"; } else if (tempPlayDirection == "W") { tempPlayDirection = "West"; } Play play = new Play(tempPlayDirection, 0, tempCardString, tempPlayCounter); playList.Add(play); } }); } finally { reader.Close(); cmd.Dispose(); } } playList.Sort((x, y) => x.PlayCounter.CompareTo(y.PlayCounter)); // Run through each played card (if any) in turn and work out the implications foreach (Play play in playList) { PlayDirectionNumber = (northDirectionNumber + Utilities.DirectionToNumber(play.PlayDirection)) % 4; PlayCounter = play.PlayCounter; int cardNumber; for (cardNumber = 0; cardNumber < 13; cardNumber++) { if (play.CardString == CardString[PlayDirectionNumber, cardNumber]) { break; } } CardPlayed[PlayDirectionNumber, cardNumber] = true; LastCardNumber = cardNumber; LastCardString = CardString[PlayDirectionNumber, cardNumber]; TrickCardString[PlayDirectionNumber] = LastCardString; TrickRank[PlayDirectionNumber] = Utilities.Rank(LastCardString); TrickSuit[PlayDirectionNumber] = Utilities.Suit(LastCardString); TrickDisplayRank[PlayDirectionNumber] = Utilities.DisplayRank(LastCardString); TrickDisplaySuit[PlayDirectionNumber] = Utilities.DisplaySuit(LastCardString); if (PlayCounter % 4 == 0) // First card in trick { TrickLeadSuit = TrickSuit[PlayDirectionNumber]; } if (PlayCounter % 4 == 3) // Last card in trick, so find out which card won the trick... { int winningDirectionNumber = -1; string winningSuit = TrickLeadSuit; int winningRank = 0; for (int i = 0; i < 4; i++) { string suit = Utilities.Suit(TrickCardString[i]); int rank = Utilities.Rank(TrickCardString[i]); if ((winningSuit == TrickLeadSuit && suit == TrickLeadSuit && rank > winningRank) || (winningSuit == ContractSuit && suit == ContractSuit && rank > winningRank)) { winningDirectionNumber = i; winningRank = rank; } else if (TrickLeadSuit != ContractSuit && winningSuit == TrickLeadSuit && suit == ContractSuit) { winningDirectionNumber = i; winningRank = rank; winningSuit = ContractSuit; } } // ... and update trick counts if (Direction[winningDirectionNumber] == "North" || Direction[winningDirectionNumber] == "South") { TricksNS++; } else { TricksEW++; } TrickNumber++; if (PlayCounter == 51) // The unlikely event that all cards played, but no result recorded to database { Result result = new Result(deviceNumber, BoardNumber, "IntermediateData"); result.TricksTakenNumber = (Declarer == "North" || Declarer == "South") ? TricksNS : TricksEW; result.UpdateDB("ReceivedData"); AppData.TableList.Find(x => x.SectionID == device.SectionID && x.TableNumber == device.TableNumber).PlayComplete = true; } else { PlayDirectionNumber = winningDirectionNumber; // Reset current trick info TrickLeadSuit = ""; for (int i = 0; i < 4; i++) { TrickCardString[i] = ""; TrickRank[i] = 0; TrickSuit[i] = ""; PreviousTrickDisplayRank[i] = TrickDisplayRank[i]; PreviousTrickDisplaySuit[i] = TrickDisplaySuit[i]; TrickDisplayRank[i] = ""; TrickDisplaySuit[i] = ""; } } } else { // Not last card in trick, so move play on to next hand. Only used if this is the last played card; otherwise overwritten PlayDirectionNumber = (PlayDirectionNumber + 1) % 4; } } // Update table info table.LastPlay = new Play(Utilities.Directions[PlayDirectionNumber], LastCardNumber, LastCardString, PlayCounter); }
public Bidding(int deviceNumber, Table table) { DeviceNumber = deviceNumber; Device device = AppData.DeviceList[deviceNumber]; BoardNumber = table.BoardNumber; Direction = device.Direction; int directionNumber = Utilities.DirectionToNumber(Direction); PairNumber = table.PairNumber[directionNumber]; PlayerName = table.PlayerName[directionNumber]; NSVulnerable = Utilities.NSVulnerability[(BoardNumber - 1) % 16]; EWVulnerable = Utilities.EWVulnerability[(BoardNumber - 1) % 16]; BidTable = new string[10, 4]; for (int i = 0; i < 10; i++) { for (int j = 0; j < 4; j++) { BidTable[i, j] = ""; } } LastCallDirection = ""; LastBidLevel = 0; LastBidSuit = ""; LastBidX = ""; LastBidDirection = ""; PassCount = 0; BidCounter = -1; ToBidDirection = ""; PollInterval = Settings.PollInterval; if (AppData.IsIndividual) { PairOrPlayer = "Player"; } else { PairOrPlayer = "Pair"; } List <DatabaseBid> databaseBidList = new List <DatabaseBid>(); using (OdbcConnection connection = new OdbcConnection(AppData.DBConnectionString)) { connection.Open(); Utilities.CheckTabPlayPairNos(connection); string SQLString = $"SELECT Counter, Bid, Direction FROM BiddingData WHERE Section={device.SectionID} AND Table={device.TableNumber} AND Round={device.RoundNumber} AND Board={BoardNumber}"; OdbcCommand cmd = new OdbcCommand(SQLString, connection); OdbcDataReader reader = null; try { ODBCRetryHelper.ODBCRetry(() => { reader = cmd.ExecuteReader(); while (reader.Read()) { int tempCounter = reader.GetInt32(0); string tempBid = reader.GetString(1); string tempDirection = reader.GetString(2); DatabaseBid databaseBid = new DatabaseBid { Counter = tempCounter, Bid = tempBid, Direction = tempDirection }; databaseBidList.Add(databaseBid); } }); } finally { reader.Close(); cmd.Dispose(); } } databaseBidList.Sort((x, y) => x.Counter.CompareTo(y.Counter)); foreach (DatabaseBid databaseBid in databaseBidList) { BidCounter = databaseBid.Counter; if (databaseBid.Direction == "N") { LastCallDirection = "North"; ToBidDirection = "East"; } else if (databaseBid.Direction == "E") { LastCallDirection = "East"; ToBidDirection = "South"; } else if (databaseBid.Direction == "S") { LastCallDirection = "South"; ToBidDirection = "West"; } else if (databaseBid.Direction == "W") { LastCallDirection = "West"; ToBidDirection = "North"; } if (databaseBid.Bid == "PASS") { PassCount++; BidTable[BidCounter / 4, BidCounter % 4] = "<span style='color:darkgreen'>Pass</span>"; } else if (databaseBid.Bid == "x") { PassCount = 0; BidTable[BidCounter / 4, BidCounter % 4] = "<span style='color:darkred'>X</span>"; LastBidX = "x"; LastBidDirection = LastCallDirection; } else if (databaseBid.Bid == "xx") { PassCount = 0; BidTable[BidCounter / 4, BidCounter % 4] = "<span style='color:darkblue'>XX</span>"; LastBidX = "xx"; LastBidDirection = LastCallDirection; } else { LastBidLevel = Convert.ToInt32(databaseBid.Bid.Substring(0, 1)); LastBidX = ""; LastBidDirection = LastCallDirection; LastBidSuit = databaseBid.Bid.Substring(1); if (LastBidSuit == "S") { BidTable[BidCounter / 4, BidCounter % 4] = LastBidLevel.ToString() + "<span style='color:black'>♠</span>"; } else if (LastBidSuit == "H") { BidTable[BidCounter / 4, BidCounter % 4] = LastBidLevel.ToString() + "<span style='color:red'>♥</span>"; } else if (LastBidSuit == "D") { BidTable[BidCounter / 4, BidCounter % 4] = LastBidLevel.ToString() + "<span style='color:orangered'>♦</span>"; } else if (LastBidSuit == "C") { BidTable[BidCounter / 4, BidCounter % 4] = LastBidLevel.ToString() + "<span style='color:darkblue'>♣</span>"; } else { BidTable[BidCounter / 4, BidCounter % 4] = LastBidLevel.ToString() + "NT"; } } } HandRecord handRecord = HandRecords.HandRecordsList.Find(x => x.SectionID == device.SectionID && x.BoardNumber == BoardNumber); if (handRecord == null) // Can't find matching hand record, so use default SectionID = 1 { handRecord = HandRecords.HandRecordsList.Find(x => x.SectionID == 1 && x.BoardNumber == BoardNumber); } CardString = handRecord.HandRow(device.Direction); DisplayRank = new string[13]; DisplaySuit = new string[13]; for (int i = 0; i < 13; i++) { DisplayRank[i] = Utilities.DisplayRank(CardString[i]); DisplaySuit[i] = Utilities.DisplaySuit(CardString[i]); } Dealer = handRecord.Dealer; BidDirections = new string[4]; int northDirectionNumber = (4 - Utilities.DirectionToNumber(Dealer)) % 4; BidDirections[northDirectionNumber] = "North"; BidDirections[(northDirectionNumber + 1) % 4] = "East"; BidDirections[(northDirectionNumber + 2) % 4] = "South"; BidDirections[(northDirectionNumber + 3) % 4] = "West"; if (ToBidDirection == "") { ToBidDirection = Dealer; } // Set table info table.LastBid = new Bid(LastCallDirection, LastBidLevel, LastBidSuit, LastBidX, false, LastBidDirection, PassCount, BidCounter); }
public static void Set() { if (HandRecordsList.Count > 0) { return; // Hand records already set } using (OdbcConnection connection = new OdbcConnection(AppData.DBConnectionString)) { string SQLString = $"SELECT Section, Board, NorthSpades, NorthHearts, NorthDiamonds, NorthClubs, EastSpades, EastHearts, EastDiamonds, EastClubs, SouthSpades, SouthHearts, SouthDiamonds, SouthClubs, WestSpades, WestHearts, WestDiamonds, WestClubs FROM HandRecord"; OdbcCommand cmd = new OdbcCommand(SQLString, connection); OdbcDataReader reader = null; connection.Open(); try { ODBCRetryHelper.ODBCRetry(() => { reader = cmd.ExecuteReader(); while (reader.Read()) { HandRecord handRecord = new HandRecord { SectionID = reader.GetInt16(0), BoardNumber = reader.GetInt16(1), NorthSpades = reader.GetString(2), NorthHearts = reader.GetString(3), NorthDiamonds = reader.GetString(4), NorthClubs = reader.GetString(5), EastSpades = reader.GetString(6), EastHearts = reader.GetString(7), EastDiamonds = reader.GetString(8), EastClubs = reader.GetString(9), SouthSpades = reader.GetString(10), SouthHearts = reader.GetString(11), SouthDiamonds = reader.GetString(12), SouthClubs = reader.GetString(13), WestSpades = reader.GetString(14), WestHearts = reader.GetString(15), WestDiamonds = reader.GetString(16), WestClubs = reader.GetString(17) }; handRecord.Dealer = Utilities.GetDealerForBoard(handRecord.BoardNumber); HandRecordsList.Add(handRecord); } }); } finally { reader.Close(); cmd.Dispose(); } SQLString = $"SELECT Section, Board, NorthSpades, NorthHearts, NorthDiamonds, NorthClubs, NorthNotrump, EastSpades, EastHearts, EastDiamonds, EastClubs, EastNotrump, SouthSpades, SouthHearts, SouthDiamonds, SouthClubs, SouthNotrump, WestSpades, WestHearts, WestDiamonds, WestClubs, WestNoTrump, NorthHcp, EastHcp, SouthHcp, WestHcp FROM HandEvaluation"; cmd = new OdbcCommand(SQLString, connection); try { ODBCRetryHelper.ODBCRetry(() => { reader = cmd.ExecuteReader(); while (reader.Read()) { HandRecord handRecord = HandRecordsList.Find(x => x.SectionID == reader.GetInt16(0) && x.BoardNumber == reader.GetInt16(1)); if (handRecord != null) { if (reader.GetInt16(2) > 6) { handRecord.EvalNorthSpades = (reader.GetInt16(2) - 6).ToString(); } else { handRecord.EvalNorthSpades = ""; } if (reader.GetInt16(3) > 6) { handRecord.EvalNorthHearts = (reader.GetInt16(3) - 6).ToString(); } else { handRecord.EvalNorthHearts = ""; } if (reader.GetInt16(4) > 6) { handRecord.EvalNorthDiamonds = (reader.GetInt16(4) - 6).ToString(); } else { handRecord.EvalNorthDiamonds = ""; } if (reader.GetInt16(5) > 6) { handRecord.EvalNorthClubs = (reader.GetInt16(5) - 6).ToString(); } else { handRecord.EvalNorthClubs = ""; } if (reader.GetInt16(6) > 6) { handRecord.EvalNorthNT = (reader.GetInt16(6) - 6).ToString(); } else { handRecord.EvalNorthNT = ""; } if (reader.GetInt16(7) > 6) { handRecord.EvalEastSpades = (reader.GetInt16(7) - 6).ToString(); } else { handRecord.EvalEastSpades = ""; } if (reader.GetInt16(8) > 6) { handRecord.EvalEastHearts = (reader.GetInt16(8) - 6).ToString(); } else { handRecord.EvalEastHearts = ""; } if (reader.GetInt16(9) > 6) { handRecord.EvalEastDiamonds = (reader.GetInt16(9) - 6).ToString(); } else { handRecord.EvalEastDiamonds = ""; } if (reader.GetInt16(10) > 6) { handRecord.EvalEastClubs = (reader.GetInt16(10) - 6).ToString(); } else { handRecord.EvalEastClubs = ""; } if (reader.GetInt16(11) > 6) { handRecord.EvalEastNT = (reader.GetInt16(11) - 6).ToString(); } else { handRecord.EvalEastNT = ""; } if (reader.GetInt16(12) > 6) { handRecord.EvalSouthSpades = (reader.GetInt16(12) - 6).ToString(); } else { handRecord.EvalSouthSpades = ""; } if (reader.GetInt16(13) > 6) { handRecord.EvalSouthHearts = (reader.GetInt16(13) - 6).ToString(); } else { handRecord.EvalSouthHearts = ""; } if (reader.GetInt16(14) > 6) { handRecord.EvalSouthDiamonds = (reader.GetInt16(14) - 6).ToString(); } else { handRecord.EvalSouthDiamonds = ""; } if (reader.GetInt16(15) > 6) { handRecord.EvalSouthClubs = (reader.GetInt16(15) - 6).ToString(); } else { handRecord.EvalSouthClubs = ""; } if (reader.GetInt16(16) > 6) { handRecord.EvalSouthNT = (reader.GetInt16(16) - 6).ToString(); } else { handRecord.EvalSouthNT = ""; } if (reader.GetInt16(17) > 6) { handRecord.EvalWestSpades = (reader.GetInt16(17) - 6).ToString(); } else { handRecord.EvalWestSpades = ""; } if (reader.GetInt16(18) > 6) { handRecord.EvalWestHearts = (reader.GetInt16(18) - 6).ToString(); } else { handRecord.EvalWestHearts = ""; } if (reader.GetInt16(19) > 6) { handRecord.EvalWestDiamonds = (reader.GetInt16(19) - 6).ToString(); } else { handRecord.EvalWestDiamonds = ""; } if (reader.GetInt16(20) > 6) { handRecord.EvalWestClubs = (reader.GetInt16(20) - 6).ToString(); } else { handRecord.EvalWestClubs = ""; } if (reader.GetInt16(21) > 6) { handRecord.EvalWestNT = (reader.GetInt16(21) - 6).ToString(); } else { handRecord.EvalWestNT = ""; } handRecord.HCPNorth = reader.GetInt16(22).ToString(); handRecord.HCPEast = reader.GetInt16(23).ToString(); handRecord.HCPSouth = reader.GetInt16(24).ToString(); handRecord.HCPWest = reader.GetInt16(25).ToString(); } } }); } catch (OdbcException e) { if (e.Errors.Count > 1 || e.Errors[0].SQLState != "42S02") // Error other than HandEvaluation table does not exist { throw (e); } } finally { reader.Close(); cmd.Dispose(); } } return; }