【问题标题】:Rock, Paper, Scissors Java Game石头、纸、剪刀 Java 游戏
【发布时间】:2015-01-15 01:37:33
【问题描述】:

我的任务是编写一个程序,让用户在电脑上玩石头、剪子布游戏。

说明:

main 方法应该有两个嵌套循环,其中外层循环允许用户根据需要经常玩游戏,而内层循环将在出现平局时玩游戏。在 userChoice() 方法的 while 循环中调用方法 isValidChoice() 以验证用户输入的选项必须是“rock”、“paper”或“scissors”。如果输入了无效的字符串,isValidChoice() 将返回 false,并且程序应该要求新的输入,直到给出有效的输入。

情况:

当用户输入有效输入时,程序运行良好。但是,一旦它不是有效的输入,就会出现一个小问题。

结果:

Enter rock, paper, or scissors: rocky
Invalid input, enter rock, paper, or scissors: roc
Invalid input, enter rock, paper, or scissors: rock
The computer's choice was paper
The user's choice was rocky

Play again? (y/n)

如您所见,程序识别出无效输入。用户最终输入了一个有效的 第三次输入。但是,它显示用户的首选“rocky”是无效的。 因此程序无法显示谁获胜。

问题

我需要你的帮助。
我希望我的程序像这样运行: 当用户输入多个无效输入,但一次 输入了有效的输入,我的程序应该仍然能够显示用户的有效输入并显示获胜者。

import java.util.Scanner;
import java.util.Random;

public class RockPaperScissorsGame 
{
   public static void main (String[] args)
   {
      Scanner keyboard = new Scanner(System.in);

      String computer, user;
      char keepPlaying;

      do 
      {
         computer = computerChoice();
         user = userChoice();

         System.out.println("The computer's choice was " + computer);
         System.out.println("The user's choice was " + user);

         determineWinner(computer, user);

         while (computer.equals(user))
         {
            computer = computerChoice();
            user = userChoice();

            System.out.println("The computer's choice was " + computer);
            System.out.println("The user's choice was " + user);

            determineWinner(computer, user);
         }


         System.out.println("\n" + "Play again? (y/n)");
         keepPlaying = keyboard.nextLine().toLowerCase().charAt(0);

         while ( keepPlaying != 'y' && keepPlaying != 'n' )
         {
            System.out.println("Invalid input, please enter (y/n)");
            keepPlaying = keyboard.nextLine().toLowerCase().charAt(0);
         }

      } while (keepPlaying == 'y');

   }
   public static String computerChoice()
   {
      String[] choice = {"rock","paper","scissors"};
      Random rand = new Random();
      int computerChoice = rand.nextInt(3);
      return choice[computerChoice];
   }
   public static String userChoice()
   {
      Scanner keyboard = new Scanner(System.in);
      System.out.print("Enter rock, paper, or scissors: ");
      String choice = keyboard.nextLine();

      isValidChoice(choice);
      return choice;
   }
   public static boolean isValidChoice (String choice)
   {
      Scanner keyboard = new Scanner(System.in);

      while (!(choice.equalsIgnoreCase("rock")) && !(choice.equalsIgnoreCase("paper")) && !(choice.equalsIgnoreCase("scissors")))
    {
       System.out.print("Invalid input, enter rock, paper, or scissors: ");
       choice = keyboard.nextLine();
    }

       return true;
    }
    public static void determineWinner(String computer, String user)
    {
       if (computer.equalsIgnoreCase("rock") && user.equalsIgnoreCase("paper"))
          System.out.println("\n" + "Paper wraps rock.\nThe user wins!");
       else if (computer.equalsIgnoreCase("rock") && user.equalsIgnoreCase("scissors"))
          System.out.println("\n" + "Rock smashes scissors.\nThe computer wins!");
       else if (computer.equalsIgnoreCase("paper") && user.equalsIgnoreCase("rock"))
          System.out.println("\n" + "Paper wraps rock.\nThe computer wins!");
       else if (computer.equalsIgnoreCase("paper") && user.equalsIgnoreCase("scissors"))
          System.out.println("\n" + "Scissors cuts paper.\nThe user wins!");
       else if (computer.equalsIgnoreCase("scissors") && user.equalsIgnoreCase("rock"))
          System.out.println("\n" + "Rock smashes scissors.\nThe user wins!");
       else if (computer.equalsIgnoreCase("scissors") && user.equalsIgnoreCase("paper"))
          System.out.println("\n" + "Scissors cuts paper.\nThe computer wins!");
       else if (computer.equalsIgnoreCase(user))
          System.out.println("\n" + "The game is tied!\nGet ready to play again...");
    }   
}

【问题讨论】:

  • 您似乎认为isValidChoice(choice) 可以修改choice 变量,但它不能。所以userChoice 中的choice 将保持不变,即原来的无效条目。
  • 一个快速风格的评论,你的isValidChoice 方法应该只返回给定的choice 是否有效。它不应该执行任何其他任务(在您的情况下,如果测试失败,您可以从 stdin 获得新结果)。否则,方法的名称与它真正的作用不匹配。为了进一步论证,使用代码返回值isValidChoice 将始终为真,可以忽略。
  • determineWinner 似乎不正确--rock flies right through paper :) :) :)
  • @ajb :是的,您的第二条评论很好地解释了我的想法。我正在学习介绍 Java 编程课程,所以我正在学习。我需要阅读您发布的那篇文章。我会在determineWinner 上重新检查我的逻辑,谢谢你所做的一切:)

