鱼C论坛

 找回密码
 立即注册
查看: 339|回复: 9

大家帮忙看看代码有什么问题

[复制链接]
发表于 2024-8-14 09:29:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
课后作业第44讲第1题斗地主洗牌,代码如下
  1. import random
  2. cards = ["♦1", "♦2", "♦3", "♦4", "♦5", "♦6", "♦7", "♦8", "♦9", "♦10", "♦J", "♦Q", "♦K",
  3.          "♥1", "♥2", "♥3", "♥4", "♥5", "♥6", "♥7", "♥8", "♥9", "♥10", "♥J", "♥Q", "♥K",
  4.          "♣1", "♣2", "♣3", "♣4", "♣5", "♣6", "♣7", "♣8", "♣9", "♣10", "♣J", "♣Q", "♣K",
  5.          "♠1", "♠2", "♠3", "♠4", "♠5", "♠6", "♠7", "♠8", "♠9", "♠10", "♠J", "♠Q", "♠K",
  6.          "☀", "🌙"]

  7. def fy_shuffle(cards,times):
  8.    
  9.     for i in range(times):
  10.         new = []
  11.         n = len(cards)
  12.         while len(new) < 17 and n > 0:
  13.             k = random.randint(0,n)
  14.             new.append(cards[k])
  15.             cards.pop(k)
  16.             n -= 1
  17.             #print(cards)
  18.         print(new)


  19. new_cards = fy_shuffle(cards, 3)
  20. print(cards)

  21. def dealcards():
  22.     player = []
  23.     a = input("请输入第一位游戏玩家名称:")
  24.     b = input("请输入第二位游戏玩家名称:")
  25.     c = input("请输入第三位游戏玩家名称:")
  26.     player.append(a)
  27.     player.append(b)
  28.     player.append(c)
  29.     k = random.randint(0,3)
  30.     landlord = player[k]
  31.     print("地主是:{landlord}")


  32.     for name in player:
  33.         
  34.         if name != landlord:
  35.             get = " ".join(new)
  36.             print(f"[{name}拿到的牌是:{get}]")
  37.         else:
  38.             get = " ".join(new)
  39.             add = " ".join(cards)
  40.             landlord = get + add
  41.             print(f"[{name}拿到的牌是:{landlord}]")
  42. dealcards()

复制代码

报错信息如下:
  1. Traceback (most recent call last):
  2.   File "D:/编程/【课后作业】第044讲:函数(IV)洗牌算法.py", line 26, in <module>
  3.     new_cards = fy_shuffle(cards, 3)
  4.   File "D:/编程/【课后作业】第044讲:函数(IV)洗牌算法.py", line 19, in fy_shuffle
  5.     new.append(cards[k])
  6. IndexError: list index out of range
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-14 10:36:01 | 显示全部楼层
应该使用 random.randrange(0, n) 而不是 random.randint(0, n)。random.randrange(a, b) 会生成一个从 a 到 b-1 的随机整数,这样就不会超出列表的索引范围。 fy_shuffle 函数并没有返回任何值(即没有 return 语句),将其结果赋值给 new_cards。由于 fy_shuffle 函数打印了每次抽取的 17 张牌,但没有返回这些牌,所以 new_cards 实际上是 None。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-14 13:51:25 | 显示全部楼层
很cool的阳 发表于 2024-8-14 10:36
应该使用 random.randrange(0, n) 而不是 random.randint(0, n)。random.randrange(a, b) 会生成一个从 a  ...

不是这个问题,
  1. def fy_shuffle(cards,times):
  2.     new_cards = []
  3.     for i in range(times):
  4.         new = []
  5.         n = len(cards)
  6.         while len(new) < 17 and n > 0:
  7.             k = random.randrange(0,n)
  8.             new.append(cards[k])
  9.             cards.pop(k)
  10.         print(new)
  11.     new_cards.append(new)   
  12.     return new_cards
复制代码
代码改过了,还是报错
  1. Traceback (most recent call last):
  2.   File "D:/编程/【课后作业】第044讲:函数(IV)洗牌算法.py", line 26, in <module>
  3.     new_cards = fy_shuffle(cards, 3)
  4.   File "D:/编程/【课后作业】第044讲:函数(IV)洗牌算法.py", line 19, in fy_shuffle
  5.     new.append(cards[k])
  6. IndexError: list index out of range
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-14 14:54:31 | 显示全部楼层
while len(new) < 17 and n > 0:
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;k = random.randint(0,n)

这里要改成n-1
这是第一个。另外第二次开始洗牌,要拿到第一次洗牌的数据吗,还是假洗

