|
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 ...
|