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

BlueJ运行Java烘焙游戏代码输入卡住、无限循环问题求解

问题根源

你代码卡输入、无限打印内容的核心原因是写了多处无退出逻辑的空while死循环,具体问题点如下:

  • flavor校验段的boolean oo = false; while(oo){...}属于无效代码,循环初始条件为false,永远不会执行
  • 选择topping后无响应的直接原因:你首次获取topping输入存入cuTopping后,写了while(tt==false)的循环,循环内仅做一次列表包含判断,既不重新读取用户新输入的内容,也不会在输入不合法时修改循环标记变量。如果第一次输入的topping不在合法列表里,判断结果永远为false,循环会一直空转,后续你输入的所有内容都不会被程序读取,自然不会往下执行
  • 此前遇到的无限打印已发现蛋糕的问题,也是同类错误:判断蛋糕是否已解锁的两个while循环,只要条件不满足就会无限重复执行打印逻辑,没有任何跳出机制
  • 隐藏逻辑bug:flavor输入不合法提示重输后,你没有把新输入的内容转小写重新赋值给cuFlavor,就算用户输入了正确的口味,后续校验也无法通过
修复方案

删掉所有无效的布尔标记和对应死循环,把输入校验改成「不合法就持续提示重输、实时读取新输入做校验,直到拿到合法值再往下走」的标准逻辑,蛋糕解锁判断直接用单次if判断即可,不需要套循环。

可直接替换的核心修复代码

把原main方法里while (achievements != 16)循环的内部内容,替换为以下代码即可:

System.out.println("Pick a flavor");
String flavor = sc.nextLine();
if (flavor.equalsIgnoreCase("quit")){
    delay("Thanks for playing!", 40L);
    System.exit(0);
}
String cuFlavor = flavor.toLowerCase();
// 校验口味合法性,不合法就循环提示重输
while (!Arrays.asList(f).contains(cuFlavor)){
    delay("Not an option, please pick again.", 40L);
    flavor = sc.nextLine();
    if (flavor.equalsIgnoreCase("quit")){
        delay("Thanks for playing!", 40L);
        System.exit(0);
    }
    cuFlavor = flavor.toLowerCase();
}

System.out.println("Pick a topping");
String topping = sc.nextLine();
if (topping.equalsIgnoreCase("quit")){
    delay("Thanks for playing!", 40L);
    System.exit(0);
}
String cuTopping = topping.toLowerCase();
// 校验配料合法性,不合法就循环提示重输
while (!Arrays.asList(t).contains(cuTopping)){
    delay("Not an option, please pick again.", 40L);
    topping = sc.nextLine();
    if (topping.equalsIgnoreCase("quit")){
        delay("Thanks for playing!", 40L);
        System.exit(0);
    }
    cuTopping = topping.toLowerCase();
}

String cake = cuFlavor + " " + cuTopping;
// 单次判断蛋糕是否已解锁,不需要循环
if(foundCakes.contains(cake)){
    delay("Previously found recipe!", 40L);
    delay(getRandomResponse(), 40L);
} else {
    delay("You found a new cake!", 40L);
    delay("Unlocked: "+cake, 40L);
    foundCakes.add(cake);
    achievements++;
    delay("Number of recipes found: " + achievements, 40L);
}

循环外可以加一句全收集通关提示,避免程序直接无提示退出:

delay("Congratulations! You've collected all 16 bakery recipes!", 40L);
额外优化点
  • 原代码里new <String>ArrayList()语法不规范,改成new ArrayList<String>()即可,高版本Java也可以简写为new ArrayList<>()
  • 类中定义的public ArrayList<String> aList = new ArrayList();全程未被使用,可以直接删掉减少冗余
  • 拼接蛋糕名称时建议加空格分隔,不然输出会是chocolatesprinkles这类连在一起的字符串,可读性差

学编程两个月就能写出完整的交互游戏框架已经很不错,死循环是新手写条件循环时非常容易踩的坑,写while循环时只要先确认:循环内部存在能让循环条件最终变为false的逻辑,就不会出现无响应的问题。

内容的提问来源于stack exchange,提问作者Codi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:09:41