2011-03-05 3 views
5

Existe-t-il une méthode simple pour comparer deux mains de poker? Je vais faire ça de façon assez naïve, donc si quelqu'un a de l'expérience dans ce domaine, cela pourrait être utile.Mains de poker en Java

+3

Que voulez-vous dire par deux mains de poker? Lequel est le meilleur? Avec 5 cartes? Avec 7 cartes? –

+0

Ben, l'une des réponses était-elle utile? –

+0

Merci. Je pense maintenant que je vais faire une carte des types de cartes dans la main donnée à leur fréquence. Cela semble être la solution la plus simple, j'aurais aimé y penser plus tôt. Ensuite, tout ce qui est nécessaire, ce sont des évaluateurs qui regardent les fréquences sur la carte. Par exemple, si l'une des valeurs a une fréquence de 4, c'est un brelan. –

Répondre

6

Il n'y a pas de moyen facile (et performant) de le faire, surtout si vous voulez évaluer des sous-ensembles de cartes de sept cartes, comme au Texas Hold'em.

Vous voudrez peut-être vérifier pokersource qui a quelques liaisons Java.

Modifier - une ressource supplémentaire est la pokerai forums. J'ai trouvé pas mal d'algorithmes Java là-bas. Ils font régulièrement l'objet de benchmarks et sont souvent accompagnés d'algorithmes d'énumération pour la simulation Monte Carlo. This semble être la publication principale.

+0

il y a en fait un forum de poker quelque part qui a fait de bons algorithmes et fait son travail en Java ... j'aimerais pouvoir me souvenir du nom ... –

+0

Maintenant je me souviens! Edité avec info pokerai. –

3

J'ai trouvé this ce qui semble prometteur.

Vous pouvez également rouler les vôtres.

+0

Malheureusement, peu de ceux-ci sont Java –

1

En supposant que vous ayez déjà une sorte de structure de données en place pour déterminer le type de main que possède le joueur, vous pouvez simplement attribuer une sorte de valeur int à chaque type de main et les comparer. Quel que soit le joueur ayant la valeur la plus élevée gagne. Si les valeurs sont égales, vous devrez juste comparer les mains les unes contre les autres. I.E si les deux ont des paires, comparez simplement les numéros de la carte, ou s'ils ont une maison complète, comparez la valeur de la carte dont ils ont 3.

EDIT: s'ils ont la même main, il suffit de vérifier la prochaine carte la plus haute dans leur main (kicker).

1

Un exemple d'un évaluateur 7-et 5-cartes Texas Hold'em prêt à l'emploi peut être trouvé here avec la documentation et expliqué plus en détail here. Tous les commentaires sont les bienvenus à l'adresse e-mail qui s'y trouve.

1

J'ai écrit une bibliothèque d'évaluation de la main de poker pour java, qui fait exactement ce que vous cherchez. Ce n'était pas facile mais c'est performant. Je l'ai publié sous la GNU GPL sur GitHub.

get sourecode here

1

j'ai écrit cela, laissez-moi savoir si cela aide. Essentiellement, je cartographie chaque carte à un nombre 2 de piques étant 0, et l'as de pique étant un 12 et 2 de coeurs un 3 etc. etc Je souhaite que j'ai vu ce fil avant de mettre dans le travail.

