【问题标题】:Blackjack While Loop Trouble二十一点而循环故障
【发布时间】:2018-04-23 21:25:57
【问题描述】:

所以我几乎是在制作一个二十一点模拟器来确定某些手牌获胜与否的概率。我有一个while循环来循环浏览一副完整的52张牌,直到剩下4张牌。在那之内,我有一个while循环让庄家抽牌,直到他的点数达到17+,就像真正的二十一点一样。当我运行代码时,它将成功运行一副牌,但每次只打印同一只手。代码如下:

# <--- PROGRAM SETUP --->
import random

# Drawing Card Function
def draw_card():
    # Card Values in 1 Deck
    vals = [2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,
            8,8,8,8,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,
            10,10,10,10,10,10,10,10,10,11,11,11,11]
    # </--->

    dealer = 0
    player = 0
    bust = 21


    deck_count = 0
    hand_count = 0

    dealer_cards = []

    # <--- // --->

    cards = 52
    # Loop Hands Through Deck
    while(cards > 4):

        # Draw Card Loop
        while(dealer <= 16):
            card = random.choice(vals)
            vals.remove(card)
            dealer_cards.append(card)

            dealer = dealer + card

        hand_count = hand_count + 1
        cards = cards - len(dealer_cards)


        # <--- Results --->
        if 17 <= dealer <= 21:
            print "Hand: {}, Dealer Stands @ {}".format(hand_count, dealer)
            for i in dealer_cards:
                print "Card: {}".format(i)

        else:
            print "Hand: {}, Dealer Busts @ {}".format(hand_count, dealer)
            for i in dealer_cards:
                print "Card: {}".format(i)

    else:
        deck_count = deck_count + 1
        print "Deck {} is finished!".format(deck_count)

# <--- // --->

draw_card()

运行时我得到:

    Hand: 1, Dealer Stands @ 19
Card: 10
Card: 9
Hand: 2, Dealer Stands @ 19
Card: 10
Card: 9
Hand: 3, Dealer Stands @ 19
Card: 10
Card: 9
Hand: 4, Dealer Stands @ 19
Card: 10
Card: 9
Hand: 5, Dealer Stands @ 19
Card: 10
Card: 9
Hand: 6, Dealer Stands @ 19
Card: 10
Card: 9
Hand: 7, Dealer Stands @ 19
Card: 10
Card: 9
Hand: 8, Dealer Stands @ 19
Card: 10
Card: 9
Hand: 9, Dealer Stands @ 19
Card: 10
Card: 9
Hand: 10, Dealer Stands @ 19
...All the way till the deck has less than 4 cards left.

我可以解决什么问题以使每手牌都成为唯一的抽牌,而不是多次打印第一手牌?谢谢

【问题讨论】:

  • dealer &gt; 16cards &gt; 4 时,循环无限继续。重新考虑你的不变量。

标签: python random while-loop blackjack


【解决方案1】:

您忘记在每次迭代之前重置dealerdealer_cards,因此您的while(dealer &lt;= 16): 块在第一次之后将永远不会运行;它会继续使用相同的分数,但会继续递减cards

将您的初始化移动到主 while 循环中:

while(cards > 4):
    dealer_cards = []
    dealer = 0

    # Draw Card Loop
    while(dealer <= 16):
        card = random.choice(vals)
        vals.remove(card)
        dealer_cards.append(card)

        dealer = dealer + card

...

【讨论】:

  • 修正后,现在您需要正确处理 A。很少有赌场站在软 17 上,当然没有人会像这段代码那样将两个 A 算作失败。
【解决方案2】:

您实际上并没有在循环迭代之间清除庄家的牌。

所以,他可以抽一张牌,自从他到了 19 岁,就永远坚持下去,跳过内部的 while dealer &lt; 17 循环,知道他有足够的手牌,几乎可以永远用你所有的虚拟货币来骗你。

只需在 if/else 检查结果后设置dealer = 0

【讨论】:

    猜你喜欢
    • 2015-08-12
    • 2012-12-15
    • 2013-12-08
    • 1970-01-01
    • 2015-06-18
    • 2010-11-22
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多