21点主程序

为了写游戏的主程序,我把之前整理的游戏流程复制过来,并对照流程逐一解决:

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点游戏的所有程序。下面就进入测试和常见问题解决吧!
 

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

发表评论

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