目录

平日无聊-就用Python写一个简单的棋牌游戏11点吧-简单易上手

平日无聊 就用Python写一个简单的【棋牌游戏11点】吧 简单易上手

老铁们,近日为了巩固python的学习,我也开始随心写一些python实现小功能的博客,那么今天我们要写的,就是这个扑克牌十一点,我们开始吧!

扑克牌11点

一、游戏规则介绍

一副扑克牌有54张牌,其中52张是正牌,另2张是副牌(大王和小王)。 52张正牌又均分为13张一组,并以黑桃、红桃、梅花、方块四种花色表示各组,每组花色的牌包括从1-10(1通常表示为A)以及J、Q、K标示的13张牌 再加上大小王2张。共54张牌。这一段我们需要关注,因为涉及到下面扑克牌的赋值问题。

其中十一点就是其中的一种玩法: 从拿到第一张牌说起,当你再取一张数字相加小于十一点可以选择继续要牌或选择不要,若是点数超过十一点就是爆点,最后就是没有爆点的比大小,最接近十一点的为赢家。

需求:

o 生成一副扑克牌(自己设计扑克牌的结构,小王和大王可以分别用14、15表示 )

o 3个玩家

例如: user_list = [“alex”,“武沛齐”,“李路飞”]

o发牌规则

 默认先给用户发一张牌, 其中 J、Q、K、小王、大王代表的值为0.5,其他就是则就是当前的牌面值。 (也就是说 A就是1分,2就是2分,那这样我们就好给扑克牌赋值了)

 用户根据自己的情况判断是否继续要牌。

 要,则再给他发一张。

 不要,则开始给下个玩家发牌。

 如果用户手中的所有牌相加大于11,则表示爆了,此人的分数为0,并且自动开始给下个人发牌。

o 最终计算并获得每个玩家的分值,例如:

result = {

“alex”:8,

“武沛齐”:9,

“李路飞”:0

}

那么我们默认游戏结束是54张牌发完,并且第一次发牌会随机,也就是说,玩家真正第一次去抽牌,应该是剩51张牌。

二、扑克牌赋值的实现

我们在实现游戏功能中,最重要的就是扑克牌的赋值问题,也就是说,一个玩家抽到牌了,该怎么加分,加多少分?(注意大王、小王的特殊性,即它们没有花色)

今天看这篇文章的应该都是有一定的python基础的,那么应该都知道,想一个容器存储多个数据( 扑克牌我们要存花色、数值和点数 ),那么我们可以使用列表,也可以使用字典,这里我们考虑使用列表存储54张牌,每张牌使用元组存储数据(也就是把三个数据合并到一起)。使用元组的好处就在于不必要每次列表取出value后再取value。

那么关于计分呢?我们使用字典,因为字典刚好是一一对应的关系:

import random # 这里的random是为了之后抽牌使用
user_list = ["alex","武沛齐","李路飞"]
poke_color = ["红桃", "黑桃", "方块", "梅花"]
total_poke_list = []
for color in poke_color:
    for num in range(1, 14):
        if num < 11:
            score = num #上文中已经提到,除了几个特定的牌,其余的都是牌面值就是分值
        else:
            score = 0.5
        data = (color, num, score)
        total_poke_list.append(data)
special_poke = [('小王', 14, 0.5), ('大王', 15, 0.5)]
total_poke_list.extend(special_poke)
result = {'alex':0,'武沛齐':0,'李路飞':0}

三、玩家抽牌

那么到这里,我们已经实现了扑克牌的赋值,可以说离成功又近一步。之后我们就需要考虑发牌的问题,由于第一次发牌是三个玩家没人一张,并且随后按顺序取牌,所以我们直接每个人先抽一张再说:

while True:
    for i in result:
        index = random.randint(0, len(total_poke_list) - 1)
        print(f"{i}抽到的牌为:", total_poke_list[index])  # 获取牌
        if total_poke_list[index][2] <= 10:
            result[i] += float(total_poke_list[index][2])
        else:
            result[i] += 0.5
        total_poke_list.pop(index)    # 踢除这张牌
    print("抽完之后,剩下的牌为:", total_poke_list)
    print(result)

这段代码就是实现三个人开头每人一张牌。中间的代码,我相信各位稍加思索就能理解。

那么,我们就会想着,我每次都想看到分值情况,这样才好判断要不要继续取牌,所以我们每次都 print(result)

同时注意,玩家抽牌得到值之后,我们需要判断总值是否大于11,如果大于,就需要把值清零,下面的代码会实现这个功能。

现在我们就差最后一步了,也就是每个人抽牌,由于“alex”是第一个,所以肯定直接抽,我们直接程序帮他实现了一次,后续的几次均需要我们手动操作(你可以喊上自己的好朋友一起玩呀!)

注意,下面这段代码也在上面的while循环中。

    for i in result:
        flag = 1
        while flag == 1:
            print(f"请{i}抽牌:")
            index = random.randint(0, len(total_poke_list) - 1)
            print(f"{i}抽到的牌为:", total_poke_list[index])  # 获取牌
            if total_poke_list[index][2] <= 10:
                result[i] += float(total_poke_list[index][2])
                if result[i] >= 11:
                    result[i] = 0
            else:
                result[i] += 0.5
            total_poke_list.pop(index)
            print(f'现在的结果是{result}')
            print(f'还剩{len(total_poke_list)}张牌')
            flag =  int(input("1.继续发牌 0.停止发牌:\n"))
        print(result)
print(result)

我们每次都想决定发不发牌,所以还 需要一个flag随时监测取牌与否发消息 ,这样我们的扑克牌十一点就实现了。

现在把整体的代码写在下面:

import random
user_list = ["alex","武沛齐","李路飞"]
poke_color = ["红桃", "黑桃", "方块", "梅花"]
total_poke_list = []
for color in poke_color:
    for num in range(1, 14):
        if num < 11:
            score = num
        else:
            score = 0.5
        data = (color, num, score)
        total_poke_list.append(data)
special_poke = [('小王', 14, 0.5), ('大王', 15, 0.5)]
total_poke_list.extend(special_poke)
result = {'alex':0,'武沛齐':0,'李路飞':0}

while True:
for i in result:
index = random.randint(0, len(total_poke_list) - 1)
print(f"{i}抽到的牌为:", total_poke_list[index]) # 获取牌
if total_poke_list[index][2] <= 10:
result[i] += float(total_poke_list[index][2])
else:
result[i] += 0.5
total_poke_list.pop(index) # 踢除这张牌
print("抽完之后,剩下的牌为:", total_poke_list)
print(result)

    for i in result:
        flag = 1
        while flag == 1:
            print(f"请{i}抽牌:")
            index = random.randint(0, len(total_poke_list) - 1)
            print(f"{i}抽到的牌为:", total_poke_list[index])  # 获取牌
            if total_poke_list[index][2] <= 10:
                result[i] += float(total_poke_list[index][2])
                if result[i] >= 11:
                    result[i] = 0
            else:
                result[i] += 0.5
            total_poke_list.pop(index)
            print(f'现在的结果是{result}')
            print(f'还剩{len(total_poke_list)}张牌')
            flag =  int(input("1.继续发牌 0.停止发牌:\n"))
        print(result)

print(result)

伙伴们还不快来试一试吗?有趣好玩的扑克牌十一点,嘿嘿,不过有一说一,这样的扑克牌十一点,由于不可视,所以少了点感觉,有兴趣的小伙伴可以试试 PyQt 能不能实现扑克牌十一点哦!