21点扑克牌游戏代码如下

import random  # 导入随即模块

def shuffle(l):  # 定义洗牌函数,将一副牌打乱
    for i in range(len(l)):  # 遍历整幅牌
        j = random.randint(0, len(l) - 1)  # 生成随机数
        l[i], l[j] = l[j], l[i]  # 交换当前牌和随机牌的位置

def deal(l):  # 定义发牌函数
    W = l[0:2]  # 发玩家的前两张牌
    Z = l[2:4]  # 发庄家的前两张牌
    i = 4  # 当前牌堆索引
    print("当前玩家手牌:", W, "点数和为:", point(W))  # 输出当前玩家手牌和其点数和
    print("当前庄家明牌:", Z[1])  # 输出当前庄家明牌
    out = input("请选择是否继续拿牌(Y:拿牌,N:停牌):")  # 获取玩家是否需要继续拿牌的输入
    while out.lower() == "y" or out.lower() == "yes":  # 当玩家输入Y或yes时进行循环
        W.append(l[i])  # 玩家继续抽一张牌
        i += 1  # 增加牌堆索引
        print("当前玩家手牌:", W, "点数和为:", point(W))  # 输出当前玩家手牌和其点数
        out = input("请选择是否继续拿牌(Y:拿牌,N:停牌):")  # 获取玩家是否需要继续拿牌的输入
    while point(Z) < 17:  # 当庄家手牌点数小于17时抽牌
        Z.append(l[i])  # 庄家继续抽牌
        i += 1  # 增加牌堆索引
    return [W, Z]  # 返回发牌结果

def point(l):  # 定义计算点数的函数
    total_sum = 0  # 初始化总点数为0
    num_ace = 0  # 记录牌堆中Ace的数量
    for card in l:  # 遍历整幅牌
        if card == 1:  # 如果当前牌为Ace,则num_ace加1
            num_ace += 1
        else:  # 如果当前牌为2-10,则加上相应点数
            total_sum += card
    max_sum = 0  # 初始化最大点数为0
    for x in range(num_ace + 1):  # 枚举Ace的个数
        sum_Ace = x + (num_ace - x) * 11  # 计算当前Ace的点数和
        if (sum_Ace + total_sum) <= 21 and sum_Ace > max_sum:  # 如果当前点数和在21点以下且大于当前最大点数,则更新最大点数
            max_sum = sum_Ace
    total_sum += max_sum
    return total_sum  # 返回总点数

# 主函数调用
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] * 4  # 定义 一副新牌
shuffle(l)  # 洗牌(使用shuffle函数将牌堆打乱)
[W, Z] = deal(l)  # 发牌
print("最终玩家手牌:", W)  # 输出最终玩家手牌、点数和
print("最终玩家手牌点数和为:", point(W))
print("最终庄家手牌:", Z)  # 输出最终庄家手牌、点数和
print("最终庄家手牌点数和为:", point(Z))
if point(W) > 21:  # 判断玩家的输赢情况,并输出相应结果
    print("Boom! You died!(玩家点数大于二十一点,手牌报废,庄家赢了)")  # 玩家点数大于21点,你输了
elif point(Z) > 21 or point(Z) < point(W):  # 庄家点数大于21或小于玩家点数
    print("You win!(玩家赢了)")  # 玩家赢了
elif point(Z) == point(W):  # 庄家点数等于玩家点数
    print("It's a draw!(这局是平局!)")  # 这是平局
else:
    print("You lost!(玩家输了!)")  # 玩家输了

代码运行结果如下:

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