Java剪刀石头布游戏:自定义回合数的for循环异常问题
剪刀石头布游戏添加自定义回合数后的输入异常问题
原本可正常运行的Java剪刀石头布游戏,添加用户自定义回合数功能后出现异常:输入回合数后,程序连续两次输出出拳提示,且第一次无法接收用户输入。
正常代码
import java.util.Scanner; import java.util.Random; public class game { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String[] rps = {"rock","paper","scissors"}; String computerMove = rps[new Random().nextInt(rps.length)]; for(int i=0;i<2;i++) { System.out.println("Please enter your move (rock, paper or scissors)"); String playerMove = scanner.nextLine(); if(playerMove.equals(computerMove)) { System.out.println("It's a tie. Computer chose also "+computerMove); } else if (playerMove.equals("rock")) { if (computerMove.equals("scissors")) { System.out.println("You've won. Computer chose "+computerMove); } else { System.out.println("You loose. Computer chose "+ computerMove); } } else if (playerMove.equals("paper")) { if (computerMove.equals("rock")) { System.out.println("You've won. Computer chose "+computerMove); } else { System.out.println("You loose. Computer chose "+computerMove); } } else if (playerMove.equals("scissors")) { if (computerMove.equals("paper")) { System.out.println("You've won. Computer chose "+computerMove); } else { System.out.println("You loose. Computer chose "+computerMove); } } } } }
添加回合数后的异常代码
import java.util.Scanner; import java.util.Random; public class game { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String[] rps = {"rock","paper","scissors"}; String computerMove = rps[new Random().nextInt(rps.length)]; System.out.println("How many rounds you wanna play?"); int rounds = scanner.nextInt(); for(int i=0;i<rounds;i++) { System.out.println("Please enter your move (rock, paper or scissors)"); String playerMove = scanner.nextLine(); if(playerMove.equals(computerMove)) { System.out.println("It's a tie. Computer chose also "+computerMove); } else if (playerMove.equals("rock")) { if (computerMove.equals("scissors")) { System.out.println("You've won. Computer chose "+computerMove); } else { System.out.println("You loose. Computer chose "+ computerMove); } } else if (playerMove.equals("paper")) { if (computerMove.equals("rock")) { System.out.println("You've won. Computer chose "+computerMove); } else { System.out.println("You loose. Computer chose "+computerMove); } } else if (playerMove.equals("scissors")) { if (computerMove.equals("paper")) { System.out.println("You've won. Computer chose "+computerMove); } else { System.out.println("You loose. Computer chose "+computerMove); } } } } }
运行现象
How many rounds you wanna play?
2
Please enter your move (rock, paper or scissors)
Please enter your move (rock, paper or scissors)
rock
You've won. Computer chose scissors
问题原因及修复方案
原因
scanner.nextInt()仅读取输入中的整数部分,当输入回合数后按下回车键,换行符会残留在输入缓冲区中。第一次调用scanner.nextLine()时,会直接读取这个空的换行符,导致程序跳过用户输入,直接进入下一次循环,因此出现连续两次提示的现象。
另外原异常代码存在逻辑问题:电脑的出拳仅在初始化时生成一次,所有回合电脑都会出相同的手势,不符合游戏逻辑。
修复方案
- 清空输入缓冲区:在
scanner.nextInt()之后,额外调用一次scanner.nextLine()来清除残留的换行符。 - 调整电脑出拳逻辑:将电脑出拳的代码移到
for循环内部,每回合重新生成随机出拳。
修复后的完整代码:
import java.util.Scanner; import java.util.Random; public class game { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String[] rps = {"rock","paper","scissors"}; System.out.println("How many rounds you wanna play?"); int rounds = scanner.nextInt(); scanner.nextLine(); // 清除输入缓冲区的换行符 for(int i=0;i<rounds;i++) { // 每回合重新生成电脑出拳 String computerMove = rps[new Random().nextInt(rps.length)]; System.out.println("Please enter your move (rock, paper or scissors)"); String playerMove = scanner.nextLine(); if(playerMove.equals(computerMove)) { System.out.println("It's a tie. Computer chose also "+computerMove); } else if (playerMove.equals("rock")) { if (computerMove.equals("scissors")) { System.out.println("You've won. Computer chose "+computerMove); } else { System.out.println("You loose. Computer chose "+ computerMove); } } else if (playerMove.equals("paper")) { if (computerMove.equals("rock")) { System.out.println("You've won. Computer chose "+computerMove); } else { System.out.println("You loose. Computer chose "+computerMove); } } else if (playerMove.equals("scissors")) { if (computerMove.equals("paper")) { System.out.println("You've won. Computer chose "+computerMove); } else { System.out.println("You loose. Computer chose "+computerMove); } } } } }
内容的提问来源于stack exchange,提问作者Cedio
相关产品推荐
相关产品推荐

