Java战斗方法击败所有敌人后报错,求技术解决方案
Java战斗方法敌人全灭后触发错误的解决方案
问题根源
当最后一个敌人被击败后,enemyList变为空,但后续角色的回合仍会继续执行——此时代码中所有访问enemyList.get(0)的逻辑都会抛出IndexOutOfBoundsException(数组越界异常),比如你报错的这行:
dmg = (skill[i][0] * charList.get(i).getSTR()) / enemyList.get(0).getDEF();
触发场景:多个角色轮流行动时,某角色击败最后一个敌人后,剩余角色仍会进入行动流程,尝试访问已空的敌人列表。
解决方案
1. 提前终止无效的角色回合
在每个角色行动前,先检查敌人列表是否为空,若为空则直接跳出角色回合循环,结束战斗:
while(!enemyList.isEmpty()){ for(int i = 0; i < charList.size(); i++){ // 新增:敌人全灭时,跳过剩余角色回合 if(enemyList.isEmpty()) { break; } if(HPnMP[i][0] <= 0) { System.out.println(name[i] + " has been defeated!"); continue; } // 原有角色状态展示、行动选择逻辑... } // 敌人回合逻辑... }
2. 给攻击/技能逻辑加保险
在所有访问enemyList.get(0)的代码块前,额外增加非空判断,避免异常:
基础攻击分支(case 1)
case 1: if(enemyList.isEmpty()) { System.out.println("所有敌人已被击败,无需攻击!"); break; } dmg = charList.get(i).getSTR() - enemyList.get(0).getDEF(); EnemyHP = enemyList.get(0).getHP() - dmg; // 后续伤害处理逻辑...
技能分支(case 2)
case 2: System.out.println("Select skill:"); System.out.println("1. " + skillname[i][0]); System.out.println("2. " + skillname[i][1]); int choice = scanN.nextInt(); if(choice == 1){ double MP = HPnMP[i][1] - MPCost[i][0]; if(MP >= 0){ HPnMP[i][1] = MP; if(enemyList.isEmpty()) { System.out.println("所有敌人已被击败,无需使用技能!"); break; } dmg = (skill[i][0] * charList.get(i).getSTR()) / enemyList.get(0).getDEF(); // 后续技能伤害处理逻辑... } else { System.out.println(name[i] + " ran out of mana to use their skill."); } } else { double MP = HPnMP[i][1] - MPCost[i][1]; if(MP >= 0){ HPnMP[i][1] = MP; if(enemyList.isEmpty()) { System.out.println("所有敌人已被击败,无需使用技能!"); break; } dmg = (skill[i][1] * charList.get(i).getSTR()) / enemyList.get(0).getDEF(); // 后续技能伤害处理逻辑... } else { System.out.println(name[i] + " ran out of mana to use their skill."); } }
额外优化建议
目前代码固定攻击索引为0的敌人,可考虑改为随机选择存活敌人,让战斗逻辑更合理:
// 替换原有enemyList.get(0)的逻辑 Random random = new Random(); int targetIndex = random.nextInt(enemyList.size()); Enemies targetEnemy = enemyList.get(targetIndex); // 用targetEnemy替代enemyList.get(0)进行伤害计算
内容的提问来源于stack exchange,提问作者Idiot User
相关产品推荐
相关产品推荐

