为了写游戏的主程序,我把之前整理的游戏流程复制过来,并对照流程逐一解决:
1.首先,需要两个参与者————电脑和玩家、一副去掉大小王的牌,并将这副牌打乱(洗牌)。在之前的函数中,我已经决定用“列表”来装参与者获得的扑克牌,因此:
user = [] #新建空白列表,存放玩家的卡牌 computer = [] #新建空白列表,存放电脑的卡牌 deck = shuffled_deck() #利用写好的洗牌函数,将洗好的牌放入变量deck中
2.接着,从这副牌中拿出一张发给玩家、一张发给电脑,又一张发给玩家,又一张发给电脑,并在屏幕上公示玩家、电脑拿到的牌:
for i in range(2): deal_card(deck, user) #利用写好的发牌函数,发牌给玩家 deal_card(deck, computer) #利用写好的发牌函数,发牌给电脑 print('\n庄家拿到了:', computer, '\n你拿到了:', user, sep ='')
这一步中,如果我将deal_card函数写四次,固然是可以的。但是试想如果不仅仅发两轮牌,而是需要把一副牌都发完的游戏,那用for循环就能使代码变得简练直观。
3.然后,询问玩家是再抽一张,还是停牌
- 如果玩家再抽一张,则要判断此时玩家手上3张牌点数是否大于21
- 如果大于21,玩家爆牌
- 如果小于21,回到流程3
- 如果玩家停牌,继续流程4
answer = input('\n再抽一张请输入h,停牌请输入s:') #利用变量answer储存玩家的选择 while answer == 'h': #如果玩家选择再抽,则发牌给玩家并提示玩家拿到了什么牌 deal_card(deck, user) print('\n你拿到了:', user[-1]) #user[-1]即用来储存玩家卡牌列表中最后(最新添加)的元素 if evaluate(user) > 21: #如果玩家选择再抽,发牌后须检查玩家是否爆牌 print('\n你的总点数为:', evaluate(user), '。爆掉啦!', sep ='') return #返回None,实际作用为结束游戏,防止下面的代码继续运行 answer = input('\n再抽一张请输入h,停牌请输入s:') #如果玩家选择再抽,且再抽后没有爆牌,则再次询问玩家抽排还是停牌
观察上面这一段时要仔细分析其中逻辑,注意到第三行以下的所有代码均是while循环的缩进语块。只有当answer不再是’h‘或者玩家爆牌的时候,程序才会退出while循环。
4.现在,判断电脑的点数和是否小于17
- 电脑点数和小于17,则电脑必须再抽一张牌,并回到流程4
- 电脑点数和大于等于17但小于等于21,电脑必须停牌,继续流程5
- 电脑点数和大于21,电脑爆牌
while evaluate(computer) < 17: #电脑牌点数和小于17则必须抽牌 deal_card(deck, computer) print('\n庄家拿到了:', computer[-1]) if evaluate(computer) > 21: #电脑抽牌后须判断其是否爆牌 print('\n庄家的总点数为:', evaluate(computer), '。庄家爆啦!', sep ='') return
观察上面一段时也应注意思考什么时候这个while循环才会退出。
5.比较玩家和电脑手中点数和哪个更接近21
- 电脑更接近21,电脑胜
- 玩家更接近21,玩家胜
- 双方均为21,但电脑拿到黑杰克,电脑胜
- 双方均为21,但玩家拿到黑杰克,玩家胜
- 平局
compare(computer, user) #所有的判断都写好在compare函数里面了
综上所述,我们把所有代码整理为一个函数,取名为blackjack:
def blackjack(): 'Python简版21点游戏主函数' user = [] computer = [] deck = shuffled_deck() for i in range(2): deal_card(deck, user) deal_card(deck, computer) print('\n庄家拿到了:', computer, '\n你拿到了:', user, sep ='') answer = input('\n再抽一张请输入h,停牌请输入s:') while answer == 'h': deal_card(deck, user) print('\n你拿到了:', user[-1]) if evaluate(user) > 21: print('\n你的总点数为:', evaluate(user), '。爆掉啦!', sep ='') return answer = input('\n再抽一张请输入h,停牌请输入s:') while evaluate(computer) < 17: deal_card(deck, computer) print('\n庄家拿到了:', computer[-1]) if evaluate(computer) > 21: print('\n庄家的总点数为:', evaluate(computer), '。庄家爆啦!', sep ='') return compare(computer, user)
至此,我们就完成简版21点游戏的所有程序。下面就进入测试和常见问题解决吧!
如果还有什么问题或者发现了文章的错误,欢迎给我留言!邮箱可以随便乱写~