用 enum + switch 实现状态机,定义 main_menu、battle 等枚举值并封装 handleinput 方法;统一用 nextline() 读输入并清缓冲;角色属性动态计算,装备/状态通过 modifier 列表管理;避免 thread.sleep,用时间戳或帧计数控制节奏。

用 enum + switch 实现状态流转,别写一堆 if-else 嵌套
状态机在文字RPG里本质就是“当前在哪儿、能干啥、按啥键去哪”——比如 MAIN_MENU、BATTLE、INVENTORY。用 enum 定义状态比用字符串或整数安全得多,IDE 能补全、编译期校验、重构不崩。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 每个
enum值附带一个handleInput(String input)方法,把输入解析和跳转逻辑封装进去,避免主循环堆满分支 - 状态切换时加日志(如
System.out.println("→ " + newState);),否则卡住时根本不知道停在哪了 - 别在状态类里直接读
System.in——统一由主循环读一行,再交给当前状态处理;否则不同状态混着读,容易漏输入或阻塞
Character 类里属性不能只存基础值,得包一层计算逻辑
角色血量不是固定 int hp = 100,而是“基础值 + 装备加成 + 状态效果 - 受伤衰减”。硬编码所有组合会爆炸式增长,比如穿铁甲+中毒+狂暴,手动算错一次,战斗就崩。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 用
private int baseHp;+private List<modifier> modifiers;</modifier>,每次取getHp()时动态求和,而不是缓存结果(除非性能真成瓶颈) -
Modifier接口定义applyTo(Character c)和expiresAfterTurns(),中毒、狂暴、护盾都实现它,生命周期清晰 - 别让装备直接改
hp字段——它该改的是modifiers列表,否则卸下装备时还得反向扣减,极易漏
控制台输入阻塞是最大陷阱,Scanner.nextLine() 之前必须清空缓冲区
常见错误现象:nextInt() 后跟 nextLine(),结果第二行直接跳过——因为 nextInt() 不吞掉回车,nextLine() 立刻读到空行。文字游戏里这就表现为“输入数字选技能,然后直接闪回主菜单”。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 统一用
nextLine()读所有输入,再用Integer.parseInt()或正则判断类型;别混用nextInt()/nextDouble() - 如果非要用
nextInt(),后面立刻加一句scanner.nextLine();清缓冲,写成一行注释也行:scanner.nextInt(); scanner.nextLine(); // consume newline - 输入解析失败时,别直接
return或抛异常退出循环——要打印错误提示并continue,否则玩家输错一次就卡死
战斗循环里别用 Thread.sleep() 控制节奏,用状态+帧计数代替
加 Thread.sleep(1000) 看起来像“等一秒显示结果”,但实际会让整个程序挂起:无法响应中断、无法取消行动、Windows 下精度差、打包成 jar 后可能被杀后台。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 主循环里维护一个
long lastActionTime和int actionCooldown,每次循环检查System.currentTimeMillis() - lastActionTime > actionCooldown - 动画效果(如血条闪烁)用帧数计数器:
if (++flashFrame % 4 == 0) drawHpBar();,比睡眠更可控 - 真正需要等待用户按键?就别睡——循环里持续
if (scanner.hasNextLine()) { ... },配合短延时(Thread.sleep(50))防吃满 CPU 就行
状态机不是炫技,是让“按E打开背包”这种操作不依赖当前在哪个方法里;属性计算不是堆字段,是保证“脱下戒指后力量立刻降2点”这事不会漏掉。最常被忽略的,其实是输入缓冲区那行 nextLine() ——它不出错时不显眼,一出错就整个流程静音失效。











