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
相关产品推荐
相关产品推荐

