Calcul de chance de gain pour un jeu de poker de type Texas Holdem.
Les calculs sont réalisés par choix avant l'arrivée du flop, ce qui peut être facilement modifié
pour suivre chaque étape du jeu.
Source / Exemple :
from pylab import *
from numpy import *
from scipy import *
import time
tps1=time.clock()
def hand(cartes):
"The aim of this function is to determine the best 5 card hand"
"out of a set of 7 cards."
# Pair
main = cartes[:]
sortie = 0
exit = 0
a = 10000
for i in range(7):
if (int(cartes[i]/100)==2):
a += 10
elif (int(cartes[i]/100)==3):
a += 100
elif (int(cartes[i]/100)==4):
a += 1000
else:
a += 1
# print a
a = str(a)
if (a[1]>='5' or a[2]>='5' or a[3]>='5' or a[4]>='5'):
# The hand present at least a flush :
if (a[1]>='5'):
for i in range(7):
if (int(cartes[i]/100)!=4):
main.remove(cartes[i])
if (len(main)==5):
break
elif (a[2]>='5'):
for i in range(7):
if (int(cartes[i]/100)!=3):
main.remove(cartes[i])
if (len(main)==5):
break
elif (a[3]>='5'):
for i in range(7):
if (int(cartes[i]/100)!=2):
main.remove(cartes[i])
if (len(main)==5):
break
elif (a[4]>='5'):
for i in range(7):
if (int(cartes[i]/100)!=1):
main.remove(cartes[i])
if (len(main)==5):
break
for i in range(len(main)):
main[i]=main[i]%100
main.sort()
main.reverse()
main2 = list(set(main))
main2.reverse()
if (len(main2)>=5):
for i in range(len(main2)-4):
if (main2[i]==main2[i+4]+4):
# print 'suited flush'
sortie = (main2[i])*10**20
exit = 1
if (exit==0):
# print main
if (main2[0]==13 and main2[-1]==1):
if (main2[-4]==main2[-1]+3):
# print 'little suite'
sortie = (main2[-4])*10**12
exit=1
if (exit==0):
for i in range(5):
# print 'flush'
sortie += (main[i])*10**(2*(4-i))
sortie = sortie*10**6
else:
# 2oaK // 3oaK // suite // Full // 4oaK
for i in range(len(main)):
main[i]=main[i]%100
main.sort()
main.reverse()
main2 = list(set(main))
main2.reverse()
if (len(main2)>=5):
for i in range(len(main2)-4):
if (main2[i]==main2[i+4]+4):
# print 'suited'
sortie = (main2[i])*10**12
exit=1
if (exit==0):
# print main
if (main2[0]==13 and main2[-1]==1):
if (main2[-4]==main2[-1]+3):
# print 'little suite'
sortie = (main2[-4])*10**12
exit=1
for i in range(len(main)-3):
if (exit==0):
if (main[i]==main[i+3]):
# print '4 of a kind'
sortie = main[i]
main.remove(main[i])
main.remove(main[i])
main.remove(main[i])
main.remove(main[i])
sortie = sortie*10**18 + main[0]
exit=1
for i in range(len(main)-2):
if (exit==0):
if (main[i]==main[i+2]):
sortie = main[i]
main.remove(main[i])
main.remove(main[i])
main.remove(main[i])
for j in range(len(main)-1):
if (main[j]==main[j+1]):
# print 'full'
sortie = sortie*10**16 + main[j]
exit=1
if (exit==0):
# print '3 of a kind'
sortie = sortie*10**10+main[0]*100+main[1]
exit=1
for i in range(len(main)-1):
if (exit==0):
if (main[i]==main[i+1]):
sortie = main[i]
main.remove(main[i])
main.remove(main[i])
for j in range(len(main)-1):
if (main[j]==main[j+1]):
# print '2 pairs'
sortie = sortie*10**8 + main[j]*10**6
main.remove(main[j])
main.remove(main[j])
sortie += main[0]
exit=1
break
if (exit==0):
# print '2 of a kind'
sortie = sortie*10**6
sortie += (main[0])*10**4+(main[1])*100+main[2]
exit=1
if (exit==0):
# print 'nothing'
for i in range(5):
sortie += main[i]
return sortie
Clubs = ['C2','C3','C4','C5','C6','C7','C8','C9','CT','CJ','CQ','CK','CA']
Diamonds = ['D2','D3','D4','D5','D6','D7','D8','D9','DT','DJ','DQ','DK','DA']
Hearts = ['H2','H3','H4','H5','H6','H7','H8','H9','HT','HJ','HQ','HK','HA']
Spades = ['S2','S3','S4','S5','S6','S7','S8','S9','ST','SJ','SQ','SK','SA']
Jeu = Clubs + Diamonds + Hearts + Spades
nplayers = input('Number of players ?')
# nplayers = 9
card1=raw_input('\n Please enter your first card :')
card2=raw_input('Please enter your second card :')
myhand=card1,card2
# myhand = 'CA','SA'
N = 5000
gain = zeros(nplayers)
for iter in range(N):
hands=0,0
# print iter
# Jeu_1 : cards that might stay in the game
# Jeu_2 : index of theses cards
Jeu_1 = Jeu[:]
Jeu_2 = range(52)
for i in range(13):
for j in range(4):
Jeu_2[j*13+i] = 100*(j+1)+(i+1)
#
# print hands
# translation into card index :
for i in range(2):
if myhand[0][i][0]=='C':
n = Clubs.index(myhand[0][i])
carte = 100+(n+1)
elif myhand[0][i][0]=='D':
n = Diamonds.index(myhand[0][i])
carte = 200+(n+1)
elif myhand[0][i][0]=='H':
n = Hearts.index(myhand[0][i])
carte = 300+(n+1)
elif myhand[0][i][0]=='S':
n = Spades.index(myhand[0][i])
carte = 400+(n+1)
hands[0][i] = carte
#
Jeu_1.remove(Jeu_1[Jeu_2.index(hands[0][0])])
Jeu_2.remove(hands[0][0])
Jeu_1.remove(Jeu_1[Jeu_2.index(hands[0][1])])
Jeu_2.remove(hands[0][1])
#
#
# first round :
#--------------
for n in range(nplayers-1):
cards = [0,0]
for i in range(2):
rd = rand(1)
tirage=rd*(len(Jeu_2)-1)
# print n,i,int(tirage)
cards[i]=Jeu_2[int(tirage)]
Jeu_1.remove(Jeu_1[Jeu_2.index(cards[i])])
Jeu_2.remove(cards[i])
hands += [cards]
#
cards=[]
for i in range(5):
rd = rand(1)
tirage=rd*(len(Jeu_2)-1)
cards += [Jeu_2[int(tirage)]]
Jeu_1.remove(Jeu_1[Jeu_2.index(cards[i])])
Jeu_2.remove(cards[i])
#
scores=[]
for n in range(nplayers):
cartes = hands[n] + cards
# print cartes
scores += [hand(cartes)]
# print scores
gain[scores.index(max(scores))] += 1
gain = gain/float(N)
print''
print '\tRESULTS with hand :',myhand[0][0],myhand[0][1]
print '*******************************************'
for i in range(len(gain)):
if (i==0):
print 'you','\t\t-->\t',gain[i]*100,'\t%'
else:
print 'player',i+1,'\t-->\t',gain[i]*100,'\t%'
print '*******************************************'
print 'error : ',100*(max(gain[1:])-min(gain[1:])),'%'
tps2=time.clock()
print 'execution time :',tps2-tps1,'s'
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.