2017-02-03 2 views
1

J'essaie de trouver comment je peux trouver la probabilité d'une main avec ce que serait la prochaine carte. Je ne sais pas comment vérifier la prochaine carte et obtenir la probabilité et je ne sais pas quoi faire pour l'écrire tous ensemble dans des méthodes séparées pour chaque type de main. Toute aide pour moi d'être capable de lire dans une carte à la main et de trouver la probabilité d'obtenir cette main serait grandement appréciée.Probabilité de poker en Python avec le fichier d'entrée

Écrivez un programme qui lit dans un fichier texte. Le nom sera fourni en tant que paramètre de ligne de commande. Chaque ligne vous donne une liste de 4 cartes en votre main actuelle. Après avoir lu dans le fichier, votre programme imprimera la probabilité de chaque type de main gagnante, où une main gagnante est donnée

import sys 
#error message 
if len (sys.argv) == 1: 
    print "Error" 
    exit() 
file = sys.argv[1] 
#counts and arrays 
#count = 0 

f = open(file) 
f = f.read() 
hand = f.splitlines() 
arraynum = 0 
def deck(): 
    deck = [] 
    suit = ['H', 'S', 'D', 'C'] 
    number = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'] 
    for s in suit: 
     for n in number: 
      deck.append(n+s) 
    return deck 

def startHand(arraynum): 
    hand1 = str(hand[arraynum]).split(', ') 
    hand1.sort() 
    return hand1 

def checkHand(deck,hand1): 
    for card in hand1: 
     for Card in deck: 
      if Card == card: 
       deck.remove(card) 
    return deck 

def check1(deck, hand1): 
    count = 0 
    for Card in deck: 
     for i in hand1[0:-1]: 
      if i != Card: 
       count +=1 
    prob = count/48 
    print prob 
    print count 


t1 = deck() 
t2 = startHand(3) 
t3 = checkHand(t1,t2) 
t4 = check1(t2,t3)' 

Le fichier d'entrée est: QS, JS, KS, 10S KS, 3C, 3S, QC 6D, 10D, AD, 7D

la sortie devrait ressembler à:

('Chance of Royal Flush: ', 0.020833333333333332) 
('Chance of Straight Flush: ', 0.020833333333333332) 
('Chance of Four of a Kind: ', 0.0) 
('Chance of Full House: ', 0.0) 
('Chance of Flush: ', 0.14583333333333334) 
('Chance of Straight: ', 0.125) 
('Chance of Three of a Kind: ', 0.0) 
('Chance of Two Pair: ', 0.0) 
('Chance of Pair: ', 0.25) 
('Chance of High Card: ', 0.4375) 
************************************* 

('Chance of Royal Flush: ', 0.0) 
('Chance of Straight Flush: ', 0.0) 
('Chance of Four of a Kind: ', 0.0) 
('Chance of Full House: ', 0.0) 
('Chance of Flush: ', 0.0) 
('Chance of Straight: ', 0.0) 
('Chance of Three of a Kind: ', 0.041666666666666664) 
('Chance of Two Pair: ', 0.125) 
('Chance of Pair: ', 0.8333333333333334) 
('Chance of High Card: ', 0.0) 
************************************* 

('Chance of Royal Flush: ', 0.0) 
('Chance of Straight Flush: ', 0.0) 
('Chance of Four of a Kind: ', 0.0) 
('Chance of Full House: ', 0.0) 
('Chance of Flush: ', 0.1875) 
('Chance of Straight: ', 0.0) 
('Chance of Three of a Kind: ', 0.0) 
('Chance of Two Pair: ', 0.0) 
('Chance of Pair: ', 0.25) 
('Chance of High Card: ', 0.5625) 
************************************* 
+3

Bienvenue dans StackOverflow. Veuillez lire et suivre les consignes de publication dans la documentation d'aide. [sur le sujet] (http://stackoverflow.com/help/on-topic) et [comment demander] (http://stackoverflow.com/help/how-to-ask) s'appliquent ici. StackOverflow n'est pas un service de codage ou de tutorat. – Prune

Répondre

0

est ici som Ething qui devrait vous aider à démarrer et est implémenté sur python 3.5. Il fournira le cadre pour ce que vous devez faire. Notez que vous n'avez pas besoin de vous embêter avec la platine . Les cartes d'entrée sont lues dans le fichier texte comme indiqué, puis sont mappées dans une séquence de nombres pour faciliter le traitement.

Vous devrez implémenter le reste car il est incomplet. J'espère que cela aide et bonne chance.

# Probability calculation examples are given here: https://en.wikipedia.org/wiki/Poker_probability 

