Python扑克发牌报错:randint触发empty range for randrange()异常
解决Python扑克程序中的randint空范围错误
问题原因
你的deckSuit列表只有4个花色元素,但循环要执行5次。每次循环用pop()移除一个花色元素,第四次循环后deckSuit就被清空了。第五次循环时,len(deckSuit)-1等于-1,randint(0, -1)的范围是无效的空区间,直接触发报错。而且从扑克逻辑来说,花色是可以重复搭配不同数字的,你不该用pop()移除花色元素,这不符合真实牌局规则。
解决方案1:随机选择花色(不移除原列表元素)
用random.choice()替代pop()来选花色,这样不会修改原花色列表,每次都能正常随机选取:
import random deckNumber = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"] deckSuit = ["Spades", "Diamonds", "Clubs", "Hearts"] playerHand = [] oppHand = [] for i in range(5): # 随机抽一个数字并移除(确保数字不重复) number = deckNumber.pop(random.randint(0, len(deckNumber)-1)) # 随机选一个花色,不移除原列表元素 suit = random.choice(deckSuit) playerHand.append(f"{number} {suit}") print(playerHand)
解决方案2:生成完整牌组后抽牌(更符合真实扑克逻辑)
先生成包含所有52张牌的完整牌组,洗牌后再抽取,完全模拟真实牌局:
import random deckNumber = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"] deckSuit = ["Spades", "Diamonds", "Clubs", "Hearts"] # 生成完整的52张牌 full_deck = [f"{num} {suit}" for num in deckNumber for suit in deckSuit] random.shuffle(full_deck) # 洗牌 playerHand = full_deck[:5] # 取前5张给玩家 oppHand = full_deck[5:10] # 取接下来5张给对手 print(playerHand)
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

