为了写发牌函数,可能需要回顾数据类型章,第四节和第九节的内容。
我认为,发牌函数有两个关键——牌从哪里来,牌到哪里去。
牌从刚才洗好的牌里面来,这个简单。同时,我觉得发牌是从牌堆的一侧顺序发的,而不是从牌堆中间随机抽一张发的——换言之,刚才洗好的那个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(思考为什么不能再发牌函数中定义这两个列表?)
如果还有什么问题或者发现了文章的错误,欢迎给我留言!邮箱可以随便乱写~