再就是习惯不太好,正常是import第三方程序写头上,def的封装函数排前面,把执行的主程序集中放后面
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-14 14:58:14 | 显示全部楼层
  1. import random
  2. def fy_shuffle(cards_get,times):
  3.     new = []
  4.     for i in range(times):        
  5.         n = len(cards_get)
  6.         while n > 0:
  7.             k = random.randint(0,n-1)
  8.             new.append(cards_get[k])
  9.             cards_get.pop(k)
  10.             n -= 1
  11.             #print(cards)
  12.         cards_get = new
  13.         #print(new)

  14. def dealcards():
  15.     player = []
  16.     a = input("请输入第一位游戏玩家名称:")
  17.     b = input("请输入第二位游戏玩家名称:")
  18.     c = input("请输入第三位游戏玩家名称:")
  19.     player.append(a)
  20.     player.append(b)
  21.     player.append(c)
  22.     k = random.randint(0,3)
  23.     landlord = player[k]
  24.     print("地主是:{landlord}")
  25.     for name in player:
  26.         if name != landlord:
  27.             get = " ".join(new)
  28.             print(f"[{name}拿到的牌是:{get}]")
  29.         else:
  30.             get = " ".join(new)
  31.             add = " ".join(cards)
  32.             landlord = get + add
  33.             print(f"[{name}拿到的牌是:{landlord}]")

  34. cards = ["&#9830;1", "&#9830;2", "&#9830;3", "&#9830;4", "&#9830;5", "&#9830;6", "&#9830;7", "&#9830;8", "&#9830;9", "&#9830;10", "&#9830;J", "&#9830;Q", "&#9830;K",
  35.          "&#9829;1", "&#9829;2", "&#9829;3", "&#9829;4", "&#9829;5", "&#9829;6", "&#9829;7", "&#9829;8", "&#9829;9", "&#9829;10", "&#9829;J", "&#9829;Q", "&#9829;K",
  36.          "&#9827;1", "&#9827;2", "&#9827;3", "&#9827;4", "&#9827;5", "&#9827;6", "&#9827;7", "&#9827;8", "&#9827;9", "&#9827;10", "&#9827;J", "&#9827;Q", "&#9827;K",
  37.          "&#9824;1", "&#9824;2", "&#9824;3", "&#9824;4", "&#9824;5", "&#9824;6", "&#9824;7", "&#9824;8", "&#9824;9", "&#9824;10", "&#9824;J", "&#9824;Q", "&#9824;K",
  38.          "&#9728;", "&#127769;"]
  39. num_cards = len(cards)
  40. new_cards = fy_shuffle(cards, 3)
  41. print(cards)
  42. #dealcards()

  43. 这样可以解决第一阶段的问题
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-14 14:59:02 | 显示全部楼层
使用cards_get = new,得到上一轮洗牌的序列,当然其实没什么意义,这里假洗也一样的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-14 15:11:08 | 显示全部楼层
  1. import random
  2. def fy_shuffle(cards_get,times):
  3.     new = []
  4.     cards_new01 = cards_get[:]
  5.     for i in range(times):
  6.         n = len(cards_new01)
  7.         while n > 0:
  8.             k = random.randint(0,n-1)
  9.             new.append(cards_new01[k])
  10.             cards_new01.pop(k)
  11.             n -= 1
  12.             #print(cards)
  13.         cards_new01 = new[:]
  14.         print(new)

  15. def dealcards():
  16.     player = []
  17.     a = input("请输入第一位游戏玩家名称:")
  18.     b = input("请输入第二位游戏玩家名称:")
  19.     c = input("请输入第三位游戏玩家名称:")
  20.     player.append(a)
  21.     player.append(b)
  22.     player.append(c)
  23.     k = random.randint(0,3)
  24.     landlord = player[k]
  25.     print("地主是:{landlord}")
  26.     for name in player:
  27.         if name != landlord:
  28.             get = " ".join(new)
  29.             print(f"[{name}拿到的牌是:{get}]")
  30.         else:
  31.             get = " ".join(new)
  32.             add = " ".join(cards)
  33.             landlord = get + add
  34.             print(f"[{name}拿到的牌是:{landlord}]")

  35. cards = ["&#9830;1", "&#9830;2", "&#9830;3", "&#9830;4", "&#9830;5", "&#9830;6", "&#9830;7", "&#9830;8", "&#9830;9", "&#9830;10", "&#9830;J", "&#9830;Q", "&#9830;K",
  36.          "&#9829;1", "&#9829;2", "&#9829;3", "&#9829;4", "&#9829;5", "&#9829;6", "&#9829;7", "&#9829;8", "&#9829;9", "&#9829;10", "&#9829;J", "&#9829;Q", "&#9829;K",
  37.          "&#9827;1", "&#9827;2", "&#9827;3", "&#9827;4", "&#9827;5", "&#9827;6", "&#9827;7", "&#9827;8", "&#9827;9", "&#9827;10", "&#9827;J", "&#9827;Q", "&#9827;K",
  38.          "&#9824;1", "&#9824;2", "&#9824;3", "&#9824;4", "&#9824;5", "&#9824;6", "&#9824;7", "&#9824;8", "&#9824;9", "&#9824;10", "&#9824;J", "&#9824;Q", "&#9824;K",
  39.          "&#9728;", "&#127769;"]
  40. num_cards = len(cards)
  41. new_cards = fy_shuffle(cards, 3)
  42. print(cards)
  43. #dealcards()

  44. 这样能保留原始的列表,使用[:]取得列表,不然地址引用会改原来的列表,这也是坏习惯
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-14 15:38:16 | 显示全部楼层
print("地主是:",landlord)
地主这里要这样改,放在括号里是不会出来的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-14 15:43:39 | 显示全部楼层
def dealcards():
&#160; &#160; player = []
&#160; &#160; a = input("请输入第一位游戏玩家名称:")
&#160; &#160; b = input("请输入第二位游戏玩家名称:")
&#160; &#160; c = input("请输入第三位游戏玩家名称:")
&#160; &#160; player.append(a)
&#160; &#160; player.append(b)
&#160; &#160; player.append(c)
&#160; &#160; k = random.randint(0,3)
&#160; &#160; landlord = player[k]
&#160; &#160; print("地主是:{landlord}")


