为何打砖块游戏的PowerUp选择while循环触发索引错误?
问题分析与解决
索引错误的根本原因
你代码里用了exit来终止循环,但这完全不对:
- Python里终止当前循环要用
break,exit()是用来退出整个程序的,而且你还没加括号,exit只是函数引用,根本没执行。 - 循环没被终止,
i会一直减小,直到超出列表的合法索引范围。比如列表长度为4时,合法负索引是-1到-4,当i变成-5,访问LOGIC.powerup[i]就会触发索引错误。
修正后的代码
把exit换成break,同时优化一些细节:
import random as r t = 0 powerup_len = len(LOGIC.powerup) i = r.randint(0, powerup_len - 1) # 生成0到3的随机索引 while True: if LOGIC.powerup[i] == 0: t = i break # 找到未激活道具,终止循环 i -= 1 if i < -powerup_len: # 遍历完所有道具都已激活 t = r.randint(0, powerup_len - 1) break # 随机选一个,终止循环 LOGIC.powerup[t] += 1200
更简洁的写法
其实可以直接收集所有未激活道具的索引,再随机选择,逻辑更清晰,也不会有循环失控的问题:
import random as r # 筛选出所有值为0的道具索引 available = [idx for idx, val in enumerate(LOGIC.powerup) if val == 0] if available: t = r.choice(available) else: # 所有道具都激活了,随机选一个 t = r.randint(0, len(LOGIC.powerup)-1) LOGIC.powerup[t] += 1200
内容的提问来源于stack exchange,提问作者Matteo La Malfa
相关产品推荐
相关产品推荐

