Python 如何压缩我的简单纸牌游戏的详细代码?

Python 如何压缩我的简单纸牌游戏的详细代码?,python,Python,代码按照我希望的方式工作,但我觉得下面的random.shuffle(deck)都是糟糕/冗长的代码。我正在寻找任何关于如何减少代码并实现相同输出的建议。例如,我不是在写Ace=0,King=0,…,Two=0(游戏开始时玩的那种类型的牌的数量),而是在寻找类似Ace,King,…,Two=0(即为所有牌写=0一次,而不是写=0十三次)的东西 主要内容之一:每次看到代码中的基本结构重复时,都要考虑使用支持迭代的循环和数据结构。 在您的情况下,主要问题是卡片面-而不是使用13个变量来处理金额,您最

代码按照我希望的方式工作,但我觉得下面的
random.shuffle(deck)
都是糟糕/冗长的代码。我正在寻找任何关于如何减少代码并实现相同输出的建议。例如,我不是在写
Ace=0
King=0
,…,
Two=0
(游戏开始时玩的那种类型的牌的数量),而是在寻找类似
Ace,King,…,Two=0
(即为所有牌写
=0
一次,而不是写
=0
十三次)的东西

主要内容之一:每次看到代码中的基本结构重复时,都要考虑使用支持迭代的循环和数据结构。 在您的情况下,主要问题是卡片面-而不是使用13个变量来处理金额,您最好将所有内容都保存在一个字典中-这将使您能够“以编程方式”处理它:

如果需要进一步优化,可以使用

faces = ['Ace', 'King', 'Queen', 'Jack', 'Ten', 'Nine', 'Eight', 'Seven', 'Six', 'Five', 'Four', 'Three', 'Two']
hand = dict.fromkeys(faces, 0)
这里的要点是使用相同的值来识别“手牌”和“牌组”中的牌

  • 一旦你有了这个,你就可以清楚地知道你并不真正需要
    total
    计数器,因为你可以用
    sum(hand.values())
    动态访问
    hand
    dict中的所有值(实际上,你最好在“绘图”时从卡片组中取出卡片,只需使用
    len(卡片组)

  • 主要内容之一:每次看到代码中的基本结构重复时,都要考虑使用支持迭代的循环和数据结构。 在您的情况下,主要问题是卡片面-而不是使用13个变量来处理金额,您最好将所有内容都保存在一个字典中-这将使您能够“以编程方式”处理它:

    如果需要进一步优化,可以使用

    faces = ['Ace', 'King', 'Queen', 'Jack', 'Ten', 'Nine', 'Eight', 'Seven', 'Six', 'Five', 'Four', 'Three', 'Two']
    hand = dict.fromkeys(faces, 0)
    
    这里的要点是使用相同的值来识别“手牌”和“牌组”中的牌

  • 一旦你有了这个,你就可以清楚地知道你并不真正需要
    total
    计数器,因为你可以用
    sum(hand.values())
    动态访问
    hand
    dict中的所有值(实际上,你最好在“绘图”时从卡片组中取出卡片,只需使用
    len(卡片组)


  • 我投票结束这个问题,因为它属于
    Ace=King=…=0
    ?但是你最好用字典(或
    defaultdict(int)
    )来跟踪这些卡片,而不要用这么多命名变量。@DeepSpace请不要用“它属于代码审查”的自定义理由投票结束。堆栈溢出规则中没有任何东西可以证明这样的自定义原因,而草率的推理会使不适当的引用永久化。取而代之的是,投票以过于广泛或主要基于意见的方式结束。另请参见。@Zeta让我们同意在这一点上存在分歧。只需使用
    dict
    将卡片名称映射到计数,然后去掉十几个变量,即
    if/elif
    级联,您可以将
    join
    print
    的生成器表达式一起使用。我投票决定将此问题作为离题题题结束,因为它属于
    Ace=King=…=0
    ?但是你最好用字典(或
    defaultdict(int)
    )来跟踪这些卡片,而不要用这么多命名变量。@DeepSpace请不要用“它属于代码审查”的自定义理由投票结束。堆栈溢出规则中没有任何东西可以证明这样的自定义原因,而草率的推理会使不适当的引用永久化。取而代之的是,投票以过于广泛或主要基于意见的方式结束。另请参见。@Zeta让我们同意在这一点上存在分歧。只需使用
    dict
    将卡片名称映射到计数,然后您就可以去掉十几个变量,即
    if/elif
    级联,您可以使用
    join
    print
    的生成器表达式。您能详细说明一下吗?据我所知,代码不会从预定义的iterable增加值,而是由用户输入定义。计数器在这里有什么帮助?我的错,我忽略了代码。@Slam,
    hand=dict.fromkeys(cardfaces,0)
    也很好,代码比你的建议少:
    faces=['Ace'、'King'、'Queen'、'Jack'、'Ten'、'Nine'、'Seven'、'Seven'、'Five'、'Four'、'Two']hand=dict.fromkeys(faces,0)
    您能详细说明一下吗?据我所知,代码不会从预定义的iterable增加值,而是由用户输入定义。计数器在这里有什么帮助?我的错,我忽略了代码。@Slam,
    hand=dict.fromkeys(cardfaces,0)
    也很好,代码也比你的建议少:
    faces=['Ace',King',Queen',Jack','Ten',Nine',Eight',Seven',Five',Four',third',Two']hand=dict.fromkeys(faces,0)
    faces = ['Ace', 'King', 'Queen', 'Jack', 'Ten', 'Nine', 'Eight', 'Seven', 'Six', 'Five', 'Four', 'Three', 'Two']
    hand = dict.fromkeys(faces, 0)