2017-02-03 12 views
1

Я пытаюсь выяснить, как я могу найти вероятность руки с любой следующей картой. Я не знаю, как проверить следующую карточку и получить вероятность, а также не знаю, что делать, чтобы написать все вместе в отдельные методы для каждого вида рук. Любая помощь для меня, чтобы быть в состоянии прочитать в карточке в руке и найти вероятность получить эту руку, будет очень признательна.Вероятность покера в Python с входным файлом

Напишите программу, которая читает в текстовом файле. В качестве параметра командной строки имя будет предоставлено . Каждая строка дает вам список из 4-х карт в вашей текущей руке. После чтения файла, ваша программа будет печатать из вероятности каждого типа выигрыша руки, где дается выигрышная рука

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)' 

Входной файл: QS, JS, KS, 10S KS, 3С, 3S, QC 6D, 10D, AD, 7D

вывод должен выглядеть следующим образом:

('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

Добро пожаловать в StackOverflow. Прочтите и следуйте инструкциям по отправке в справочной документации. [по теме] (http://stackoverflow.com/help/on-topic) и [как спросить] (http://stackoverflow.com/help/how-to-ask) применяются здесь. StackOverflow не является кодовым или учебным сервисом. – Prune

ответ

0

Вот сома что должно начаться и реализовано на python 3.5. Это обеспечит структуру за то, что вам нужно. Обратите внимание, что вам не нужно беспокоиться о колоде . Входные карты считываются из текстового файла, как указано, но затем отображаются в последовательность чисел для упрощения обработки.

Вам придется реализовать остальное, так как оно неполное. Надеюсь, что помогает и удачи.

# 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)