首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何实现石头剪刀布的Java游戏?

如何实现石头剪刀布的Java游戏?
EN

Stack Overflow用户
提问于 2018-10-29 00:58:26
回答 2查看 0关注 0票数 0

我的任务是编写一个程序,让用户可以在计算机上玩Rock,Paper,Scissors游戏。

说明:

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

情况:

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

结果:

代码语言:javascript
复制
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”无效。因此程序无法显示谁获胜。

我需要你的帮助。 我希望我的程序运行如下: 当用户输入多个无效输入时,但一旦输入有效输入,我的程序仍应能够显示用户的有效输入并显示获胜者。

代码语言:javascript
复制
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...");
    }   
}
EN

回答 2

Stack Overflow用户

发布于 2018-10-29 09:46:09

问题源于Java通过值传递,而不是通过引用传递。

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

当你通过choice进入isvalidChoice,提及的选择本身没有通过。制作字符串的副本然后传递。更新变量选项时,它不会更改原始字符串,而是更改系统所创建的副本。这个答案解释了它如何运作得很好。

那你该怎么办?

如果它不是有效输入,isValidChoiceisValidChoice返回false 而不是循环。

isValidChoice应该看起来像这样:

代码语言:javascript
复制
public static boolean isValidChoice(String choice) {
    return (choice.equalsIgnoreCase("rock")) || (choice.equalsIgnoreCase("paper")) || (choice.equalsIgnoreCase("scissors"));
}

然后做这样的事情 userChoice

代码语言:javascript
复制
Scanner keyboard = new Scanner(System.in);
while(!isValidChoice(choice)) {
    System.out.print("Invalid input, enter rock, paper, or scissors: ");
    choice = keyboard.nextLine();
}
票数 0
EN

Stack Overflow用户

发布于 2018-10-29 10:07:11

包装实践程序;

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

公共类Rock_Paper_Scissors {

代码语言:javascript
复制
@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! :|");
    }
}

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100008920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档