/** 
 
    * Takes any subset of numberCards and creates an array which directly says 
 
    * how good the cards are This method is long so If it is working try not to 
 
    * tweak it TODO potential re-factor 
 
    * 
 
    * @todo Fix this @fixMe 
 
    * @param cards to analyze 
 
    * @return condensed form of hand in the format(tier, High Card, High Card 
 
    * 2,Kicker(s),sometimes some zeroes) 
 
    */ 
 
    public static int[] analyzeCards(int[] cards) { 
 
     int suitFlush = 0; 
 
     int[] unsuitedCards = new int[cards.length]; 
 
     for (int i = 0; i < cards.length; i++) { 
 
      unsuitedCards[i] = (cards[i] % 13); 
 
     } 
 
       Arrays.sort(unsuitedCards); 
 
     unsuitedCards = reverse(unsuitedCards); 
 
//converting cards into just numbers 0-12 in descending order 
 

 
     
 
     int[] lookForPairsHere=unsuitedCards.clone(); 
 

 
//  System.out.println(Arrays.toString(unsuitedCards)); 
 
     //defining the suits of the cards 0,1,2,3 
 
     // and the suits are in order of the cards 
 
     int[] suitsOfCards = new int[cards.length]; 
 
     for (int i = 0; i < cards.length; i++) { 
 
      suitsOfCards[i] = cards[i]/13; 
 
     } 
 
     int[] numberOfEachValuedCard = {0, 0, 0, 0, 0, 0, 0, 
 
      0, 0, 0, 0, 0, 0}; 
 
     int[] pairs = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
 

 
     lookForPairsHere = unsuitedCards.clone(); 
 

 
     int[] originalCards = cards.clone(); 
 
     int[] condensedCards = {0, -1, 0, 0, 0, 0}; 
 
     int[] suits = {0, 0, 0, 0}; 
 
     boolean[] hasQuality = {false, false}; // hasQuality[0] is flush and 
 
     //hasQuality[1] is a straight 
 
     for (int i = 0; i < suitsOfCards.length; i++) { 
 
      suits[suitsOfCards[i]]++; 
 
     } 
 
     for (int i = 0; i < 4; i++) { 
 
      if (suits[i] > 4) { 
 
       hasQuality[0] = true; 
 
//    System.out.println("flush"); 
 
       // there is a flush! 
 
       suitFlush = i; 
 
       } 
 
     } 
 
int[] straightCards = {-2, -2, -2, -2, -2, -2, -2}; 
 
     int i = 0; 
 
     int j = 1; 
 
     int card = 0; 
 
//  some iterators I will need to keep track of temporarily 
 
//   i is just an iterator j is the number of consecuetive cards 
 

 
if(hasQuality[0]){ 
 
     for (i = 0; i <originalCards.length; i++) { 
 
       if (originalCards[i]/13 == suitFlush) { 
 
        straightCards[i] = originalCards[i]; 
 
       } 
 
      } 
 
Arrays.sort(straightCards); 
 
straightCards=reverse(straightCards); 
 
//sorting flushCards in order; 
 
     unsuitedCards = removeDuplicates(unsuitedCards); 
 
     // getting rid of duplicates to prevent trouble 
 
condensedCards[1]=straightCards[0]%13; 
 
} 
 
     if (/*there is not a flush already*/!hasQuality[0]) { 
 
       for(i=0;(i<unsuitedCards.length-5);i++){ 
 
        if(unsuitedCards[i]-1==unsuitedCards[i+1]&& 
 
          unsuitedCards[i]-2==unsuitedCards[i+2]&& 
 
          unsuitedCards[i]-3==unsuitedCards[i+3]&& 
 
          unsuitedCards[i]-4==unsuitedCards[i+4]){ 
 
         hasQuality[1]=true; 
 
         condensedCards[1]=unsuitedCards[i]; 
 
       } 
 
       } 
 
      if (hasQuality[1] == false) { 
 
       int b = 0; 
 
       if (unsuitedCards[0] == 12) { 
 
        //looks for ace-5 flush 
 
        for (i = 0; i < unsuitedCards.length; i++) { 
 
         if (unsuitedCards[i] == 3 || unsuitedCards[i] == 2 || unsuitedCards[i] == 1 
 
           || unsuitedCards[i] == 0) { 
 
          b++; 
 
         } 
 
        } 
 
        if (b>3) { 
 
         hasQuality[1] = true; 
 
         //there is an ace-5 flush 
 
         condensedCards[1] = 3; 
 
        } 
 
       } 
 
      } 
 
     } else/*there is a flush already so a straight is suited*/ { 
 
      Arrays.sort(straightCards); 
 
      straightCards = reverse(straightCards); 
 
      //order it 
 
      // look for A normal straight  
 
      for(i=0;(i<straightCards.length-5);i++){ 
 
        if(straightCards[i]-1==straightCards[i+1]&& 
 
          straightCards[i]-2==straightCards[i+2]&& 
 
          straightCards[i]-3==straightCards[i+3]&& 
 
          straightCards[i]-4==straightCards[i+4]){ 
 
         hasQuality[1]=true; 
 
         condensedCards[1]=straightCards[i]; 
 
       } 
 
      } 
 
      if (hasQuality[1] == false) { 
 
       int b = 0; 
 
       if (straightCards[0] == 12) { 
 
        //looks for ace-5 flush 
 
        for (int z = 0; (z< straightCards.length); z++){ 
 
         if (straightCards[z] == 3 || straightCards[z] == 2 || 
 
           straightCards[z] == 1 
 
           ||straightCards[z] == 0) { 
 
          b++; 
 
         } 
 
        } 
 
        if (b>3) { 
 
         hasQuality[1] = true; 
 
         //there is an ace-5 flush 
 
         condensedCards[1] = 3; 
 
        } 
 
       } 
 
      } 
 
     } 
 
     if (hasQuality[1] && hasQuality[0]) { 
 
      condensedCards[0] = 8; 
 
      return condensedCards; 
 
     } 
 
     if (hasQuality[1] && !hasQuality[0]) { 
 
      condensedCards[0] = 4; 
 
      return condensedCards; 
 
     } 
 
     if (hasQuality[0] && !hasQuality[1]) { 
 
      condensedCards[0] = 5; 
 
      for(i=2;i<=5;i++){ 
 
       condensedCards[i]=straightCards[i-1]; 
 
      } 
 
      return condensedCards; 
 
     } 
 
     card = 0; 
 

 
     for (i = 0; i < lookForPairsHere.length; i++) { 
 
      numberOfEachValuedCard[lookForPairsHere[i]]++; 
 
     } 
 
     for (i = 12; i >= 0 && card < 5; i--) { 
 
      // create an array that has how much of each card 
 
      if (numberOfEachValuedCard[i] > 0) { 
 
       pairs[2 * card] = numberOfEachValuedCard[i]; 
 
       pairs[2 * card + 1] = i; 
 
       card++; 
 
      } 
 
     } 
 

 
//parse the array above 
 
     int[] pairCondensed = {0, 0, 0, 0, 0}; 
 
     for (i = 0; i < 5; i++) { 
 
      pairCondensed[i] = pairs[2 * i]; 
 
     } 
 
     //highest to lowest 
 
     Arrays.sort(pairCondensed); 
 
     pairCondensed = reverse(pairCondensed); 
 

 
     if (pairCondensed[0] == 4 && pairCondensed[1] == 1) { 
 
      //four of a kind 
 
      condensedCards[0] = 7; 
 
      for (i = 0; pairs[i] > 0; i += 2) { 
 
       if (pairs[i] == 4) { 
 
        condensedCards[1] = pairs[i + 1]; 
 
       } 
 
       for (j = 0; j < 10; j += 2) { 
 
        if (pairs[j] == 1) { 
 
         condensedCards[2] = pairs[j + 1]; 
 
         break; 
 
        } 
 
       } 
 
      } 
 
      return condensedCards; 
 
     } 
 
     if (pairCondensed[0] == 3 && pairCondensed[1] == 2) { 
 
      //full house 
 
      condensedCards[0] = 6; 
 
      for (i = 0; i < 10; i += 2) { 
 
       if (pairs[i] == 3) { 
 
        condensedCards[1] = pairs[i + 1]; 
 
       } 
 
       if (pairs[i] == 2) { 
 
        condensedCards[2] = pairs[i + 1]; 
 
       } 
 
      } 
 
      return condensedCards; 
 
     } 
 
     if (pairCondensed[0] == 3 && pairCondensed[1] == 1) { 
 
      //three kind 
 
      condensedCards[0] = 3; 
 
      for (i = 0; i < 10; i += 2) { 
 
       if (pairs[i] == 3) { 
 
        condensedCards[1] = pairs[i + 1]; 
 
       } 
 
      } 
 

 
      //kicker stuff here 
 
      j = 3; 
 
      for (i = 0; j < 5; i++) { 
 
       if (unsuitedCards[i] != condensedCards[1]) { 
 
        condensedCards[j] = unsuitedCards[i]; 
 
        j++; 
 
       } 
 
      } 
 
     } 
 
     if (pairCondensed[0] == 2 && pairCondensed[1] == 2) { 
 

 
//two pair 
 
      condensedCards[0] = 2; 
 
      for (i = 0; i < 10; i += 2) { 
 
       if (pairs[i] == 2 && condensedCards[1] == -1) { 
 
        condensedCards[1] = pairs[i + 1]; 
 
       } 
 
       if (pairs[i] == 2 && condensedCards[1] != -1) { 
 
        condensedCards[2] = pairs[i + 1]; 
 
       } 
 
      } 
 
      if (condensedCards[2] > condensedCards[1]) { 
 
       int temp2 = condensedCards[2]; 
 
       int temp1 = condensedCards[1]; 
 
       condensedCards[1] = temp2; 
 
       condensedCards[2] = temp1; 
 
      } 
 

 
      //kicker stuff here 
 
      j = 3; 
 
      for (i = 0; j < 4; i++) { 
 
       if (unsuitedCards[i] 
 
         != condensedCards[1] && unsuitedCards[i] 
 
         != condensedCards[2]) { 
 
        condensedCards[j] = unsuitedCards[i]; 
 
        j++; 
 
       } 
 
      } 
 
     } 
 
     if (pairCondensed[0] == 2&&pairCondensed[1]==1) { 
 
      //one pair 
 
      condensedCards[0] = 1; 
 
      for (i = 0; i < 10; i += 2) { 
 

 
       if (pairs[i] == 2) { 
 
        condensedCards[1] = pairs[i + 1]; 
 
       } 
 
      } 
 
      //kicker stuff here 
 
      j = 3; 
 
      for (i = 0; j < 6 && i < 5; i++) { 
 
       if (unsuitedCards[i] != condensedCards[1]) { 
 
        condensedCards[j] = unsuitedCards[i]; 
 
        j++; 
 
       } 
 
      } 
 
     } 
 

 
     if (condensedCards[0] == 0) { 
 
      //high card/ no pair 
 
      for (i = 0,j=1; j <=5 && i < originalCards.length; i++) { 
 
condensedCards[j]=lookForPairsHere[i]; 
 
       j++; 
 
      } 
 
     } 
 

 
     return condensedCards; 
 
    }

1

(Shameless plug) Vous pouvez utiliser ma bibliothèque pour le faire assez facilement

https://github.com/ableiten/foldem

Le code pour le faire ressemble à ceci:

Evaluator evaluator = new DefaultEvaluator(); 
Board board = board("AcTs4d3h3s"); 

Hand a = hand("AsTd"); 
Hand b = hand("TcJh"); 

if (evaluator.rank(a, board) > evaluator.rank(b, board)) { 
    System.out.println("Hand A wins!"); 
} else { 
    System.out.println("Hand B wins (or draws)!"); 
} 

Supporte également le calcul d'équité basé sur la simulation et l'analyse de base post-flop.

Questions connexes