Python21点扑克牌游戏(电脑vs玩家)

在这里插入图片描述
课设遇到这题不要慌 参考参考下面代码 瞬间通畅

import random
import sys

# 牌面列表
card_code = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
# 花色列表
card_symbol = ['♦', '♣', '♥', '♠']


# 游戏初始化
def game_init():
    # 庄家手牌
    bookmaker = []
    # 玩家手牌
    player = []
    # 生成元素1~52的列表 (去掉大小鬼的扑克牌[52张])
    poker = list(range(1, 53))
    # 用random的shuffle函数对列表打乱顺序 (洗牌)
    random.shuffle(poker)
    # 返回 庄家手牌 玩家手牌 乱序52张扑克
    return bookmaker, player, poker


# 打印玩家点数
def print_point(card_group):
    for card in card_group:
        """
        核心代码
        由于牌面的数字是从1到52 所以牌面要先减1再求余才是牌面列表真正的下标
        若玩家抽到牌为15 即牌面为15 - 13 = 2 且按花色顺序为♣ 即2♣
        牌面 15 - 1 = 14 再 14 % 13 = 1 这个就是对应牌面列表的第二位元素 即2
        花色 15 - 1 = 14 再 14 / 13 = 1 对应花色列表第二位元素 即♣
        """
        # 获取牌面和花色下标
        code_index = int((card - 1) % 13)
        symbol_index = int((card - 1) / 13)
        # 打印玩家牌信息
        print(card_code[code_index] + card_symbol[symbol_index], end="t")
    print()


# 获取点数 参数:玩家的手牌
def get_point(card_group):
    # 初始化
    current_player = 0
    # 遍历手牌
    for card in card_group:
        # 得到点数
        current_player += int((card - 1) % 13 + 1)
    # 返回玩家点数
    return current_player


# 玩游戏
def game():
    # 记录回合数
    game_round = 1
    # 记录总比分
    score = [0, 0]
    # 死循环 游戏一直执行
    while True:
        # 打印当前回合数
        print("第"+str(game_round)+"轮比赛开始")
        # 初始化游戏 得到庄家空列表 玩家空列表 扑克52张
        bookmaker, player, poker = game_init()
        # 开始发牌 给庄家和玩家各发两张牌
        for i in range(2):
            bookmaker.append(poker.pop())
            player.append(poker.pop())
        # 打印玩家和庄家当前手上的牌
        print("玩家手中的牌是", end="")
        print_point(player)
        print("庄家手中的牌是", end="")
        print_point(bookmaker)
        # 玩家要牌的标记
        player_isWant = True
        # 如果玩家还要牌 且 牌堆里还有牌
        while player_isWant and len(poker) > 0:
            # 询问玩家是否要牌
            print("是否继续要牌:(Y/N)", end="")
            player_input = str(input())[0]
            # 若玩家输入字符为 'y' 或 'Y'
            if player_input == 'y' or player_input == "Y":
                # 为玩家发牌
                player.append(poker.pop())
                # 打印玩家手上的牌
                print("玩家手中的牌是", end="")
                print_point(player)
            else:
                # 标记玩家不要牌 退出循环
                player_isWant = False
        # 打印庄家手中的牌
        print("庄家手中的牌是", end="")
        print_point(bookmaker)
        # 如果庄家点数小于17 持续为庄家发牌
        while get_point(bookmaker) < 17:
            # 为庄家发牌
            get_card = poker.pop()
            # 获取牌面和花色下标
            code_index = int((get_card - 1) % 13)
            symbol_index = int((get_card - 1) / 13)
            # 打印庄家获得的牌
            print("庄家得到一张"+card_code[code_index] + card_symbol[symbol_index], end="t")
            bookmaker.append(get_card)
            # 打印庄家手中的牌
            print("庄家手中的牌是", end="")
            print_point(bookmaker)
        # 玩家点数
        play_point = get_point(player)
        # 庄家点数
        bookmaker_point = get_point(bookmaker)
        # 打印玩家点数和庄家点数
        print("玩家点数为"+str(play_point)+","+"庄家点数为"+str(bookmaker_point)+",", end="")
        """
        判断胜负
        玩家胜的3种情况
        1. 庄家点数大于21且玩家点数小于等于21
        2. 玩家和庄家点数小于等于21 且玩家点数大于庄家点数
        3. 玩家和庄家点数大于21 且玩家点数小于庄家点数
        庄家胜的3种情况
        1. 玩家点数大于21且庄家点数小于等于21
        2. 玩家和庄家点数小于等于21 且庄家点数大于玩家点数
        3. 玩家和庄家点数大于21 且庄家点数小于玩家点数
        剩余情况 平局 玩家和庄家点数相同
        """
        if (bookmaker_point > 21 and play_point <= 21) or 
           (21 >= bookmaker_point and 21 >= play_point > bookmaker_point) or 
           (21 < bookmaker_point and 21 < play_point < bookmaker_point):
            # 玩家总分+1 打印结果
            score[0] += 1
            print("玩家赢了!")
        elif (play_point > 21 and bookmaker_point <= 21) or 
             (21 >= play_point and 21 >= bookmaker_point > play_point) or 
             (21 < play_point and 21 < bookmaker_point < play_point):
            # 庄家总分+1 打印结果
            score[1] += 1
            print("庄家赢了!")
        else:
            # 平局不加分 打印结果
            print("平局!")
        # 分隔
        print("-"*30)
        # 询问是否进行下一轮游戏
        print("是否进行下一轮:(Y/N)", end="")
        is_play_point = str(input())[0]
        # 如果输入为 'N' 或 'n' 打印结果 停止程序
        if is_play_point == "N" or is_play_point == "n":
            # 打印总比分
            print("玩家和庄家总比分为"+str(score[0])+":"+str(score[1]))
            # 三目运算符嵌套 平局(true) 如果比分相同 (false)[玩家胜(true) 如果玩家比分大于庄家比分 庄家胜(false)]
            print("平局") if score[0] == score[1] else (print("玩家胜出!") if score[0] > score[1] else print("庄家胜出!"))
            print("游戏结束")
            # 停止程序
            sys.exit()
        # 回合数+1
        game_round += 1


# 程序主入口
if __name__ == '__main__':
    # 玩游戏
    game()

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇
下一篇>>