为BlackJack添加列表的组件

时间:2013-12-09 03:35:47

标签: python

我正在为我的一个项目制作一个BlackJack游戏。我在列表中制作了一副牌,包括等级和套装,但是当我尝试添加玩家的牌时,我只返回一个值,而不是总和。

我不知道如何管理它。首先,我必须得到列表中的所有元素,然后移除套装以获得一个数字,但我的一些数字是字母(杰克,女王,国王,王牌......)并且具有特定值。我该如何将它们加在一起?我和其他人一起尝试过,但是徒劳无功。

有关如何实现这一目标的任何提示?

以下是我的代码示例:

def create_deck(): #this creates the deck of cards
    suit_string = 'hdcs'
    rank_string = '23456789TJQKA'
    global deck
    deck = []
    for suit in range(4):
        for suit in range(13):
            cards = rank_string[rank] + suit_string[suit]
            deck.append(cards)
            random.shuffle(deck)
    return deck

def deal_cards(): #This takes one card from the deck and gives it to the player
    return deck.pop(0)

def hand(): #Initial two cards
    global player1_hand
    player1_hand = []
    print "Player's hand:"
    for i in range(2): #initial cards
        player1_hand.append(deal_cards())
    print player1_hand
    print value()   

def value():
    i = 0
    while i < len(player1_hand):
        card = player1_hand[i]
        value = card[i]
        if value in ('T','J','Q','K'):
            return 10
        elif value == 'A':
            print "Please choose between 1 and 11."
            value_a = input("---> ")
            return value_a
        else:
            return value
    i += 1

现在这就是它给我的东西:

Player's hand:
['Ks','Th']
Value 10

我知道我并没有真正添加这些值,但我不知道如何管理它。

任何帮助都将不胜感激。

希望我很清楚,因为英语不是我的主要语言。

3 个答案:

答案 0 :(得分:0)

您编写的函数value()看起来像是要计算player1_hand的总值。但该函数只返回它看到的第一张卡的值:

while i < len(player1_hand):
    if value in ('T','J','Q','K'):
        return 10
    elif value == 'A':
        ...
        return value_a
    else:
        ...
        return value

return语句会导致value()立即返回,而不会继续循环。我想你想要做的就是让循环的每一步都将卡的值加到手的总价值中:

total_value = 0
for card in player1_hand:
    rank = card[0]
    if rank in ('T', 'J', 'Q', 'K'):
        total_value += 10
    elif rank == 'A':
        print "Please choose between 1 and 11."
        value_a = input("---> ")
        total_value += int(value_a)
    else:
        total_value += int(rank)
return total_value

答案 1 :(得分:0)

首先,首先,代码中存在一些可能导致某些问题的错误。

1)在你的create_deck方法中,两个for循环都使用变量suit作为它们的迭代器,我假设第一个应该设置为排名吗?

2)你应该用return语句结束所有方法,即使它们什么也没有返回。这将迫使该方法退出并且是良好的编码实践。

好的,为了解决您的问题,您应该让您的值方法读取这样的内容。现在你退出方法,然后返回手牌中的总值,只返回一个值。要解决这个问题,请在while循环之外创建一个全局值,并将值元素添加到其中:

def value():
    i = 0
    total_value = 0
    while i < len(player1_hand):
        card = player1_hand[i]
        value = card[i]
        if value in ('T','J','Q','K'):
            total_value += 10
        elif value == 'A':
            print "Please choose between 1 and 11."
            value_a = input("---> ")
            total_value += value_a
        else:
            total_value += value
    i += 1
    print(value)
    return

答案 2 :(得分:0)

通过使用dict的“排名值”,你可以循环播放玩家的手并总计价值。

def value():
    hand_total = 0
    # Add in a dict of "rank values" (excluding the Ace)
    rank_values = {'2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8,
                   '9':9, '10':10, 'J':10, 'Q':10, 'K':10}
    # No need for the while loop 
    for i in xrange(len(player1_hand)):
        card = player1_hand[i][0] # the added index will get the card          
        if card == 'A':          # without the suit.
            print "Please choose between 1 and 11."
            value_a = input("---> ")
            hand_total += int(value_a) # add a type check before this
        else:
            hand_total += rank_values[card]
    return hand_total

使用dict您无需区分面部卡或编号卡,只需使用键(卡)值和总金额。