扑克牌游戏(黑杰克)牌数不超过21点

题目:
在这里插入图片描述

import random


def get_shuffled_deck():
    # ()元祖/定值表

    # [] 列表:可用于存储其值可变的表

    # {} 可变集合(set):特点时集合中的元素都不可重复,且无序,其存储依据对象的hash码
    # 定义的方式:{x[,x,x...,x]}

    # {} 字典:见必须是hash对象
    # 定义的方式:{键1:值1[,键2:值2,....]}

    # ###初始化包括52张扑克牌的列表,并混合后返回,表示一副洗好的扑克牌###
    # 花色suits和序号
    suits = {'♣', '♥', '♦', '♠'}
    ranks = {'2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'}
    deck = []
    # 创建一副52张的扑克
    for suit in suits:
        for rank in ranks:
            deck.append(rank+''+suit)
    # random.shuffle(x[,random]):用于将一个列表中的元素打乱
    random.shuffle(deck)
    return deck


def deal_card(deck, participant):
    # ###发一张牌给参与者participant###
    # deck.pop([i]) 返回并移除下标i位置的对象,当省略i是为最后对象。
    # pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
    card = deck.pop()
    participant.append(card)
    return card


def compute_total(hand):
    # ### 计算并返回一手牌的点数和#####
    values = {'2': 2, '3': 3, '4': 4, '5': 5, '6': 6,
              '7': 7, '8': 8, '9': 9, '1': 10, 'J': 10,
              'Q': 10, 'K': 10, 'A': 11}
    result = 0   # 初始化点数和为0
    numAccs = 0  # A的个
    # 计算点数和A的个数
    for card in hand:
        result += values[card[0]]
        if card[0] == 'A':
            numAccs += 1
        # 如果点数和 > 21,则尝试把A当作1来计算
        # (即减去10),多个A循环减去10,直到点数<=21
    while result > 21 and numAccs > 0:
        result -= 10
        numAccs -= 1
    return result


def blackjack():
    # ###21点扑克牌游戏, 计算机人工智能AI为庄家,用户为玩家#####
    # 初始化一副洗好的扑克牌,初始化庄家和玩家手中的牌为空
    deck = get_shuffled_deck()
    house = []  # 庄家的牌
    player = []  # 玩家的牌
    # 依次给玩家和庄家各发两张牌
    for i in range(2):   # 开始发两轮牌
        deal_card(deck, player)  # 给玩家发一张牌
        deal_card(deck, house)   # 给庄家发一张牌
    # 打印一手牌
    print('庄家的牌:', house)
    print('玩家的牌:', player)

    # 询问玩家是否继续拿牌, 如果是,继续给玩家发牌
    answer = input('是否继续拿牌(y/n,(缺省为y)):')
    while answer in ('', 'y', 'Y'):
        card = deal_card(deck, player)
        print('玩家拿到的牌为:{0}, {1}'.format(card, player))
        # 计算牌点
        if compute_total(player) > 21:
            print('爆掉 。。。。。玩家输牌!')
            return

            # 询问玩家是否继续拿牌, 如果是,继续给玩家发牌
        answer = input('是否继续拿牌(y/n,(缺省为y)):')
        # 庄家(计算机人工智能)按“庄家规则)确定是否拿牌
    while compute_total(house) < 17:
        card = deal_card(deck, house)
        print('庄家拿到的牌:{0}, {1}'.format(card, house))
        # 计算牌点
        if compute_total(house) > 21:
            print('爆掉。。。玩家赢牌')
            return

    # 分别计算庄家和玩家的点数,比较点数大小, 输出输赢结果的信息
    houseTotal, playerTotal = compute_total(house), compute_total(player)
    if houseTotal > playerTotal:
        print('庄家赢!')
    elif houseTotal < playerTotal:
        print('玩家赢!')
    elif houseTotal == 21 and 2 == len(house) < len(player):
        print('You loose')  # 拥有blackjack的庄家赢牌
    elif  playertotal == 21 and 2 == len(player) < len(house):
        print('庄家赢牌!')
    else:
        print('平局!')


if __name__ == '__main__':
    blackjack()

运行结果:
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值