字小白 发表于 2023-4-6 19:22:06

python最新版44讲课后代码第一题求问

import random

cards = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K",
         "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K",
         "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K",
         "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K",
         "", ""]


def fy_shuffle(x, n=1):
    for i in range(n):
      target = list(x)
      result = []
      while target:
            r = random.randint(0, len(target) - 1)# 步骤2
            result.append(target.pop(r))# 步骤3 为什么这里的target在下方使用的时候不会被上面for循环里的 target = list(x)给重置?
    return result


def dealCards():
    a = input("请输入第一位游戏玩家名称:")
    b = input("请输入第二位游戏玩家名称:")
    c = input("请输入第三位游戏玩家名称:")

    r = {}
    r, r, r = [], [], []

    new_cards = fy_shuffle(cards, 3)# 这一步不应该是循环三次么,为什么可以分出三个序列?

    for i in range(17):
      r.append(new_cards.pop())
      r.append(new_cards.pop())
      r.append(new_cards.pop())

    d = random.sample((a, b, c), 1)#为什么要把这个东西转换成矩阵?
    print(f"\n地主是:{d}\n")
    r.extend((new_cards.pop(), new_cards.pop(), new_cards.pop()))#这一步有什么用呢?

    print(f"[{a}]拿到的牌是:{' '.join(r)}\n")
    print(f"[{b}]拿到的牌是:{' '.join(r)}\n")
    print(f"[{c}]拿到的牌是:{' '.join(r)}")
#求大神教,指个路也行

isdkz 发表于 2023-4-6 19:22:07

首先,我会指出代码中的错误并解释原因,然后提供一个修改后的版本。


[*]在定义字典r时,你应该使用r, r, r = [], [], [],而不是r, r, r = [], [], []。这会导致r变成一个空列表,而不是包含玩家手牌的字典。

[*]关于fy_shuffle函数,你的理解是正确的。n参数表示你想要洗牌的次数。但是,你在代码中没有正确实现洗牌功能。result列表应在循环外部初始化,而不是在循环内。此外,在循环结束后,你需要将result赋值给x。

[*]random.sample返回一个列表,因为它可以从给定的序列中生成多个不重复的样本。在此代码中,只需要一个样本,因此将结果转换为列表并获取第一个元素,以获得所需的字符串。

[*]最后一行代码,r.extend((new_cards.pop(), new_cards.pop(), new_cards.pop()))的作用是将地主的底牌分给地主,因此地主将获得20张牌。


这是修改后的代码:

import random

cards = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K",
         "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K",
         "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K",
         "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K",
         "", ""]

def fy_shuffle(x, n=1):
    for i in range(n):
      target = list(x)
      result = []
      while target:
            r = random.randint(0, len(target) - 1)
            result.append(target.pop(r))
      x = result
    return x

def dealCards():
    a = input("请输入第一位游戏玩家名称:")
    b = input("请输入第二位游戏玩家名称:")
    c = input("请输入第三位游戏玩家名称:")

    r = {}
    r, r, r = [], [], []

    new_cards = fy_shuffle(cards, 3)

    for i in range(17):
      r.append(new_cards.pop())
      r.append(new_cards.pop())
      r.append(new_cards.pop())

    d = random.sample((a, b, c), 1)
    print(f"\n地主是:{d}\n")
    r.extend((new_cards.pop(), new_cards.pop(), new_cards.pop()))

    print(f"[{a}]拿到的牌是:{' '.join(r)}\n")
    print(f"[{b}]拿到的牌是:{' '.join(r)}\n")
    print(f"[{c}]拿到的牌是:{' '.join(r)}")

dealCards()



这个修改后的代码应该能够正确运行并实现你的需求。以下是代码的简要说明:

1. `fy_shuffle`函数用于洗牌,将牌随机排序。
2. `dealCards`函数首先让用户输入三位玩家的名称,然后分发洗好的牌。
3. 每位玩家获得17张牌,剩下的3张牌作为底牌留给地主。
4. 随机选择一位玩家作为地主,将底牌分给地主。
5. 打印出每位玩家的牌以及谁是地主。

请注意,此代码仅为简单示例,并未实现斗地主游戏的全部规则和逻辑。

字小白 发表于 2023-4-6 19:28:08

第一次发帖,格式错了,还请大家见谅{:10_245:}
页: [1]
查看完整版本: python最新版44讲课后代码第一题求问