2017-02-04 2 views
0

Je crée un jeu de poker - Texas Holdem (5 cartes sur la table et 2 cartes pour moi-même).Évaluation de la main de poker à travers LINQ

Je l'ai déjà créé des fonctions de chasse, chasse d'eau droite et droite et je suis resté bloqué sur l'évaluation si la main a:
1. Quatre d'une sorte
2. Brelan
3. Full
4. Deux paires
5. une paire

Je crois que je peux écrire une fonction pour tous ce qui précède, qui renverra une chaîne correspondante.

J'ai créé une liste qui détient la liste des cartes (7 cartes) Carte de classe a une cardNumber de propriété de type entier (As = 1, Deux = 2, Trois = 3, etc.)

Voici ma fonction :

Public Shared Function ofAKind(hand As List(Of Card)) As String 
    Dim result As String = "" 
    Dim counter As Integer 
    Dim IntegerList As New List(Of Integer) 
    'creating a list of integers that are representing faces of cards 
    Do 
     IntegerList.Add(hand.Item(counter).cardNumber) 
     counter += 1 
    Loop Until counter = hand.Count 

    Dim groupedIntegers = From Int In IntegerList 
          Group By Int 
           Into grouping = Group, Count() 

    'and here is my problem: how can I make such a grouping? below is just pseudocode. 
    'When using a debugger, I see that it groups them well. It is just that I do not know 
    'how to use LINQ to extract that grouping into the below if statement and get a corresponding string. 


    'if grouping = 4 Then 
    'result = "Four of a kind" 
    'if grouping = 3 andAlso grouping = 2 Then 
    'result = "Full House" 
    'if grouping = 2 andAlso grouping = 2 Then 
    'result = "Two Pairs" 
    'if grouping = 2 Then 
    'result = "Pair" 


    Return result 
End Function 
+0

Vous pouvez classer toute la main dans une méthode utilisant 2-3 requêtes LINQ - vous en quelque sorte dois depuis que vous voulez tester dans l'ordre de main de poker. Retourner une chaîne n'est pas suffisant si vous voulez comparer les mains. Si 2 mains ont 1 paire, ce sont les paires qui déterminent qui bat qui. Surtout avec HoldEm, vous devez également être en mesure de rompre les liens avec les cartes hautes (Pair Qs, Ace Salut vs Pair Queens 9 Salut). – Plutonix

+0

Plutonix. Merci pour votre commentaire. Ce que vous avez dit est tout à fait logique et je suis entièrement d'accord. J'aurais dû mentionner dès le début que j'essayais juste de construire une version simple du jeu. Et pour ce but particulier, il me suffirait de connaître ma main et de ne pas la comparer à d'autres mains. –

+0

comment sont stockées les cartes? comment est la classe de carte et est-ce 1 à 13? –

Répondre

0

Je l'ai compris. Je suis sûr que cela peut être fait d'une manière plus propre, mais cela a fonctionné pour moi. À cette étape de la découverte de ma programmation, il s'agit d'une prochaine étape importante. Merci à Plutonix. Appréciez-le.

Fonction publique ofAKind (IntegerList liste (INTEGER)) As String résultat Dim As String = "OUI" Dim groupedIntegerList As New List (Of Integer)

Dim groupedIntegers = From Int In IntegerList 
          Group By Int 
          Into LOL = Group, Count() 

    'creating another list (I am sure there is a cleaner way, but I don't know it yet) 
    For Each e In groupedIntegers 
     groupedIntegerList.Add(e.Count) 
    Next 

    If groupedIntegerList.Contains(3) And groupedIntegerList.Contains(2) Then 
     result = "Fullhouse!" 
    ElseIf groupedIntegerList.Contains(4) Then 
     result = "Four of a kind!" 
    ElseIf groupedIntegerList.Contains(3) Then 
     result = "Three of a kind" 
    ElseIf groupedIntegerList.Contains(2) Then 
     result = "Pair!" 
    End If 

    'ugly way to search for two pairs (but it works) 

    If result = "Pair!" Then 
     Dim searchingForTwoPairs = From int In groupedIntegerList 
            Where int > 1 
            Group By int 
             Into LOL2 = Group, Count() 

     Dim twoPairsList As New List(Of Integer) 
     For Each e In searchingForTwoPairs 
      twoPairsList.Add(e.Count) 
     Next 

     If twoPairsList.Contains(2) Or twoPairsList.Contains(3) Then 
      result = "Two pairs!" 
     End If 
    End If 

    Return result 
End Function 
0

Pour le manque de pouvoir commenter.

Peut-être String.Concat toutes les cartes valeurs ensemble (avec les espaces blancs entre chaque) et utiliser un Regex.Matches(...) avec le code de correspondance « \ d » faire correspondre les numéros

Ensuite Array.ForEach(...) pour les groupes() avec un in- ligne If[...] pour compter les occurrences dans chaque groupe et tester si elle a des combinaisons particulières de correspondances.


Il peut être un peu fastidieux, et une longue en ligne Linq, mais juste une pensée: p