public bool Analyze(BoardCards boardCards, BoardTextureItem boardTexture) { if (!CardHelper.IsStreetAvailable(boardCards.ToString(), boardTexture.TargetStreet) || !(boardTexture is HighCardBoardTextureItem)) { return(false); } var highCardItem = boardTexture as HighCardBoardTextureItem; var board = boardCards.GetBoardOnStreet(highCardItem.TargetStreet); return(board.Aggregate((i1, i2) => i1.RankNumericValue > i2.RankNumericValue ? i1 : i2).Rank == highCardItem.SelectedRank); }
public bool Analyze(BoardCards boardCards, BoardTextureItem boardTexture) { if (!CardHelper.IsStreetAvailable(boardCards.ToString(), boardTexture.TargetStreet)) { return(false); } var board = boardCards.GetBoardOnStreet(boardTexture.TargetStreet); var lastCard = board.Last(); return(board.Take(board.Count - 1).GroupBy(x => x.Rank).All(x => x.Count() == 1) && board.Take(board.Count - 1).Any(x => x.Rank == lastCard.Rank)); }
public bool Analyze(BoardCards boardCards, BoardTextureItem boardTexture) { var boardTextureItem = boardTexture as StraightBoardTextureItem; if (boardTextureItem == null || !CardHelper.IsStreetAvailable(boardCards.ToString(), boardTextureItem.TargetStreet)) { return(false); } int numberOfOpenEndedStraights = 0; var orderedRanks = BoardTextureAnalyzerHelpers.GetOrderedBoardNumericRanks(boardCards, boardTextureItem); if (orderedRanks.Count < 2) { return(false); } int firstRank = orderedRanks.Max() + 2; while (firstRank > orderedRanks.Min() - 2) { firstRank = BoardTextureAnalyzerHelpers.GetHighestUniqueRankNumberForList(orderedRanks, firstRank); var secondRank = BoardTextureAnalyzerHelpers.GetHighestUniqueRankNumberForList(orderedRanks, firstRank - 1); if (secondRank <= 0) { break; } var connectedList = new List <int>(orderedRanks); connectedList.Add(secondRank); connectedList = HandAnalyzerHelpers.GetConnectedCards(firstRank, connectedList); if (connectedList.Count > 4) { numberOfOpenEndedStraights += HandAnalyzerHelpers.IsStraight(connectedList.OrderByDescending(x => x).Take(5)) ? 1 : 0; } firstRank--; } return(BoardTextureAnalyzerHelpers.CheckEquality(boardTextureItem.SelectedSign.Key, numberOfOpenEndedStraights, boardTextureItem.SelectedNumber)); }
public bool Analyze(BoardCards boardCards, BoardTextureItem boardTexture) { if (!CardHelper.IsStreetAvailable(boardCards.ToString(), boardTexture.TargetStreet)) { return(false); } var board = boardCards.GetBoardOnStreet(boardTexture.TargetStreet); var lastCard = board.Last(); var grouppedBoard = board.Take(board.Count - 1).GroupBy(x => x.Rank); if (grouppedBoard.Count(x => x.Count() > 1) > 1) { return(false); } var pair = grouppedBoard.FirstOrDefault(x => x.Count() == 2); if (pair == null || pair.Key == lastCard.Rank) { return(false); } return(board.Take(board.Count - 1).Any(x => x.Rank == lastCard.Rank)); }
public bool Analyze(BoardCards boardCards, BoardTextureItem boardTexture) { if (!CardHelper.IsStreetAvailable(boardCards.ToString(), boardTexture.TargetStreet)) { return(false); } var board = boardCards.GetBoardOnStreet(boardTexture.TargetStreet).OrderBy(x => x.RankNumericValue).ToList(); var orderedRanks = board.Select(x => x.RankNumericValue).ToList(); if (board.Any(x => x.RankNumericValue == Cards.Card.GetRankNumericValue("A")) && board.Any(x => x.RankNumericValue == Cards.Card.GetRankNumericValue("2"))) { orderedRanks.Insert(0, 1); } int count = 0; for (int i = 1; i < orderedRanks.Count; i++) { if (Math.Abs(orderedRanks[i - 1] - orderedRanks[i]) == 1) { count++; } else if (count == 3) { return(true); } else { count = 0; } } return(count == 3); }
/// <summary> /// Calculates Holdem equity for the specified players which last action was at the specified street /// </summary> /// <param name="players">Player to calculate equity</param> /// <param name="street">Street</param> /// <param name="boardCards">Board cards</param> private void CalculateHoldemEquity(List <EquityPlayer> players, Street street, BoardCards boardCards, HandHistories.Objects.Cards.Card[] dead, int potIndex) { var wins = new long[players.Count]; var losses = new long[players.Count]; var ties = new long[players.Count]; long totalhands = 0; var deadCards = string.Join(string.Empty, dead.Select(x => x.ToString())); Hand.HandWinOdds(players.Select(x => x.HoleCards.ToString()).ToArray(), boardCards.ToString(), deadCards, wins, ties, losses, ref totalhands); if (totalhands == 0) { return; } var playersOdds = new List <PlayerOdds>(); for (var i = 0; i < wins.Length; i++) { var playerOdds = new PlayerOdds { PlayerName = players[i].Name, Wins = wins[i], Ties = ties[i] }; playersOdds.Add(playerOdds); } var allInEquity = CalculateEquity(playersOdds, totalhands); players.Where(p => allInEquity.ContainsKey(p.Name)) .ForEach(p => p.Equity[potIndex] = allInEquity[p.Name]); }
public bool Analyze(BoardCards boardCards, BoardTextureItem boardTexture) { var boardTextureItem = boardTexture as StraightBoardTextureItem; if (boardTextureItem == null || !CardHelper.IsStreetAvailable(boardCards.ToString(), boardTextureItem.TargetStreet)) { return(false); } int numberOfOpenEndedStraights = 0; var orderedRanks = BoardTextureAnalyzerHelpers.GetOrderedBoardNumericRanks(boardCards, boardTextureItem); if (orderedRanks.Count < 2) { return(false); } int nutRank = GetNutHighCard(orderedRanks); if (nutRank <= 0) { return(false); } int firstRank = orderedRanks.Max() + 3; int secondRank = firstRank - 1; while (firstRank > nutRank) { firstRank = BoardTextureAnalyzerHelpers.GetHighestUniqueRankNumberForList(orderedRanks, firstRank); secondRank = BoardTextureAnalyzerHelpers.GetHighestUniqueRankNumberForList(orderedRanks, secondRank); if (firstRank == secondRank) { secondRank = BoardTextureAnalyzerHelpers.GetHighestUniqueRankNumberForList(orderedRanks, secondRank - 1); } if (secondRank <= 0 || secondRank < orderedRanks.Min() - 3) { firstRank--; secondRank = firstRank; continue; } var tempList = new List <int>(orderedRanks); tempList.Add(firstRank); tempList.Add(secondRank); tempList = tempList.Where(x => x <= firstRank).ToList(); if (tempList.Count > 3) { var hand = tempList.OrderByDescending(x => x).Take(4); var isGutShot = hand.Max() - hand.Min() == 4; if (isGutShot) { numberOfOpenEndedStraights++; } } secondRank--; } return(BoardTextureAnalyzerHelpers.CheckEquality(boardTextureItem.SelectedSign.Key, numberOfOpenEndedStraights, boardTextureItem.SelectedNumber)); }
public bool Analyze(BoardCards boardCards, BoardTextureItem boardTexture) { var boardTextureItem = boardTexture as StraightBoardTextureItem; if (boardTextureItem == null || !CardHelper.IsStreetAvailable(boardCards.ToString(), boardTextureItem.TargetStreet)) { return(false); } int numberOfOpenEndedStraights = 0; var orderedRanks = BoardTextureAnalyzerHelpers.GetOrderedBoardNumericRanks(boardCards, boardTextureItem); if (orderedRanks.Count < 2) { return(false); } int firstRank = BoardTextureAnalyzerHelpers.GetHighestUniqueRankNumberForList(orderedRanks, orderedRanks.Max() + 2); int initFirstRank = firstRank; int nutRank = 0; bool isNutFound = false; while (firstRank > orderedRanks.Min() - 2) { firstRank = BoardTextureAnalyzerHelpers.GetHighestUniqueRankNumberForList(orderedRanks, firstRank); if (isNutFound && firstRank <= nutRank) { break; } var secondRank = BoardTextureAnalyzerHelpers.GetHighestUniqueRankNumberForList(orderedRanks, firstRank - 1); if (secondRank <= 0) { break; } var connectedList = new List <int>(orderedRanks); connectedList.Add(secondRank); connectedList = HandAnalyzerHelpers.GetConnectedCards(firstRank, connectedList); if (connectedList.Count > (isNutFound ? 3 : 4)) { var hand = connectedList.OrderByDescending(x => x).Take(isNutFound ? 4 : 5); bool isStraight = HandAnalyzerHelpers.IsStraight(hand); if (isStraight) { if (!isNutFound) { isNutFound = true; firstRank = initFirstRank; nutRank = hand.Max(); continue; } else { numberOfOpenEndedStraights++; } } } firstRank--; } return(BoardTextureAnalyzerHelpers.CheckEquality(boardTextureItem.SelectedSign.Key, numberOfOpenEndedStraights, boardTextureItem.SelectedNumber)); }
public IAnalyzer Analyze(IEnumerable <HandHistories.Objects.Cards.Card> playerCards, BoardCards boardCards) { try { IAnalyzer result = null; var highestHand = CardHelper.FindBestHand(string.Join("", playerCards.Select(c => c.CardStringValue)), boardCards.ToString()); var analyzers = ReferenceEquals(highestHand, null) ? _combinations : _combinations.Where(x => x.IsValidAnalyzer(highestHand)).ToArray(); if (playerCards.Count() > 2 && !string.IsNullOrEmpty(highestHand.PocketCards)) { result = analyzers.FirstOrDefault(combination => combination.Analyze(CardGroup.Parse(highestHand.PocketCards), boardCards)) ?? new StubAnalyzer(); } else { result = analyzers.FirstOrDefault(combination => combination.Analyze(playerCards, boardCards)) ?? new StubAnalyzer(); } return(result); } catch (Exception ex) { LogProvider.Log.Error(this, String.Format("Hand Analyzer Error occurred: Player cards = {0}; Board Cards = {1}", string.Join("", playerCards.Select(c => c.CardStringValue)), boardCards.ToString()), ex); } return(new StubAnalyzer()); }
public bool Analyze(IEnumerable <HandHistories.Objects.Cards.Card> playerCards, BoardCards boardCards) { if (playerCards == null || boardCards == null || playerCards.Count() != 2 || boardCards.Count() == 0) { return(false); } HoldemHand.Hand hand = new HoldemHand.Hand(string.Join("", playerCards.Select(c => c.CardStringValue)), boardCards.ToString()); if (hand.HandTypeValue > HoldemHand.Hand.HandTypes.Pair) { return(true); } if (hand.HandTypeValue == HoldemHand.Hand.HandTypes.Pair) { return(playerCards.Any(x => x.RankNumericValue == boardCards.Max(b => b.RankNumericValue))); } return(false); }