Java实现数值对战游戏时while循环运行异常问题求助
问题排查与修复方案
核心错误梳理
- Scanner读取输入仅需要将接收的内容存在变量中即可,不需要定义多个Dice相关变量,你代码中声明的
diceRollTwo到diceRollEight大多未被实际使用,属于冗余代码,不影响Scanner正常运行但会干扰逻辑梳理 - 生命值扣除不需要硬编码具体数值,满足扣血条件时直接对生命值变量做自减操作(
player -= 1/monster -= 1)即可,硬编码会导致逻辑完全固定,无法动态计算剩余血量 - 无论输入什么都返回玩家扣血的原因有两个:一是扣血判定逻辑错误,拿玩家生命值和阈值10做比较,而非拿用户输入的数值做比较;二是循环开头就写了
continue语句,后面所有扣血判断逻辑永远不会被执行 - while循环条件完全错误,原来的
player <= challenge会导致只要玩家生命值小于10就永远循环,正确的循环条件是玩家和怪物的生命值都大于0,满足对战继续的前提,循环内部不需要嵌套多层if,每次循环走一次「接收输入→判定扣血→检查胜负」的流程即可
修复后的完整代码
import java.util.Scanner; public class Task3 { public static void main(String[] args) { startGame(); } public static void startGame() { // 固定阈值为10 final int CHALLENGE_THRESHOLD = 10; int playerHp = 3; int monsterHp = 3; Scanner sc = new Scanner(System.in); // 双方都有生命值时继续对战 while (playerHp > 0 && monsterHp > 0) { System.out.println("请输入1~20范围内的整数:"); int inputNum = sc.nextInt(); // 输入合法性校验 if (inputNum < 1 || inputNum > 20) { System.out.println("输入不合法,请重新输入!"); continue; } // 扣血判定逻辑 if (inputNum <= CHALLENGE_THRESHOLD) { playerHp -= 1; System.out.println("玩家扣除1点生命值,当前剩余:" + playerHp); } else { monsterHp -= 1; System.out.println("怪物扣除1点生命值,当前剩余:" + monsterHp); } } // 胜负判定 if (playerHp <= 0) { System.out.println("玩家生命值耗尽,怪物获胜!"); } else { System.out.println("怪物生命值耗尽,玩家获胜!"); } sc.close(); } }
关键修改说明
- 移除所有冗余的dice变量,仅用一个
inputNum变量接收每次用户输入,简化逻辑 - 修正扣血判定规则,使用用户输入的数值和阈值10比较,符合需求
- 扣血逻辑改为动态自减,无需硬编码生命值数值
- 修正while循环的判定条件,仅在双方都存活时继续循环
- 删除所有干扰逻辑的无效
continue语句,仅在校验输入不合法时使用 - 增加输入范围校验,符合题目要求的1~20输入规则
- 对战结束后统一判定胜负,逻辑清晰易维护
内容的提问来源于stack exchange,提问作者Sarth
相关产品推荐
相关产品推荐

