python 实现记牌器原理

文章介绍了两种Python实现记牌器的方法:减牌法和增牌法。减牌法通过从总牌堆中移除已发的牌来跟踪剩余牌,而增牌法则通过增加已发牌的计数来管理牌堆。在增牌法中,使用字典来存储每种牌的数量,并通过字典更新来追踪发牌情况。文章还提到了字典更新的常见错误,强调了更新序列元素必须包含键值对的规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方案一(减牌记牌)

假设与这“333445667788QQJ”十五张牌,每人五张牌

a = "333445667788QQJ"

for i in range(len(a)):
    # 玩家一
    one = input("one:")
    for c in one:
        if c in a:
            a = a.replace(c, '', 1)
            print(a)
	# 玩家二
    two = input("two:")
    for c in two:
        if c in a:
            a = a.replace(c, '', 1)
            print(a)
    # 玩家三        
    three = input("three:")
    for c in three:
        if c in a:
            a = a.replace(c, '', 1)
            print(a)

终端输出:

>one:3    结果输出:33445667788QQJ
>two:3  结果输出:3445667788QQJ
>three:3  结果输出:445667788QQJ
>`one:4  结果输出:45667788QQJ
>two:4  结果输出:5667788QQJ
>three:5  结果输出:667788QQJ
>......

牌数量每发一张牌减掉一张牌

方案二(增牌记牌)

注释:T表示10,X表示小王,D表示大王

该实现假设使用扑克牌的点数(2~9,T,J,Q,K,A,X,D)来计数,且只考虑一副标准52张的扑克牌。

首先,需要定义一个初始的空牌堆(即52张牌每张牌的初始数量为0),可以使用字典来表示:

cards = cards = {'2': 0, '3': 0, '4': 0, '5': 0, '6': 0, '7': 0, '8': 0, '9': 0, 'T': 0, 'J': 0, 'Q': 0, 'K': 0, 'A': 0, 'X': 0,'D': 0}

然后,在每次发牌时,对应点数的牌的数量加1即可:

cards[card_number] += 1

例如,当发出3、5、6、8四张牌时,计数器应为:

cards =  {'2': 0, '3': 1, '4': 0, '5': 1, '6': 1, '7': 0, '8': 1, '9': 0, 'T': 0, 'J': 0, 'Q': 0, 'K': 0, 'A': 0, 'X': 0,'D': 0}

需要注意的是,如果使用多副扑克牌,需要把初始牌堆的数量扩大到多倍。

完整的记牌器代码如下:


import re

# 左边键是卡牌,右边是卡牌数量
cards =  {'2': 0, '3': 0, '4': 0, '5': 0, '6': 0, '7': 0, '8': 0, '9': 0, 'T': 0, 'J': 0, 'Q': 0, 'K': 0, 'A': 0, 'X': 0,'D': 0}
# 没发牌前
print(cards)

# 发四张牌
n = 0
while True:
    data = {}
    def record_card(card_number):
        cards[card_number] += 1

    def print_cards():
        for card_number, count in cards.items():
            # print(f'{card_number}: {count}')
            data.update([(card_number, count)])
        print(data)

    name = str(input('输入2~9,T,J,Q,K,A,X,D:'))
    if re.match('[23456789TJQKAXD]', name):
        record_card(int(name))
        # 启动函数
        print_cards()
        n += 1
        if n == 4:
            break
    else:
        print("你的输入有误,输入范围:2~9,T,J,Q,K,A,X,D")
        continue
字典Update更新初学者常见报错问题
data.update(f'{card_number}: {count}')
# ValueError:字典更新序列元素#0的长度为1;需要2个---因为一个字符串是无法使用更新字典,需要弄成字典或元组列表更新字典,如下:
data.update([(f'{card_number}', f'{count}')])

当您尝试使用序列(如列表或元组)更新字典时,会出现此错误消息,其中一个元素的长度为1,而不是预期的2。

例如,考虑以下代码:

my_dict = {'name': 'John', 'age': 30}
my_dict.update([('height', 180), ('weight',)]) # 权重只有一个值,而不是两个

在这种情况下,update()方法需要一个元组序列,其中每个元组有两个值:一个键及其对应的值。但是,第二个元组(‘weight’,)只有一个值,从而导致ValueError

要修复此错误,需要确保序列中的每个元组都有两个值。在上面的示例中,您可以删除缺少值的元组以避免错误:

my_dict.update([('height', 180), ('weight', 80)])

现在,update()方法将把“height”和“weight”键及其相应的值添加到字典中,而不会引发任何错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值