标签: java loops while-loop nested-loops


【解决方案1】:

这个问题源于 Java 是按值传递,而不是按引用传递。

换句话说,不是将参数的引用传递给方法,而是传递参数的副本。您的方法更改了副本,但是一旦方法结束,副本就会超出范围并被垃圾回收。

当您将choice 传递给isvalidChoice 时,不会传递对选择本身的引用。制作字符串的副本,然后传递。当您更新变量选择时,它不会更改原始字符串,它会更改系统制作的副本。 This answer explains how it works pretty well.

那你该怎么办?

如果 isValidChoice 不是有效输入,则不要在 isValidChoice 中循环,而是返回 false。

您的isValidChoice 最终应该是这样的:

public static boolean isValidChoice(String choice) {
    return (choice.equalsIgnoreCase("rock")) || (choice.equalsIgnoreCase("paper")) || (choice.equalsIgnoreCase("scissors"));
}

然后在userChoice做这样的事情

Scanner keyboard = new Scanner(System.in);
while(!isValidChoice(choice)) {
    System.out.print("Invalid input, enter rock, paper, or scissors: ");
    choice = keyboard.nextLine();
}

【讨论】:

  • 通俗地说,user变量“指向”user的值,而isValidChoice中的choices变量是一个单独的item,“指向”user的值。当您执行choices = x 时,您只是将choices 变量设置为“指向”另一个值,而单独保留user 变量。
  • @michael :谢谢你的解释。我会仔细阅读您发布的链接。
【解决方案2】:

打包练习程序;

导入 java.util.Random; 导入 java.util.Scanner;

公开课 Rock_Paper_Scissors {

@SuppressWarnings({ "resource" })
public static void main(String[] args) {
    Random rand = new Random();
    Scanner scan = new Scanner (System.in);
    int totalscuser = 0;
    int compans = 0;
    int totalsccpu = 0;
    System.out.println("Rock Paper Scissors!"+"\n"+"Rock:     '0'"+ "\n" +"Paper:    '1'"+"\n"+"Scissors: '2'");
    System.out.println("It's best out of 3!");
    for(int i = 0; i<3; i++){
        compans = rand.nextInt(3);
        compans = rand.nextInt(3);
        int inp = scan.nextInt();
        if(inp == compans){
            System.out.println("Tie");
        }else if((inp-1) == compans){
            if(inp>2){
                System.err.println("Enter a valid input."+"\n"+"CPU Wins because user entered an invalid input.");
                totalsccpu = totalsccpu + 1;
            }else{
                System.out.println("User Wins");
                totalscuser = totalscuser + 1;
            }
        }else if((inp) == compans-1){
            if(inp>2){
                System.err.println("Enter a valid input."+"\n"+"CPU Wins because user entered an invalid input.");
                totalsccpu = totalsccpu + 1;
            }else{
            System.out.println("CPU Wins");
            totalsccpu = totalsccpu + 1;
            }
        }else if((inp-2) == compans){
            if(inp>2){
                System.err.println("Enter a valid input."+"\n"+"CPU Wins because user entered an invalid input.");
                totalsccpu = totalsccpu + 1;
            }else{
            System.out.println("CPU Wins");
            totalsccpu = totalsccpu + 1;
            }
        }else if((inp) == compans-2){
            if(inp>2){
                System.err.println("Enter a valid input."+"\n"+"CPU Wins because user entered an invalid input.");
                totalsccpu = totalsccpu + 1;
            }else{
                System.out.println("User Wins");
                totalscuser = totalscuser + 1;
            }
        }else{
            System.err.println("Enter a valid input."+"\n"+"CPU Wins because  user entered an invalid input.");
            totalsccpu = totalsccpu + 1;
        }
        System.out.println("CPU entered: "+compans);
    }
    if(totalsccpu>totalscuser){
        System.err.println("YOU LOSE! :(");
    }else if(totalsccpu<totalscuser){
        System.err.println("YOU WIN! :]");
    }if(totalsccpu == totalscuser){
        System.err.println("YOU TIED! :|");
    }
}

}

【讨论】:

  • 这可行,但我将输入保留为 int 以使我的算法正常工作
  • 公司:随机电脑答案
  • inp:用户输入
  • totalsccpu:电脑总分
  • totalscuser:用户的总分
【解决方案3】:

这是使用整数的示例,但可以根据您的喜好使用字符串。

当我写 {rock} 时,这意味着它是你的摇滚 int 标识符,或者使用 .equals(在此处插入字符串标识符) 对于字符串,它看起来像 !user.equals("Rock") && !user.equals("Paper") && !user.equals("剪刀")

while(user!= {rock} && user!= {paper} && user!= {scissors})
        { // use while
            System.out.print("Invalid choice! (Choose 1, 2 or 3): ");
            user= keyboard.nextInt(); // or keyboard.next() for any other way string
                if(user==1 || user==2 || user==3) // I used int for example
                    break; // quits the loop if proper identifier entered

            System.out.println();
            // if invalid choice, it will go back to the start of loop
        }

【讨论】:

    猜你喜欢
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 2015-05-16
    • 2017-01-17
    • 2020-05-22
    • 1970-01-01
    相关资源
    最近更新 更多