【问题标题】:Having issues with methods方法有问题
【发布时间】:2015-08-28 04:44:24
【问题描述】:

好的,我有一个班级作业,要为老师编写的石头剪刀布程序创建 3 种预先确定的方法。但是,当我运行程序时,它会连续多次运行这些方法。我已经多次查看代码,但无法找出问题所在。

以下是老师提供的部分课程:

public class Game
{

    public static void main (String[] args)
    {
        Scanner in = new Scanner (System.in);
        RockPaperScissors rps = new RockPaperScissors ();  //***Your class

        int numGames = 0;
        String userChoice = "";
        String cpuChoice = "";
        String winner = "";
        int userWins = 0;
        int cpuWins = 0;


        System.out.println("Welcome to Rock, Paper, Scissors!\n");

        //Get odd number of games
        System.out.println("How many rounds would you like to play?");
        numGames = in.nextInt();

        while (numGames % 2 == 0) //Even number
        {
            System.out.println("Sorry, number of games must be odd.  Please try again:");
            numGames = in.nextInt();
        }

        //Flush the buffer
        in.nextLine();

        //Play the game for the number of rounds the user entered
        for (int i = 1; i <= numGames; i++)
        {
            //Get the user and computer choices
            userChoice = rps.getUserChoice();  //***Your method
            cpuChoice = rps.getCPUChoice();   //***Your method


            System.out.println("Computer chooses " + cpuChoice);

            //Pick winner
            winner = rps.pickWinner(userChoice, cpuChoice);  //***Your method


            if (winner.equalsIgnoreCase("Tie"))
            {
                System.out.println("It's a tie!  Play again.");
                numGames++;
            }
            else
            {
                if (winner.equalsIgnoreCase("User"))
                {
                    userWins++;
                }
                else if (winner.equalsIgnoreCase("Computer"))
                {
                    cpuWins++;
                }
                else
                {
                    System.out.println("Error in picking winner");
                }

                System.out.println(winner + " wins!");
            }

        } //end for

        //Print results
        System.out.println("\nUser wins: " + userWins);
        System.out.println("Computer wins: " + cpuWins);

        if (userWins > cpuWins)
        {
            System.out.println("\nThe user won!");
        }
        if (cpuWins > userWins)
        {
            System.out.println("The computer won!");
        }

        //Close game
        System.out.println("\nThank you for playing!");

    } //end main

} //end class

这是我的代码,我假设问题出在哪里:

public class RockPaperScissors {


    public String getUserChoice() {
        Scanner sc = new Scanner (System.in);
        System.out.println("Enter your choice:");
        String userInput = sc.nextLine();
        boolean end = true;
        while (end == true){

            //Checks for valid user responses
            if (userInput.equals("rock") || userInput.equals("paper")|| userInput.equals("scissors")){
                end = false;
            }
            else {
                System.out.println("Invalid response. Please enter rock paper or scissors:");
                userInput = sc.next();
            }
        }

        return userInput;
    }// end getUsechoice

    public String getCPUChoice() {

        String computerChoice = " ";
        Random rand = new Random();
        int randomNum = rand.nextInt(3) + 1;
        if (randomNum == 1){
            computerChoice = "rock";
        }
        else if (randomNum == 2){
            computerChoice = "paper";
        }
        else if (randomNum == 3){
            computerChoice = "scissors";
        }


        return computerChoice;
    }

    public String pickWinner(String userChoice, String cpuChoice) {
        String result = " ";
        if (getUserChoice().equalsIgnoreCase("rock")) { 
            if (getCPUChoice().equalsIgnoreCase("rock")){
                result = "tie"; 
            }
            else if (getCPUChoice().equalsIgnoreCase("paper")){
                result = "Computer";
            }
            else if (getCPUChoice().equalsIgnoreCase("scissors")){
                result = "User";
            }       
        }
        else if (getUserChoice().equalsIgnoreCase("paper")){
            if (getCPUChoice().equalsIgnoreCase("paper")){
                result = "tie";
            }
            else if (getCPUChoice().equalsIgnoreCase("rock")){
                result = "User";
            }
            else if (getCPUChoice().equalsIgnoreCase("scissors")){
                result = "Computer";
            }
        }
        else if (getUserChoice().equalsIgnoreCase("Scissors")){
            if (getCPUChoice().equalsIgnoreCase("scissors")){
                result = "tie";
            }
            else if (getCPUChoice().equalsIgnoreCase("rock")){
                result = "Computer";
            }
            else if (getCPUChoice().equalsIgnoreCase("Paper")){
                result = "User";
            }
        }
        return result;



    }//end pickWinner

}//end rockPaperScissors

以下是该程序的示例会话:

欢迎来到石头剪刀布!

你想玩几局? 1 输入您的选择:摇滚 电脑选纸 输入你的选择:rock 输入你的选择:rock 电脑赢了!

用户获胜:0 计算机获胜:1 计算机获胜!

感谢您的参与!

在这里,我想知道为什么它会继续多次要求用户输入。它还运行其他方法,这就是为什么计算机在选择纸和石头的情况下获胜的原因。

好的,在我的程序的最后更改中添加了它现在可以正常运行:

public String pickWinner(String userChoice, String cpuChoice) {
        String result = " ";


        if (userChoice.equalsIgnoreCase("rock")) { 
            if (cpuChoice.equalsIgnoreCase("rock")){
                result = "tie"; 
            }
            else if (cpuChoice.equalsIgnoreCase("paper")){
                result = "Computer";
            }
            else if (cpuChoice.equalsIgnoreCase("scissors")){
                result = "User";
            }       
        }
        else if (userChoice.equalsIgnoreCase("paper")){
            if (cpuChoice.equalsIgnoreCase("paper")){
                result = "tie";
            }
            else if (cpuChoice.equalsIgnoreCase("rock")){
                result = "User";
            }
            else if (cpuChoice.equalsIgnoreCase("scissors")){
                result = "Computer";
            }
        }
        else if (userChoice.equalsIgnoreCase("Scissors")){
            if (cpuChoice.equalsIgnoreCase("scissors")){
                result = "tie";
            }
            else if (cpuChoice.equalsIgnoreCase("rock")){
                result = "Computer";
            }
            else if (cpuChoice.equalsIgnoreCase("Paper")){
                result = "User";
            }
        }
        return result;



    }//end pickWinner

问题似乎是,当我调用 getCPUChoice 或 getUserChoice 时,它​​会重新运行程序,然后更改最终答案。

【问题讨论】:

  • 一点点优化:从public static final String[] sChoices = {"rock","paper","scissors"} 中选择 CPU。然后你可以在 {0;2} 中有一个随机的(我们称之为 pickNr)并通过 return sChoices[pickNr]; 获得选择我会将随机对象设为类字段,因此你不会在每个对象中创建一个新对象计算机选择调用。那么 computerChoice 是一个 1-liner。
  • 现在困扰我的是这个答案对未来的读者不是很有用。 “这个问题是由无法再复制的问题或简单的印刷错误引起的。”所以至少应该编辑它。

标签: java oop methods constructor


【解决方案1】:

您在 pickWinner 方法中调用 getUserChoice()。它应该是您应该检查的 userChoice 方法参数。

public String pickWinner(String userChoice, String cpuChoice) {
String result = " ";
if (userChoice.equalsIgnoreCase("rock")) { 
    if (cpuChoice.equalsIgnoreCase("rock")){
        result = "tie"; 
    }
    else if (cpuChoice.equalsIgnoreCase("paper")){
        result = "Computer";
    }
    else if (cpuChoice.equalsIgnoreCase("scissors")){
        result = "User";
    }       
}
else if (userChoice.equalsIgnoreCase("paper")){
    if (cpuChoice.equalsIgnoreCase("paper")){
        result = "tie";
    }
    else if (cpuChoice.equalsIgnoreCase("rock")){
        result = "User";
    }
    else if (cpuChoice.equalsIgnoreCase("scissors")){
        result = "Computer";
    }
}
else if (userChoice.equalsIgnoreCase("Scissors")){
    if (cpuChoice.equalsIgnoreCase("scissors")){
        result = "tie";
    }
    else if (cpuChoice.equalsIgnoreCase("rock")){
        result = "Computer";
    }
    else if (cpuChoice.equalsIgnoreCase("Paper")){
        result = "User";
    }
}
return result;

【讨论】:

  • 你的眼睛很敏锐。 )
  • 你的 for 循环虽然有效,但标准是让变量 i 从 0 开始,所以这 for (int i = 0; i
  • 啊,是的,这似乎是问题所在。
【解决方案2】:

您应该在每个循环中询问用户输入,而不仅仅是一次。

public class RockPaperScissors {


    public String getUserChoice() {
        Scanner sc = new Scanner (System.in);
        System.out.println("Enter your choice:");
        //not here
        String userInput;
        while (true){
            //this is the right place
            userInput = sc.nextLine();
            //Checks for valid user responses
            if (userInput.equals("rock") || userInput.equals("paper")|| userInput.equals("scissors")){
                break;
            }
            else {
                System.out.println("Invalid response. Please enter rock paper or scissors:");
            }
        }

        return userInput;
    }// end getUsechoice

//...

}//end rockPaperScissors

【讨论】:

    【解决方案3】:

    尝试在你的 else 部分改变它

     userInput = sc.next();
    

    到这里

    userInput = sc.nextLine();
    

    所以它会转到下一行

    所以生成的代码将是

    while (end == true){
    
        //Checks for valid user responses
        if (userInput.equals("rock") || userInput.equals("paper")|| userInput.equals("scissors")){
            end = false;
        }
        else {
            System.out.println("Invalid response. Please enter rock paper or scissors:");
            userInput = sc.nextLine();
        }
    }
    

    【讨论】:

    • 这部分代码似乎至少可以正常工作。它旨在捕捉不是石头、纸或剪刀的响应。
    猜你喜欢
    • 2019-09-07
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2020-06-24
    • 2013-02-08
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多