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

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

平日无聊 就用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能不能实现扑克牌十一点哦!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5710795.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存