Je pense que vous devriez faire les 21 combinaisons et utiliser une sorte de table 7462. 1er : chaque 7 cartes a 21 combinaisons différentes de 5 cartes. 2ème : chaque main finale possible (2.598.960) représente un des 7462 types de mains différents. donc, c'est facile.
Il vous suffit de regarder toutes les 21 combinaisons de vos cartes et, pour chacune d'entre elles, de voir le classement de la table 7462. http://www.sendspace.com/file/pet0dd
Ensuite, pour chaque 7 cartes, vous aurez 21 classements différents à partir de ce tableau de 7462 que j'ai fait. Le classement le plus élevé des 21 combinaisons est celui que vous voulez connaître.
Pour comprendre le tableau : Dans chaque ligne, vous avez la main de 5 cartes (Z pour convenable, Y non convenable) et vous avez le classement de celle-ci. C'est tout ce dont vous avez besoin. Je vous donne le tableau et un exemple d'algorithme. Ce n'est pas vraiment le code. C'est un format Visual Basic et je l'ai écrit maintenant. Ça ne marche probablement pas mais vous devriez comprendre. Le code serait quelque chose comme ça :
'############### 1st: Define your hand, for example "2c2d2h2s3c3h3s" #############################################################################################
Dim mycard As New ArrayList
mycard(1).Add("2c")
mycard(2).Add("2d")
mycard(3).Add("2h")
mycard(4).Add("2s")
mycard(5).Add("3c")
mycard(6).Add("3h")
mycard(7).Add("3s")
mycard.Sort() '################# you need to sort in alphabeticall order to match it later with 7462 table #############################################
' ################## 2nd: Let´s transform it to every kind of 5 cards combinations (21). It will also preserve the alphabeticall order ##################################
Dim myHand5 As String = ""
Dim suited as String = ""
Dim ranking as Integer = 0
Dim myranking as Integer = 7462
Dim mystring as String = ""
For cicle1 = 0 to 2
For cicle2 = cicle1 + 1 to 3
For cicle3 = cicle3 + 1 to 4
For cicle4 = cicle3 + 1 to 5
For cicle5 = cicle4 + 1 to 6
myhand5 = left(mycard(cicle1),1) & left(mycard(cicle2),1) & left(mycard(cicle3),1) & left(mycard(cicle4),1) & left(mycard(cicle5),1)
suited = left(mycard(cicle1),2) & left(mycard(cicle2),2) & left(mycard(cicle3),2) & left(mycard(cicle4),2) & left(mycard(cicle5),2)
if suited = "ccccc" or suited = "ddddd" or suited = "hhhhh" or suited = "sssss" then myhand5 = myhand5 & "Z" Else myhand5 = myhand5 & "Y"
ranking = 0
FileOpen (1, "7462.txt", Input)
Do
ranking = ranking + 1
Input(1, mystring)
Input(1, ranking)
If mystring = myhand5 Then
If ranking < myranking then myrankin = ranking
End If
Loop Until EOF(1)
FileClose(1)
Next cicle5
Next cicle4
Next cicle3
Next cicle2
Next cicle1
Le classement final est la variable myranking. Vous devriez connaître votre main en moins d'une seconde. Et il est également bon de comparer avec d'autres mains, car vous avez la valeur du classement et non son nom. Et si vous voulez faire quelque chose avec les algorithmes de poker, c'est par là que vous devriez commencer. Avec les valeurs de classement, tout est rapide et facile.
Note : Je ne suis pas un programmeur. Je suis un futur programmeur. Je comprends quelques fonctions de base visuelles. J'aimerais savoir comment faire de vrais programmes. Si l'algorithme fonctionne, merci de laisser un commentaire. Si vous voulez qu'il soit très très rapide, je ne sais pas comment faire. J'aimerais avoir un algorithme ultra rapide qui me permette de vérifier (en temps réel) mes chances contre n'importe quel adversaire à chaque étape du jeu. J'ai essayé plusieurs algorithmes pour calculer mes chances au flop en temps réel mais le plus rapide que je puisse faire est de 30 secondes. Maintenant, je peux calculer mes chances au flop en 3 secondes mais j'utilise une base de données de 150 gigaoctets avec beaucoup de choses pré-calculées. Si vous voulez connaître vos chances en temps réel, vous devez avoir beaucoup de choses pré-calculées. C'est comme ça que j'ai fait.
0 votes
Bonne question, mais je pense que vous feriez mieux de vérifier les 21 combinaisons au lieu d'essayer de trouver un truc fou pour raccourcir.
8 votes
David En fait, rien n'est plus éloigné de la vérité. Les gens ont fait beaucoup d'efforts pour écrire des évaluateurs rapides de 7 cartes. Lorsque vous voulez faire des millions de mains par seconde, la vitesse devient importante.
0 votes
David : Il existe de bien meilleures méthodes, plus faciles à lire et ne nécessitant AUCUN tri. Elles sont également plus rapides de plusieurs ordres de grandeur. Un exemple est - ahem - trouvé ici : code.google.com/p/specialkpokereval .
0 votes
J'ai écrit le mien en Java à titre d'exercice (je voulais réinventer la roue pour le plaisir). Il est documenté et c'est exactement ce que vous décrivez. Vous avez déjà beaucoup de réponses mais si vous programmez en Java, cela pourrait être plus pertinent pour vous. Répondez à ce commentaire et je créerai une nouvelle réponse le reliant. Si ce n'est pas Java, je suppose que je ne serai pas plus intéressant pour vous que l'une des réponses déjà liées.
0 votes
J'ai écrit un programme Java qui vérifie les 133 millions de mains de 7 cartes en 5 secondes : codeproject.com/Articles/1068755/ C'est un projet en cours, j'espère donc qu'il deviendra encore plus rapide.