请选择 进入手机版 | 继续访问电脑版

Python实现 21点扑克

[复制链接]
冰宇 发表于 2020-12-31 18:58:08 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
这次让我们来用Python实现一个21点扑克游戏
首先我们要初始化一套扑克牌,并将它打乱
  1. def get_shuffled_deck():    """初始化包罗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(suit + ' ' + rank)    random.shuffle(deck)    # print(deck)    return deck
复制代码
然后呢 我们要写一个函数,去盘算手牌的点数,好判定是否会高出21点
  1. def compute_total(hand):    """盘算并返回一手牌的点数和"""    values = {'2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8,              '9': 9, '10': 10, 'J': 0.5, 'Q': 0.5, 'K': 0.5, 'A': 1}    result = 0  # 初始化点数和为0    # 盘算点数和A的个数    for card in hand:        # print(card)        result += values[card[2:]]    return result
复制代码
我们还要写一个简单的显示函数,告诉玩家手牌都有啥
  1. def print_hand(hand):    """将牌打印"""    for card in hand:        print(card, end='  ')    print()
复制代码
接下来 完善一下发牌规则
  1. def deal_card(deck, participant, flag):    """发一张牌给到场者participant"""    card = deck.pop()    if flag:        flag_1 = input('是否开启高级玩家模式(输入H)')        if flag_1 == 'H':            password = input('输入高级玩家暗码:')            # password=123456            if password == '123456':                print(card)                flag_2 = input('是否要这张牌(输入是/否):')                if flag_2 == '是':                    participant.append(card)                    return card                else:                    return            else:                print('输入暗码错误')                print('直接发牌')                participant.append(card)                return card        else:            participant.append(card)            return card    else:        participant.append(card)        if compute_total(participant) > 21:            participant.pop()            return        else:            return card
复制代码
最后 就是最关键的主体函数 游戏的核心
  1. def blackjack():    global money    deck = get_shuffled_deck()    house = []  # 庄家的牌    player = []  # 玩家的牌    # 依次给玩家和庄家各发两张牌    for i in range(2):        deal_card(deck, player, False)        deal_card(deck, house, False)    # 打印一手牌    print(&#39;庄家的牌:&#39;, end=&#39;&#39;)    print_hand(house)    print(&#39;玩家的牌:&#39;, end=&#39;&#39;)    print_hand(player)    bet = 10    print(&#39;下注10元&#39;)    # print(len(house))    # 询问玩家是否继承拿牌,如果是,继承给玩家发牌    answer = input(&#39;是否继承拿牌(y/n,缺省为y):&#39;)    while True:        while answer in (&#39;&#39;, &#39;y&#39;, &#39;Y&#39;):            if len(player) >= 5:                break            card = deal_card(deck, player, True)            print(&#39;玩家拿到的牌为:&#39;, end=&#39;&#39;)            print_hand(player)            flag = input(&#39;是否加注(是/否):&#39;)            if flag == &#39;是&#39;:                bet_num = int(input(&#39;加注多少元:&#39;))                if bet_num + bet > money:                    print(&#39;穷货,你没那么多钱&#39;)                else:                    bet += bet_num                    print(&#39;加注乐成,当前下注金额:&#39;, bet)            # 盘算牌点            if compute_total(player) > 21:                print(&#39;爆掉  玩家输牌!&#39;)                money -= int(bet * random.uniform(1, 2))                return            answer = input(&#39;是否继承拿牌(y/n,缺省为y):&#39;)        # 庄家(盘算机人工智能)按“庄家规则”确定是否拿牌        while compute_total(house) < 17:            if len(house) >= 5:                break            card = deal_card(deck, house, False)            print(&#39;庄家拿到的牌为:&#39;, end=&#39;&#39;)            print_hand(house)        answer = input(&#39;是否进入结算(y/n,缺省为y):&#39;)        if answer in (&#39;&#39;, &#39;y&#39;, &#39;Y&#39;):            break    # 分别盘算庄家和玩家的点数,比较点数巨细,输出输赢效果信息    houseTotal, playerTotal = compute_total(house), compute_total(player)    if houseTotal > playerTotal:        print(&#39;庄家赢牌!&#39;)        money -= int(bet * random.uniform(1, 2))    elif houseTotal < playerTotal:        print(&#39;玩家赢牌!&#39;)        money += int(bet * random.uniform(1, 2))    # 拥有blackjack的庄家赢牌    elif houseTotal == 21 and 2 == len(house) < len(player):        print(&#39;庄家赢牌!&#39;)        money -= int(bet * random.uniform(1, 2))    # 拥有blackjack的玩家赢牌    elif playerTotal == 21 and 2 == len(player) < len(house):        print(&#39;玩家赢牌!&#39;)        money += int(bet * random.uniform(1, 2))    else:        print(&#39;平手!&#39;)
复制代码
完整代码如下:
  1. import randommoney = 100  # 玩家的总资产def get_shuffled_deck():    """初始化包罗52张扑克牌的列表,并混排后返回,表现一副洗好的扑克牌"""    # 花色suits和序号    suits = {&#39;♣&#39;, &#39;♠&#39;, &#39;♦&#39;, &#39;♥&#39;}    ranks = {&#39;2&#39;, &#39;3&#39;, &#39;4&#39;, &#39;5&#39;, &#39;6&#39;, &#39;7&#39;, &#39;8&#39;, &#39;9&#39;, &#39;10&#39;, &#39;J&#39;, &#39;Q&#39;, &#39;K&#39;, &#39;A&#39;}    deck = []    # 创建一副52张的扑克牌    for suit in suits:        for rank in ranks:            deck.append(suit + &#39; &#39; + rank)    random.shuffle(deck)    # print(deck)    return deckdef deal_card(deck, participant, flag):    """发一张牌给到场者participant"""    card = deck.pop()    if flag:        flag_1 = input(&#39;是否开启高级玩家模式(输入H)&#39;)        if flag_1 == &#39;H&#39;:            password = input(&#39;输入高级玩家暗码:&#39;)            # password=123456            if password == &#39;123456&#39;:                print(card)                flag_2 = input(&#39;是否要这张牌(输入是/否):&#39;)                if flag_2 == &#39;是&#39;:                    participant.append(card)                    return card                else:                    return            else:                print(&#39;输入暗码错误&#39;)                print(&#39;直接发牌&#39;)                participant.append(card)                return card        else:            participant.append(card)            return card    else:        participant.append(card)        if compute_total(participant) > 21:            participant.pop()            return        else:            return carddef compute_total(hand):    """盘算并返回一手牌的点数和"""    values = {&#39;2&#39;: 2, &#39;3&#39;: 3, &#39;4&#39;: 4, &#39;5&#39;: 5, &#39;6&#39;: 6, &#39;7&#39;: 7, &#39;8&#39;: 8,              &#39;9&#39;: 9, &#39;10&#39;: 10, &#39;J&#39;: 0.5, &#39;Q&#39;: 0.5, &#39;K&#39;: 0.5, &#39;A&#39;: 1}    result = 0  # 初始化点数和为0    # 盘算点数和A的个数    for card in hand:        # print(card)        result += values[card[2:]]    return resultdef print_hand(hand):    """将牌打印"""    for card in hand:        print(card, end=&#39;  &#39;)    print()def blackjack():    global money    deck = get_shuffled_deck()    house = []  # 庄家的牌    player = []  # 玩家的牌    # 依次给玩家和庄家各发两张牌    for i in range(2):        deal_card(deck, player, False)        deal_card(deck, house, False)    # 打印一手牌    print(&#39;庄家的牌:&#39;, end=&#39;&#39;)    print_hand(house)    print(&#39;玩家的牌:&#39;, end=&#39;&#39;)    print_hand(player)    bet = 10    print(&#39;下注10元&#39;)    # print(len(house))    # 询问玩家是否继承拿牌,如果是,继承给玩家发牌    answer = input(&#39;是否继承拿牌(y/n,缺省为y):&#39;)    while True:        while answer in (&#39;&#39;, &#39;y&#39;, &#39;Y&#39;):            if len(player) >= 5:                break            card = deal_card(deck, player, True)            print(&#39;玩家拿到的牌为:&#39;, end=&#39;&#39;)            print_hand(player)            flag = input(&#39;是否加注(是/否):&#39;)            if flag == &#39;是&#39;:                bet_num = int(input(&#39;加注多少元:&#39;))                if bet_num + bet > money:                    print(&#39;穷货,你没那么多钱&#39;)                else:                    bet += bet_num                    print(&#39;加注乐成,当前下注金额:&#39;, bet)            # 盘算牌点            if compute_total(player) > 21:                print(&#39;爆掉  玩家输牌!&#39;)                money -= int(bet * random.uniform(1, 2))                return            answer = input(&#39;是否继承拿牌(y/n,缺省为y):&#39;)        # 庄家(盘算机人工智能)按“庄家规则”确定是否拿牌        while compute_total(house) < 17:            if len(house) >= 5:                break            card = deal_card(deck, house, False)            print(&#39;庄家拿到的牌为:&#39;, end=&#39;&#39;)            print_hand(house)        answer = input(&#39;是否进入结算(y/n,缺省为y):&#39;)        if answer in (&#39;&#39;, &#39;y&#39;, &#39;Y&#39;):            break    # 分别盘算庄家和玩家的点数,比较点数巨细,输出输赢效果信息    houseTotal, playerTotal = compute_total(house), compute_total(player)    if houseTotal > playerTotal:        print(&#39;庄家赢牌!&#39;)        money -= int(bet * random.uniform(1, 2))    elif houseTotal < playerTotal:        print(&#39;玩家赢牌!&#39;)        money += int(bet * random.uniform(1, 2))    # 拥有blackjack的庄家赢牌    elif houseTotal == 21 and 2 == len(house) < len(player):        print(&#39;庄家赢牌!&#39;)        money -= int(bet * random.uniform(1, 2))    # 拥有blackjack的玩家赢牌    elif playerTotal == 21 and 2 == len(player) < len(house):        print(&#39;玩家赢牌!&#39;)        money += int(bet * random.uniform(1, 2))    else:        print(&#39;平手!&#39;)if __name__ == &#39;__main__&#39;:    while money > 0:        blackjack()        print(&#39;你的余额为:&#39;, money)        f = input(&#39;是否继承玩耍(是/否):&#39;)        if f == &#39;是&#39;:            continue        else:            break    else:        print(&#39;你停业了&#39;)
复制代码
效果图:

一起学习python,小白指导,讲授分享记得私信我

来源:https://blog.csdn.net/Miku_wx/article/details/111918212
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )