用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),一个实例复用即可实际跑起来最常遇到三类问题:输入阻塞、数字范围不符、无限提示“太小了”。根本原因往往不在逻辑,而在输入流状态没处理好。
Exception in thread "main" java.util.InputMismatchException → 没用 hasNextInt() 防御nextInt() 没吃掉回车,下次 nextLine() 立刻返回空target 是 0~99,但提示写“1-100”,用户按提示输 100 永远不匹配真正难的不是写对一次,而是让程序在各种乱输、连按回车、中途中断后还能稳住状态。输入校验和流清理,比猜数字算法本身更花时间。