2012-09-11 3 views
2

저는 John Zelle의 Python Programming 문제를 해결하기 위해 노력해 왔습니다. 문제는 블랙 잭 딜러가 블랙 잭 딜러에게 그가 17 세가 될 때까지 치지 않으면 안되는 규칙을 부여하는 시간 비율을 보여주는 기본적인 블랙 잭 프로그램을 설계하는 것입니다.이 프로그램은 각 초기 카드에 대한 확률을 보여주기 위해 설계되었습니다. 딜러는 종종 첫 번째 카드를 공개합니다.Blackjack이 잘못된 딜러 비율을 다시 제공합니다.

내가 겪었던 문제는 Ace와 Ten을 제외한 모든 값에 대해 프로그램에서 블랙 잭 테이블을 참조 할 때 좋은 백분율을 제공하는 것 같습니다.

from random import randrange 

def main(): 
    printIntro() 
    n = getInput() 
    busts = simBlackjack(n) 
    printSummary(n, busts) 

def printIntro(): 
    print "Hello, and welcome to Blackjack.py." 
    print "This program simulates the likelihood" 
    print "for a dealer to bust." 

def getInput(): 
    n = input("How many games do you wish to simulate: ") 
    return n 

def simBlackjack(n): 
    busts = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
    for b in range(10): 
     for i in range(n): 
      x = b + 1 
      if b == 0: 
       handAce = True 
      else: handAce = False 
      while x < 17: 
       add = randrange(1,14) 
       if add == 11: 
        add = 10 
       elif add == 12: 
        add = 10 
       elif add == 13: 
        add = 10 
       elif add == 1: 
        handAce = True 
       x = x + add 
       if handAce: 
        if x + 10 >= 17 and x + 10 <= 21: 
         x = x + 10 

      if x > 21: 
       busts[b] = busts[b] + 1 

    return busts 

def printSummary(n, busts): 
    for b in range(10): 
     if b == 0: 
      print "When the initial card was Ace, the dealer busted %d times in %d games. (%0.1f%%)" % (busts[0], n, (busts[0])/float(n) * 100) 
     else: 
      print "When the initial value was %d, the dealer busted %d times in %d games. (%0.1f%%)" % ((b + 1), busts[b], n, (busts[b])/float(n) * 100) 

if __name__ == "__main__": main() 

n = 1,000,000 인 경우 온라인 테이블의 17 % 및 23 %와 크게 다른 11.5 %와 21.2 %를 얻습니다. 아무도 내게 문제가 뭔지 알려 줄 수 있니?

+1

문제를 격리하려고 시도한 대상이 무엇입니까? 계산은 무엇입니까? – Marcin

+0

딜러 카드를 사용하고 사용하는 카드를 제거하지 않을 수도 있습니까? (실제로 문제가 있는지 전혀 모른다. .. 그러나 그것은 있을지도 모른다. ..) –

+0

@JoranBeasley - 이것은 나의 생각이었다. 차이점은 너무 높아 보이지만 ... – mgilson

답변

0

대답은 내 프로그램의 백분율이 백분율 테이블을 변경하는 무한대의 갑판 신발을 기반으로한다는 것입니다. 내가 본 원래 테이블은 싱글 데크 용이었습니다. 나는 더 많은 연구를 거친 후 나의 가치가있는 많은 사이트를 발견했다.

귀하의 도움에 감사드립니다. 분명히 조나단 바나 스코 (Jonathan Vanasco)의 문제 접근 방법은 더 훌륭하고 확장 성이 뛰어났습니다. 나는 초보자이므로 매우 교육적이었습니다.

무한히 큰 갑판 신발이 확률 테이블의 가장자리에 가장 큰 영향을 미친다는 것이 흥미로운 것 같습니다.

+0

문제를 해결 한 답변을 수락하는 것을 잊지 마십시오. – Landric

+0

@ 랜드 란드 : 22 시간 후! :) –

1

내가보기에 큰 문제는 득점 논리가 'x'의 하드 값으로 루프 끝에있는 Ace를 계산하고 계속 유지된다는 것입니다. 일단 에이스가 있다면, "handAce if"라인이 매번 실행됩니다.

또한 하나의 사례 만 가질 수 있다는 아이디어를 바탕으로 만들어진 것으로 보입니다. 신발에 4 개의 데크가 있다면 24 에이스를 이론적으로는 할 수 있지만 가능성은 없습니다. 여러 번 에이스를 여러 번 처리했는데, 각각 하나씩 다른 방법으로 데크에 점수를 매길 수 있습니다.

나는 정해진 수의 덱 (즉, 카드를 소비)에서 카드 세트를 다루지 않는 것이 좋다고 생각한다.

class BlackjackHand(object): 
    cards= None 

    def __init__(self): 
     self.cards = [] 

    def autoplay(self,initial_card=None): 
     if initial_card: 
      self.cards.append(initial_card) 
     return self.calculate() 

    def calculate(self): 
     total = 0 
     for card in self.cards: 
      ## compute! 
     return total 
나는 또한 아마 자신이 바로 찾고 청결하게 유지하기 위해 얼굴을 다루는 것

:

어쨌든, 나는 아마 에이스의 문제를 해결하기 위해 OOP 스타일의 좀 더 이것을 다시 것

faces = [ str(i) for i in (1,2,3,4,5,6,7,8,9,10,'j','q','k','a') ] 
def facevalue(face): 
    if face.isdigit(): 
     return (int(face) , 0) 
    if face in ('j','q','k'): 
     return (10 , 0) 
    if face == 'a': 
     return (1 , 1) 

당신이 할 수있는이 방법 ...

def simBlackjack(n): 
    for face in faces: 
     for i in range(n): 
      hand = BlackjackHand() 
      score = hand.autoplay(initial_card=face) 

및 someth와 계산 like ...

(hand , aces) = facevalue(face) 
while True: 
    new_card = random.choice(faces) 
    (new_card_value , new_card_is_ace) = facevalue(new_card) 
    hand += new_card_value 
    aces += new_card_is_ace 
    # calculate the multiple different scoring possibilities 
    # if all of them bust, then break 

거기에 다른 문제가있을 수 있지만 큰 명백한 문제는 코드가 Ace를 잘 지원하지 않는다는 것입니다.

+2

내 생각에 두 가지 에이스를 똑같이 사용하고 싶지 않으므로 하나 이상의 에이스를 지원할 필요가 없었습니다. (그것은 본질적으로 흉상이기 때문에.) –

+0

맞아. –

관련 문제