import sys 
from math import factorial 

if len (sys.argv) == 1: 
    print("Error") 
    exit() 
file = sys.argv[1] 

cnv={'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8, 
    '9':9,'10':10,'J':11,'Q':12,'K':13,'A':14} 

f = open(file) 
input = f.read() 
inCards = [x.strip() for x in input.split(',')] 
cards=[{card[-1:] : cnv[card[0:-1]]} for card in inCards] 
print("All cards from input list=",cards,"\n\n") 

# Removes num cards from input list and returns them 
def getCards(cards,num): 
    hand=cards[0:num] 
    del cards[0:num] 
    return hand 

# Finds the suit with the most cards 
def maxSuit(suitSeq): 
    mv=0 
    for k,vList in suitSeq.items(): 
     if len(vList) > mv: 
     mv=len(vList) 
     mk=k 
    return mk,mv 

def seqGapsSize(suitList): 
    cumGapSizes=0 
    for i in range(1,len(suitList)): 
     cumGapSizes+=suitList[i]-suitList[i-1]-1 
    return cumGapSizes 

# Return a dict with just non-empty suits 
def nonEmptySuits(suitSeq): 
    suits={} 
    for k,vList in suitSeq.items(): 
     if len(vList) > 0: 
     suits[k]=vList 
    return suits 

# Returns a dictionary with keys of card values (ie 2,3..J,K) 
# across all suits and the # of times they occur in the hand. 
def sameCardDict(suitSeq): 
    d={} 
    for k,vList in suitSeq.items(): 
     for v in vList: 
     if v in d: 
      d[v]+=1 
     else: 
      d[v]=1 
    return d 

def getAllGaps(suits): 
    gaps=0 
    for k,vList in suits.items(): 
     gaps+=seqGapsSize(vList) 
    return gaps 

def royalFlushProb(suitSeq,numCards): 
    k,vnum=maxSuit(suitSeq) 
    if vnum!=numCards or seqGapsSize(suitSeq[k])>(5-numCards): return 0.0 
    if not set(suitSeq[k]) < set([10,11,12,13,14]): return 0.0 
    return 1.0/nChoosek(52-numCards,5-numCards) 

def straightFlushProb(suitSeq,numCards): 
    k,vnum=maxSuit(suitSeq) 
    if vnum!=numCards or seqGapsSize(suitSeq[k])>(5-numCards): 
     return 0.0 
    return 1.0/nChoosek(52-numCards,5-numCards) 

def fourOfAKindProb(suitSeq,numCards): 
    dict=sameCardDict(suitSeq) 
    maxSameNum=max(dict,key=dict.get) 
    if dict[maxSameNum]<numCards-1: return 0.0 
    return 1.0/(nChoosek(13,1)+nChoosek(12,1)) 

def fullHouseProb(suitSeq,numCards): 
    suits=nonEmptySuits(suitSeq) 
    # Need at least 2 suits for 4 cards 
    if len(suits.keys())<(5-numCards)+1: return 0.0 
    # Same card in all suits means there should be no gaps 
    if (getAllGaps(suits)!=0): return 0.0 
    return 1.0/(nChoosek(13,1)*nChoosek(2,1)+nChoosek(12,1)*nChoosek(3,1)) 

def findSeq(hand): 
    suitSeq={'C':[],'H':[],'D':[],'S':[]} 
    for c in hand: 
     for k,v in c.items(): 
      suitSeq[k].append(v) 
     suitSeq[k].sort()  
    return suitSeq 

def nChoosek(n,k): 
    return factorial(n)/(factorial(k)*factorial(n-k)) 

def computeAndPrintProbs(suitSeq,numCards): 
    print('Chance of Royal Flush: ', royalFlushProb(suitSeq,numCards)) 
    print('Chance of Straight Flush: ', straightFlushProb(suitSeq,numCards)) 
    print('Chance of Four of a Kind: ', fourOfAKindProb(suitSeq,numCards)) 
    print('Chance of Full House: ', fullHouseProb(suitSeq,numCards)) 
    print('Chance of Flush: ',) 
    print('Chance of Straight: ',) 
    print('Chance of Three of a Kind: ',) 
    print('Chance of Two Pair: ',) 
    print('Chance of Pair: ',) 
    print('Chance of High Card: ',) 
    print('*'*30,"\n"*2) 

numCards=4 
for i in range(1,4): 
    hand=getCards(cards,numCards) 
    print("Input hand on this round: ",hand) 
    suitSeq=findSeq(hand) 
    print("Hand re-organized for processing: ",suitSeq,"\n") 
    computeAndPrintProbs(suitSeq,numCards)