|  | 
 
5鱼币 
| 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[a], r[b], r[c] = [], [], []
 
 new_cards = fy_shuffle(cards, 3)# 这一步不应该是循环三次么,为什么可以分出三个序列?
 
 for i in range(17):
 r[a].append(new_cards.pop())
 r[b].append(new_cards.pop())
 r[c].append(new_cards.pop())
 
 d = random.sample((a, b, c), 1)[0]#为什么要把这个东西转换成矩阵?
 print(f"\n地主是:{d}\n")
 r[d].extend((new_cards.pop(), new_cards.pop(), new_cards.pop()))#这一步有什么用呢?
 
 print(f"[{a}]拿到的牌是:{' '.join(r[a])}\n")
 print(f"[{b}]拿到的牌是:{' '.join(r[b])}\n")
 print(f"[{c}]拿到的牌是:{' '.join(r[c])}")
 #求大神教,指个路也行
 
 
[b]首先,我会指出代码中的错误并解释原因,然后提供一个修改后的版本。 在定义字典r时,你应该使用r[a], r, r[c] = [], [], [],而不是r[a], r, r[c] = [], [], []。这会导致r变成一个空列表,而不是包含玩家手牌的字典。
 关于fy_shuffle函数,你的理解是正确的。n参数表示你想要洗牌的次数。但是,你在代码中没有正确实现洗牌功能。result列表应在循环外部初始化,而不是在循环内。此外,在循环结束后,你需要将result赋值给x。
random.sample返回一个列表,因为它可以从给定的序列中生成多个不重复的样本。在此代码中,只需要一个样本,因此将结果转换为列表并获取第一个元素,以获得所需的字符串。
最后一行代码,r[d].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[a], r[b], r[c] = [], [], []
    new_cards = fy_shuffle(cards, 3)
    for i in range(17):
        r[a].append(new_cards.pop())
        r[b].append(new_cards.pop())
        r[c].append(new_cards.pop())
    d = random.sample((a, b, c), 1)[0]
    print(f"\n地主是:{d}\n")
    r[d].extend((new_cards.pop(), new_cards.pop(), new_cards.pop()))
    print(f"[{a}]拿到的牌是:{' '.join(r[a])}\n")
    print(f"[{b}]拿到的牌是:{' '.join(r[b])}\n")
    print(f"[{c}]拿到的牌是:{' '.join(r[c])}")
dealCards()
这个修改后的代码应该能够正确运行并实现你的需求。以下是代码的简要说明:
 
1. `fy_shuffle`函数用于洗牌,将牌随机排序。 
2. `dealCards`函数首先让用户输入三位玩家的名称,然后分发洗好的牌。 
3. 每位玩家获得17张牌,剩下的3张牌作为底牌留给地主。 
4. 随机选择一位玩家作为地主,将底牌分给地主。 
5. 打印出每位玩家的牌以及谁是地主。
 
请注意,此代码仅为简单示例,并未实现斗地主游戏的全部规则和逻辑。
 | 
 
最佳答案
查看完整内容 首先,我会指出代码中的错误并解释原因,然后提供一个修改后的版本。
[*]在定义字典r时,你应该使用r[a], r, r[c] = [], [], [],而不是r[a], r, r[c] = [], [], []。这会导致r变成一个空列表,而不是包含玩家手牌的字典。
[*]关于fy_shuffle函数,你的理解是正确的。n参数表示你想要洗牌的次数。但是,你在代码中没有正确实现洗牌功能。result列表应在循环外部初始化,而不是在循环内。此外,在循环结束后,你需要将resul ... |