计分

为了写计分函数,可能需要回顾上一章第四节第五节的内容,和数据类型章第六节关于字典(dict)的内容。

在游戏进行的过程中,我们需要多次对不同的参与者进行计分,以判断是否有超过21点的或是哪边点数更接近21。因此,计分函数也需要接收参数,来确定究竟是计算哪个参与者的分数。

由于各参与者的列表中的元素是扑克牌的牌面而不是单纯的数字,我首先建立一个字典(dict)来使牌面和其所代表的点数一一对应起来:

value_dict = {'A':11, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, '10':10, 'J':10, 'Q':10, 'K':10}

这其中只有一个问题,就是卡牌A,既可以代表11点,又可以代表1点。在字典中我决定先忽略代表1点的情况,放到后面来处理。

然后观察洗牌函数得到的列表:

>>> deck
['♣3', '♡9', '♠2', '♡A', '♠K', '♠8', '♣7', '♡8', '♣Q', '♢3', '♣2', '♢6', '♠J', '♡4', '♠3', '♡2', '♠7', '♢5', '♡3', '♢7', '♡6', '♣A', '♣10', '♢A', '♣5', '♣J', '♢10', '♡K', '♣4', '♠9', '♣8', '♠4', '♠10', '♣9', '♢9', '♢2', '♢4', '♣6', '♠A', '♣K', '♢Q', '♢J', '♡J', '♠5', '♠Q', '♢8', '♡Q', '♡7', '♡10', '♡5', '♠6', '♢K']

发现,每一张牌(表中每个元素)都是一个字符串。如果把该字符串的第一个字符(花色符号)忽略,就可以取得建立好的字典中的“键”,这一点我们可以用字符串切片来实现,例如:

>>> card = deck[1]
>>> card
'♡9'
>>> card[1:]
'9'

同时,因为卡牌A有特殊性,我还需要计算该参与者是否拿到了卡牌A,拿到了几张卡牌A。

同样,我使用变量player来替代参与者:

result = 0
A_num = 0

for card in player:
        
    if card[1:] == 'A': # 如果这张牌是A,那么A_num增加1
        A_num += 1 #注:x = x + 1可以简写为x += 1;同理x -= 1即 x = x - 1

    result += value_dict[card[1:]] #根据字典中的对应情况计算点数和

接着,处理卡牌A的问题。如果参与者手上的牌点数之和在A作为11点的情况下超过了21,那么参与者必须选择将A计为1点来防止爆牌。基于这一点,我打算作如下计算:

while result > 21 and A_num > 0: #如果参与者手里有A,且当A作11分计时总分大于21
    result -= 10 #将A改为1分计算,减去多算的10分
    A_num -= 1 #将改为1点计算的A去除

最后,给函数取个名字,叫做evaluate咯:

def evaluate(player):
    '计算参与者手中牌点数总和'
    value_dict = {'A':11, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, '10':10, 'J':10, 'Q':10, 'K':10}

    result = 0
    A_num = 0

    for card in player:
        
        if card[1:] == 'A':
            A_num += 1

        result += value_dict[card[1:]]

    while result > 21 and A_num > 0:
        result -= 10
        A_num -= 1

    return result

 

如果还有什么问题或者发现了文章的错误,欢迎给我留言!邮箱可以随便乱写~

发表评论

邮箱地址不会被公开。 必填项已用*标注