You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发基础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
问题分析
  1. 错误的while循环逻辑:创建玩家的for循环中,每次迭代都会进入while True循环,不断累加dummy_value直到等于fighter_num + 1才退出。这导致for循环仅执行第一次迭代(创建第一个玩家)就被卡住,后续玩家根本不会被添加到fighters_list中。最终fighters_list仅1个元素,但atackers_num是1-6的随机数,当需要选择超过1个攻击者时,fighters_list会被清空,再次调用random.choice就触发索引越界错误。
  2. 攻击者数量无上限限制:atackers_num固定取1-6,若后续调整玩家数范围,可能出现攻击者数量超过总玩家数的情况,同样会触发错误。
  3. 拼写错误:变量名atackers_list、atackers_num存在拼写错误,正确应为attackers_list、attackers_num(虽不影响运行,但降低代码可读性)。
解决方案
  1. 移除错误的while循环:将选择攻击者的逻辑移到创建所有玩家的for循环之后,确保所有玩家都被添加到列表后再进行随机选择。
  2. 限制攻击者数量范围:将atackers_num的取值范围改为1到fighter_num,避免选择的攻击者数量超过总玩家数。
  3. 修正拼写错误:统一变量名拼写,提升代码可读性。

修改后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:57:20