鱼C论坛

 找回密码
 立即注册
查看: 1306|回复: 2

[已解决]python最新版44讲课后代码第一题求问

[复制链接]
发表于 2023-4-6 19:22:06 | 显示全部楼层 |阅读模式
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])}")
#求大神教,指个路也行
最佳答案
2023-4-6 19:22:07
[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 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-6 19:22:07 | 显示全部楼层    本楼为最佳答案   
[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. 打印出每位玩家的牌以及谁是地主。

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

评分

参与人数 1荣誉 +1 收起 理由
字小白 + 1 恍然大悟!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-6 19:28:08 | 显示全部楼层
第一次发帖,格式错了,还请大家见谅
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 21:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表