发牌

为了写发牌函数,可能需要回顾数据类型章,第四节第九节的内容。

我认为,发牌函数有两个关键——牌从哪里来,牌到哪里去。

牌从刚才洗好的牌里面来,这个简单。同时,我觉得发牌是从牌堆的一侧顺序发的,而不是从牌堆中间随机抽一张发的——换言之,刚才洗好的那个deck列表,要么从头开始抽出元素发给玩家,要么从尾巴开始抽出,不应该是从中间抽。同时,发出去的牌就不应该再存在于deck列表中了。回顾列表的方法,我觉得最有效的就是pop(),既能从列表尾抽出元素、也能返回这个被抽出的元素、还能把该元素从原列表中删除:

card = deck.pop()

这样一来,我们就将deck列表最后一个元素赋值给了变量card,同时将这个元素从deck中删除。
 

21点简化版的参与者有两个——玩家和电脑。因此,二者都该有一个专属的列表来储存发给他们的牌。牌的去向也就应该是这两个列表。同时,要做到只写一个函数,就可以发牌给不同的人,意味着这个函数需要将发牌这一相同规则,作用于不同的对象——发牌函数需要参数。

好啦,将上述内容整理为一个函数,取名叫deal_card:

def deal_card(deck, player):
    '给参与者发牌'
    card = deck.pop()
    player.append(card)

 

FAQ:

Q:为什么deal_card函数需要两个参数,第一个deck参数是做什么用的?

A:我们先这样理解:在洗牌函数中,我们返回了洗好的列表deck,此时我们需要一个媒介,将洗牌函数中的deck引到发牌函数中来才能使用。在本次实战结束后,我们会学习命名空间,届时将详细讲为什么洗牌函数中的deck,不能直接被发牌函数调用。

 

Q:player这个变量是怎么来的?

A:player只是一个名称,指的是用来存储玩家或者电脑手中的牌的列表。也就是说,在21点游戏程序的其他地方,我们需要定义两个列表,用来替换发牌函数中的player(思考为什么不能再发牌函数中定义这两个列表?)

 

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

发表评论

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