开发基础OOP控制台小游戏时触发IndexError错误求助
问题描述
开发一款基于基础OOP的控制台测试小游戏时触发IndexError错误。游戏支持6-10名玩家,需求是随机选择部分玩家作为攻击者,但在循环选择攻击者与被攻击者的过程中报错。
相关代码
import random class Fighter: def __init__(self, name, health, power, stamina): self.name = name self.health = health self.power = power self.stamina = stamina self.fighter_stats = [self.name, self.health, self.power, self.stamina] @classmethod def Get_Hurt(cls): pass @classmethod def Attack(cls): pass fighters_list = [] atackers_list = [] dummy_value = 0 fighter_num = random.randint(6, 10) atackers_num = random.randint(1, 6) for i in range(1, fighter_num + 1): fighter_health = random.randint(55, 100) fighter_power = random.randint(20, 35) fighter_stamina = random.randint(3, 7) fighter = Fighter(f"fighter{i}", fighter_health, fighter_power, fighter_stamina) fighters_list.append(fighter.name) dummy_value += 1 while True: #this while loop is for making sure if the for loop is in its last loop if dummy_value != fighter_num + 1: dummy_value += 1 continue else: for i in range(atackers_num): rand_attacker = random.choice(fighters_list) atackers_list.append(rand_attacker) fighters_list.remove(rand_attacker) break print(fighters_list) print(atackers_list)
控制台报错
Traceback (most recent call last): File "C:\Users\azaz9\PycharmProjects\oyrenme\yoxlama.py", line 38, in <module> rand_attacker = random.choice(fighters_list) File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\random.py", line 378, in choice return seq[self._randbelow(len(seq))] IndexError: list index out of range
问题分析
- 错误的while循环逻辑:创建玩家的for循环中,每次迭代都会进入
while True循环,不断累加dummy_value直到等于fighter_num + 1才退出。这导致for循环仅执行第一次迭代(创建第一个玩家)就被卡住,后续玩家根本不会被添加到fighters_list中。最终fighters_list仅1个元素,但atackers_num是1-6的随机数,当需要选择超过1个攻击者时,fighters_list会被清空,再次调用random.choice就触发索引越界错误。 - 攻击者数量无上限限制:
atackers_num固定取1-6,若后续调整玩家数范围,可能出现攻击者数量超过总玩家数的情况,同样会触发错误。 - 拼写错误:变量名
atackers_list、atackers_num存在拼写错误,正确应为attackers_list、attackers_num(虽不影响运行,但降低代码可读性)。
解决方案
- 移除错误的while循环:将选择攻击者的逻辑移到创建所有玩家的for循环之后,确保所有玩家都被添加到列表后再进行随机选择。
- 限制攻击者数量范围:将
atackers_num的取值范围改为1到fighter_num,避免选择的攻击者数量超过总玩家数。 - 修正拼写错误:统一变量名拼写,提升代码可读性。
修改后的代码
import random class Fighter: def __init__(self, name, health, power, stamina): self.name = name self.health = health self.power = power self.stamina = stamina self.fighter_stats = [self.name, self.health, self.power, self.stamina] @classmethod def Get_Hurt(cls): pass @classmethod def Attack(cls): pass fighters_list = [] attackers_list = [] fighter_num = random.randint(6, 10) # 限制攻击者数量不超过总玩家数 attackers_num = random.randint(1, fighter_num) # 先创建所有玩家 for i in range(1, fighter_num + 1): fighter_health = random.randint(55, 100) fighter_power = random.randint(20, 35) fighter_stamina = random.randint(3, 7) fighter = Fighter(f"fighter{i}", fighter_health, fighter_power, fighter_stamina) fighters_list.append(fighter.name) # 随机选择攻击者 for _ in range(attackers_num): rand_attacker = random.choice(fighters_list) attackers_list.append(rand_attacker) fighters_list.remove(rand_attacker) print(fighters_list) print(attackers_list)
内容的提问来源于stack exchange,提问作者Fərhad Əhmədov
相关产品推荐
相关产品推荐