&#160; &#160; for name in player:
&#160; &#160;&#160; &#160;&#160;&#160;
&#160; &#160;&#160; &#160;&#160;&#160;if name != landlord:
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;get = " ".join(new)
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;print(f"[{name}拿到的牌是:{get}]")
&#160; &#160;&#160; &#160;&#160;&#160;else:
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;get = " ".join(new)
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;add = " ".join(cards)
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;landlord = get + add
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;print(f"[{name}拿到的牌是:{landlord}]")
dealcards()
对这个后一段的功能看不懂,错误在于1,没有传参数,传参数进去。2.还是序列的长度要减去1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-14 15:44:29 | 显示全部楼层
  1. import random
  2. def fy_shuffle(cards_get,times):
  3.     cards_new01 = cards_get[:]
  4.     new = []
  5.     for i in range(times):
  6.         n = len(cards_new01)
  7. 对dealcards 可以说明下功能吗,确实不理解
  8.         while n > 0:
  9.             k = random.randint(0,n-1)
  10.             new.append(cards_new01[k])
  11.             cards_new01.pop(k)
  12.             n -= 1
  13.             #print(cards)
  14.         cards_new01 = new[:]
  15.         print(new)
  16.         new = []
  17.     return cards_new01

  18. def dealcards(new02):
  19.     player = []
  20.     a = input("请输入第一位游戏玩家名称:")
  21.     b = input("请输入第二位游戏玩家名称:")
  22.     c = input("请输入第三位游戏玩家名称:")
  23.     player.append(a)
  24.     player.append(b)
  25.     player.append(c)
  26.     k = random.randint(0,2)
  27.     landlord = player[k]
  28.     print("地主是:",landlord)
  29.     for name in player:
  30.         if name != landlord:
  31.             get = " ".join(new02)
  32.             print(f"[{name}拿到的牌是:{get}]")
  33.         else:
  34.             get = " ".join(new02)
  35.             add = " ".join(cards)
  36.             landlord = get + add
  37.             print(f"[{name}拿到的牌是:{landlord}]")

  38. cards = ["&#9830;1", "&#9830;2", "&#9830;3", "&#9830;4", "&#9830;5", "&#9830;6", "&#9830;7", "&#9830;8", "&#9830;9", "&#9830;10", "&#9830;J", "&#9830;Q", "&#9830;K",
  39.          "&#9829;1", "&#9829;2", "&#9829;3", "&#9829;4", "&#9829;5", "&#9829;6", "&#9829;7", "&#9829;8", "&#9829;9", "&#9829;10", "&#9829;J", "&#9829;Q", "&#9829;K",
  40.          "&#9827;1", "&#9827;2", "&#9827;3", "&#9827;4", "&#9827;5", "&#9827;6", "&#9827;7", "&#9827;8", "&#9827;9", "&#9827;10", "&#9827;J", "&#9827;Q", "&#9827;K",
  41.          "&#9824;1", "&#9824;2", "&#9824;3", "&#9824;4", "&#9824;5", "&#9824;6", "&#9824;7", "&#9824;8", "&#9824;9", "&#9824;10", "&#9824;J", "&#9824;Q", "&#9824;K",
  42.          "&#9728;", "&#127769;"]
  43. new_cards = fy_shuffle(cards, 3)
  44. #print(cards)
  45. dealcards(new_cards)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-21 05:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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