Java剪刀石头布游戏While循环问题:判定错误与输入跳过
Java剪刀石头布游戏问题修复
问题1:全判定失败的修复
你的胜负判定逻辑核心错误在字符串比较方式:Java中==用于比较字符串的内存引用地址,而非内容。用户输入的字符串和你定义的常量字符串(比如"Rock")即使内容一致,内存地址也不同,==会返回false,导致所有情况都走到else分支显示失败。
必须把所有PI == "XXX"和PI == RGW的判断改成PI.equals("XXX")和PI.equals(RGW)。另外你的随机数生成代码有语法错误:int RGrand.nextInt(3);应该写成int RG = rand.nextInt(3);,否则RG变量未定义根本无法编译。
问题2:第二次循环跳过输入的修复
用input.next().charAt(0)读取Y/N时,只会读取输入的字符,不会处理输入后的换行符。下一次循环调用input.nextLine()时,会直接读取缓冲区中残留的换行符,导致PI为空字符串,进而直接触发失败判定。
解决方法是在读取完PA后,加一行input.nextLine()清空缓冲区的换行符。
修复后的完整代码
import java.util.Scanner; import java.util.Random; public class RPS { public static void main(String[] args) { Scanner input = new Scanner(System.in); Random rand = new Random(); char PA; do { String RGW; System.out.println("Rock Paper or Scissors?"); String PI = input.nextLine(); // 修复随机数生成的语法错误 int RG = rand.nextInt(3); if (RG == 0) { RGW = "Rock"; } else if (RG == 1) { RGW = "Paper"; } else { RGW = "Scissors"; } System.out.println("Opponents Move: " + RGW + "\nYour Move: " + PI); // 修复字符串比较,改用equals()方法 if (PI.equals(RGW)) { System.out.println("It's a Tie!"); } else if ((PI.equals("Rock") && RGW.equals("Scissors")) || (PI.equals("Scissors") && RGW.equals("Paper")) || (PI.equals("Paper") && RGW.equals("Rock"))) { System.out.println("You Win!"); } else { System.out.println("You Lose!"); } System.out.println("Play Again? Y/N"); PA = input.next().charAt(0); // 吃掉输入缓冲区残留的换行符,避免下一次nextLine()读取空内容 input.nextLine(); } while (PA == 'Y' || PA == 'y'); // 用字符常量替代ASCII码,代码更易读 } }
内容的提问来源于stack exchange,提问作者AlpacaArmy
相关产品推荐
相关产品推荐

