You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()时,会直接读取这个空的换行符,导致程序跳过用户输入,直接进入下一次循环,因此出现连续两次提示的现象。

另外原异常代码存在逻辑问题:电脑的出拳仅在初始化时生成一次,所有回合电脑都会出相同的手势,不符合游戏逻辑。

修复方案

  1. 清空输入缓冲区:在scanner.nextInt()之后,额外调用一次scanner.nextLine()来清除残留的换行符。
  2. 调整电脑出拳逻辑:将电脑出拳的代码移到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 07:07:15