如何在BlackJack游戏中打印手中的值

时间:2019-02-09 20:22:06

标签: python python-3.x

在BlackJack游戏中,我试图抓住手中的卡牌值之和并将其打印出来。我想知道代码中的错误并保持与我相同的逻辑。

我要从Deck类的init_deal()方法返回一个元组,并在下一个类(即Hand)中调用它。在Hand类的add()函数中,我试图对Cards的值求和以计算手中的总值。

import random

suits = ('Hearts', 'Diamonds', 'Spades', 'Clubs')
ranks = ('Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 
'Ten', 'Jack', 'Queen', 'King', 'Ace')
values = {'Two':2, 'Three':3, 'Four':4, 'Five':5, 'Six':6, 'Seven':7, 
'Eight':8, 'Nine':9, 'Ten':10, 'Jack':10, 'Queen':10, 'King':10, 'Ace':11}

class Card:    
    def __init__(self,suit,rank):
        self.suit= suit
        self.rank= rank        
    def __str__(self):
        return (f'{self.rank} of {self.suit}')

class Deck:    
    def __init__(self):
        self.deck=[]
        self.computer=[]
        self.player=[]
        for suit in suits:
            for rank in ranks:
                self.deck.append(Card(suit,rank))

    def init_deal(self):
        count=1
        while count<5:
            if count%2==0:
                comp=self.deck.pop()
                self.computer.append(comp)
                count+=1                
            elif count%2!=0:
                playr=self.deck.pop()
                self.player.append(playr)
                count+=1
            else:
                break
        return (self.computer,self.player)

class Hand(Deck):
    def __init__(self):
        self.hand=Deck().init_deal()
        self.hand_com=self.hand[0]
        self.hand_playr=self.hand[1]
        self.value_comp = 0 
        self.value_player = 0
        self.val_comp=''
        self.val_player=''        
        self.aces = 0

    def add(self):
        self.val_comp=' '.join(val.split()[0] for val in self.hand_com)
        self.val_player=' '.join(val.split()[0] for val in self.hand_playr)
        self.val_comp_lst=self.val_comp.split()
        self.val_player_lst=self.val_player.split()
        print(self.val_comp_lst)
        print(self.val_player_lst)

        for val in self.val_comp_lst:
            self.value_comp += values[val]
        for val in self.val_player_lst:
            self.value_player += values[val]
        return (self.val_comp,self.val_player)
        print(self.value_comp)
        print(self.value_player)

    def __str__():
        pass #Some logic here

x=Deck()
x.init_deal()
y=Hand(x)
y.add()

让我们假设

Deck().init_deal()

返回

(['Two of Hearts','Eight of Diamonds'],['Five of Spades','Six of Diamonds'])

根据我的代码的预期结果:

self.hand_com=['Two of Hearts','Eight of Diamonds']
self.hand_playr=['Five of Spades','Six of Diamonds']

val_comp_lst=['Two','Eight']
val_player_lst=['Five','Six']

所以最终的预期结果(实际上我无法打印):

self.value_comp = 10
self.value_player = 11

但是现在,如果我运行代码,则会收到错误消息,提示为“ AttributeError:'Card'对象没有属性'split'”

请帮助我了解我在此代码中所做的错误

2 个答案:

答案 0 :(得分:0)

您可能有一个字典,可用于将单词映射到数字值,然后使用列表补偿和求和来求和这些值:

val_comp_lst=['Two','Eight'] 

nums = {'One': 1, 'Two': 2 ...}

sum([nums[x] for x in val_comp_lst])

答案 1 :(得分:0)

value添加Card属性可能是最简单的。

class Card:
    _values = {1: 11, 11: 10, 12: 10, 13: 10}
    def __init__(self, suit, rank):
        self.suit= suit
        self.rank= rank        
    def __str__(self):
        return (f'{self.rank} of {self.suit}')

    @property
    def value(self):
        # returns the value from _values, or the rank of the card

        return self._values.get(self.rank, self.rank)

然后将手牌中的value加在一起。但是请注意,ace被计为11 1,因此之后您可能不得不弄乱这些数字!


顺便说一句:我对您的课堂结构感到困惑。您写了class Hand(Deck),但这意味着Hand 一个Deck,这似乎不太可能。您确定这就是您想要的吗?