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
Répondre
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.
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 ... –
Maintenant je me souviens! Edité avec info pokerai. –
J'ai trouvé this ce qui semble prometteur.
Vous pouvez également rouler les vôtres.
Malheureusement, peu de ceux-ci sont Java –
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).
Regardez ce java gratuit poker lib de l'université de l'Alberta: http://spaz.ca/poker/doc/ca/ualberta/cs/poker/package-summary.html
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.
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;
}
(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.
- 1. Poker question modélisation mains
- 2. Enumerating sur toutes les mains de poker tête à tête
- 3. Jeu de poker en ligne en Java
- 4. Java cartes de poker arrays
- 5. Poker Main dans Prolog
- 6. Projet de poker utilisant JFrames
- 7. suivi des mains nues
- 8. Évaluation de la main de poker avec des jokers
- 9. montrer les résultats des mains
- 10. simple question sur dés poker en python
- 11. Flex pour le poker en ligne?
- 12. Traiter quatre mains aléatoires à partir d'un jeu de cartes Java en utilisant des tableaux
- 13. Affichage de chaîne de main de poker
- 14. Objective-C parser poker main histoire
- 15. Extraire des numéros de cartes de poker
- 16. Une meilleure conception de cadre de poker C#?
- 17. Trier une main de cartes en poker C++
- 18. Prolog quatre d'un genre de poker
- 19. iphone sdk - calcul des cotes de poker
- 20. Horloge analogique avec UIImages pour les mains?
- 21. Représentation d'objet des tours d'enchères au poker
- 22. Structure de base de données relationnelle pour les données de poker Texas Hold'em
- 23. Gardez votre concepteur dégoûtant les mains mes valeurs de propriété!
- 24. Création/exportation de l'historique des mains pour Android Scorekeeper
- 25. en utilisant le dictionnaire en essayant de rechercher une valeur et une clé (jeu de poker)
- 26. Regex pour calculer la main droite du poker?
- 27. Comment calculer par programme les cotes de poker?
- 28. Comment puis-je imprimer toutes les "maisons pleines" possibles au poker avec Java?
- 29. Bibliothèque de compilation croisée (poker-eval) pour iOS
- 30. Google Chrome UserScript - Travailler avec d'autres fenêtres et mains jointes
Que voulez-vous dire par deux mains de poker? Lequel est le meilleur? Avec 5 cartes? Avec 7 cartes? –
Ben, l'une des réponses était-elle utile? –
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. –