用do-while实现更合适,因游戏至少需猜一次,先执行后判断,避免预设无效初值;核心逻辑是用hasNextInt()校验输入、nextInt()读数、Random.nextInt(100)+1生成1-100目标数,并清晰提示大小。

怎么用 if 和 while 实现核心猜数字逻辑
核心就是不断读用户输入,和随机数比大小,直到猜对为止。关键不是“写完就行”,而是避免死循环或类型错误。
-
Scanner.nextInt()读整数前,必须先用hasNextInt()判定输入是否合法,否则输字母会卡住 - 生成随机数别用
Math.random() * 100,它返回double,转int会丢精度;改用new Random().nextInt(100) + 1更准 - 每次比较后要明确告诉用户“太大了”“太小了”,不能只打印“不对”,否则玩家无法缩小范围
Random rand = new Random(); int target = rand.nextInt(100) + 1; Scanner sc = new Scanner(System.in); int guess = 0;while (guess != target) { System.out.print("请输入1-100之间的整数:"); if (!sc.hasNextInt()) { System.out.println("输入不是数字,请重试!"); sc.next(); // 清掉非法输入 continue; } guess = sc.nextInt(); if (guess < target) { System.out.println("太小了!"); } else if (guess > target) { System.out.println("太大了!"); } } System.out.println("恭喜你,猜对了!");
为什么 do-while 比 while 更适合这个场景
因为游戏至少要让用户猜一次,do-while 先执行再判断,天然符合“先输入、再比对”的流程,不用预先设一个假初始值。
- 用
while时得给guess赋个初值(比如 0),容易让人误以为这是有效猜测 -
do-while的循环体更干净,条件只写guess != target,语义清晰 - 如果后续加“是否再玩一次”功能,
do-while套一层外层循环也更直观
如何让程序支持重复游玩而不重启
重点是把游戏主逻辑包进一个循环,并在每次结束后询问用户意愿。这里最容易错的是字符串比较——别用 == 判 "y",要用 equals()。
- 用户输大小写都应接受,推荐用
input.toLowerCase().equals("y") -
Scanner在读完数字后可能残留换行符,调用sc.nextLine()清一下,否则下一次nextLine()会直接返回空字符串 - 别在循环里反复
new Scanner(System.in),一个实例复用即可
常见运行时错误和对应修复点
实际跑起来最常遇到三类问题:输入阻塞、数字范围不符、无限提示“太小了”。根本原因往往不在逻辑,而在输入流状态没处理好。
立即学习“Java免费学习笔记(深入)”;
- 错误现象:
Exception in thread "main" java.util.InputMismatchException→ 没用hasNextInt()防御 - 错误现象:第一次输完数字,第二次直接跳过输入 → 上次
nextInt()没吃掉回车,下次nextLine()立刻返回空 - 错误现象:明明输对了还继续循环 →
target是 0~99,但提示写“1-100”,用户按提示输 100 永远不匹配
真正难的不是写对一次,而是让程序在各种乱输、连按回车、中途中断后还能稳住状态。输入校验和流清理,比猜数字算法本身更花时间。










