private HandRank EvaluateHand(Card c1, Card c2) { List <Card> cards = new List <Card>(); cards.Add(c1); cards.Add(c2); cards.Add(tableCards.GetCard(0)); cards.Add(tableCards.GetCard(1)); cards.Add(tableCards.GetCard(2)); cards.Add(tableCards.GetCard(3)); cards.Add(tableCards.GetCard(4)); cards.Sort(new CardCopare()); Dictionary <CardSuit, int> suitsInHand = new Dictionary <CardSuit, int>(); Dictionary <CardFace, int> faceInHand = new Dictionary <CardFace, int>(); foreach (int suit in System.Enum.GetValues(typeof(CardSuit))) { suitsInHand.Add((CardSuit)suit, 0); } foreach (int face in System.Enum.GetValues(typeof(CardFace))) { faceInHand.Add((CardFace)face, 0); } for (int i = 0; i < cards.Count; i++) { suitsInHand[cards[i].suit] += 1; faceInHand[cards[i].face] += 1; } //get a sorted list of all face values List <int> allFace = new List <int>(); foreach (Card c in cards) { allFace.Add((int)c.face); } //royal flush and straigth flush if (suitsInHand.ContainsValue(5)) { //create a range of values from ten to ace, create a remaning list with all values that are not in the new range List <int> _rangeList = Enumerable.Range((int)CardFace.Ten, (int)CardFace.Ace).ToList(); List <int> _Remaing = allFace.Except(allFace).ToList(); //if there is no remaning numbers that means that there is a sequence of a royal flush if (_Remaing.Count <= 0) { return(HandRank.RoyalFlush); } //if there is not royal flush check for a straigth flush //get last and first face value int _first = allFace.First(); int _last = allFace.Last(); //create a range of values from first to last, create a remaning list with all values that are not in the list of face values _rangeList = Enumerable.Range(_first, _last - _first + 1).ToList(); _Remaing = _rangeList.Except(allFace).ToList(); //if there is no remaning numbers that means that there is a sequence if (_Remaing.Count <= 0) { return(HandRank.StraightFlush); } } //four of a kind if (faceInHand.ContainsValue(4)) { return(HandRank.FourKind); } // full house if (faceInHand.ContainsValue(3) && faceInHand.ContainsValue(2)) { return(HandRank.FullHouse); } //flush if (suitsInHand.ContainsValue(5)) { return(HandRank.Flush); } //straigth //get last and first face value int first = allFace.First(); int last = allFace.Last(); //create a range of values from first to last, create a remaning list with all values that are not in the list of face values List <int> rangeList = Enumerable.Range(first, last - first + 1).ToList(); List <int> remaing = rangeList.Except(allFace).ToList(); //if there is no remaning numbers that means that there is a sequence if (remaing.Count <= 0) { return(HandRank.Straight); } //three of a kind if (faceInHand.ContainsValue(3)) { return(HandRank.ThreeKind); } //two pair int count = 0; foreach (var input in faceInHand) { if (input.Value == 2) { count++; } } if (count >= 2) { return(HandRank.TwoPair); } if (faceInHand.ContainsValue(2)) { return(HandRank.Pair); } return(HandRank.HighCard); }
public IEnumerator CalculateBet(float currenBet, int cardsDelt, float topCurrency, PokerTableCards table, int deckSize, int turn) { //use neural network here betting = true; if (isAi) { //inputs = { totalCount, heartsCount, dimondCount, spadeCount, clubsCount, hand1, hand2, table1, table2, table3, table4, table5, turn, cash } float[] inputs = { cardsDelt / (52 * deckSize), //noramlize cards dealt agains size of one deck (float)cardCount.GetSuitCount(CardSuit.Heart) / (float)(14 * deckSize), //noramlize suits dealt agains max amount of suits in deck (float)cardCount.GetSuitCount(CardSuit.Dimond) / (float)(14 * deckSize), (float)cardCount.GetSuitCount(CardSuit.Spades) / (float)(14 * deckSize), (float)cardCount.GetSuitCount(CardSuit.Clubs) / (float)(14 * deckSize), (float)((int)cardLocations[0].card.suit + (int)cardLocations[0].card.face) / (float)((int)CardSuit.Clubs * (int)CardFace.Ace), //normalize card agains all possible cards (float)((int)cardLocations[1].card.suit + (int)cardLocations[1].card.face) / (float)((int)CardSuit.Clubs * (int)CardFace.Ace), 0, 0, 0, 0, //set 0 for now and add cards in depeding on turn turn / 3, //normalize betting turn currenCurrency / topCurrency //normalzie own currenzy against top currency }; if (turn >= 2) { inputs[7] = (float)((int)table.GetCard(0).suit + (int)table.GetCard(0).face) / (float)((int)CardSuit.Clubs * (int)CardFace.Ace); //normalize card agains all possible cards inputs[8] = (float)((int)table.GetCard(1).suit + (int)table.GetCard(1).face) / (float)((int)CardSuit.Clubs * (int)CardFace.Ace); inputs[9] = (float)((int)table.GetCard(2).suit + (int)table.GetCard(2).face) / (float)((int)CardSuit.Clubs * (int)CardFace.Ace); } if (turn >= 3) { inputs[10] = (float)((int)table.GetCard(3).suit + (int)table.GetCard(3).face) / (float)((int)CardSuit.Clubs * (int)CardFace.Ace); //normalize card agains all possible cards } float[] outputs = network.SendInputs(inputs); float topOut = 0; int outIndex = 0; //find larges ouput for (int i = 0; i < outputs.Length; i++) { if (topOut < outputs[i]) { topOut = outputs[i]; outIndex = i; } } //do decision based on largets value switch (outIndex) { case 0: Raise(currenBet); break; case 1: Call(currenBet); break; case 2: Fold(); break; } } else { //show buttons ChangeButtonVisability(true); betPlayer = currenBet; //wait for player to press button yield return(new WaitWhile(() => betting == true)); //hide buttons ChangeButtonVisability(false); } yield return(new WaitForSeconds(betDeley)); betting = false; yield return(null); }