2013-05-26 37 views
1

我的代碼有recursion-execute()再次調用等()等。我想在main()或execute()中使用do/while循環來消除此問題,但如果我這樣做,詢問用戶是否想再次播放的字符串將超出範圍。我無法在循環之前或之後使用console2,因此在開始時詢問他們是否想再次玩。 隨意指出我的初學者代碼有任何缺陷,因爲可能有很多。謝謝。消除我的代碼中的遞歸

這裏是到目前爲止,我的代碼遞歸:

import java.util.*; 
import java.awt.*; 
import java.io.*; 


public class RockPaperScissors { 


    public static int count = 0; 

    public static void main(String[] args) { 

      execute(); 
    } 


    public static void execute(){  

     System.out.println("This program will allow you to play \n\"Rock, Paper, Scissors\" against a computer."); 
     System.out.println(); 
     System.out.println("Enter 'r' for Rock, 'p' for Paper, or s for Scissors."); 
     System.out.println("Enter 'w' to have an insta-win for that round. Enter '-1' at anytime to exit program."); 

     String info = userInput(); 
     int value = guessCode(); 
     decideOutcome(value, info); 
     again(); 
     } 


     public static String userInput() { 
     Scanner console = new Scanner (System.in); 
     String s = console.next(); 
     return s; 
    } 

     public static int guessCode() { 
     Random r = new Random(); 
     return (r.nextInt(3)+1); // Random integer between 1 and 3; 
    } 

    public static void decideOutcome(int i, String j) { 

     try { 
      PrintStream output = new PrintStream(new FileOutputStream("records.txt", true)); 

      if (j.equalsIgnoreCase("rock")|| j.equalsIgnoreCase("r")) { 
       count++; 
       switch (i){ 
        case 1: 
         System.out.println("You've won! Computer picked scissors."); 
         output.println(count + " Win "); 
         break; 
        case 2: 
         System.out.println("You've tied.... Computer also picked rock."); 
         output.println(count + " Tie "); 
         break; 
        case 3: 
         System.out.println("You've lost. Computer picked paper."); 
         output.println(count + " Loss "); 
         break; 
        }   
      } else if (j.equalsIgnoreCase("paper")|| j.equalsIgnoreCase("p")) { 
       count++; 
       switch (i){ 
        case 1: 
         System.out.println("You've lost; Computer picked scissors."); 
         output.println(count + " Loss "); 
         break; 
        case 2: 
         System.out.println("You've won! Computer picked rock."); 
         output.println(count + " Win "); 
         break; 
        case 3: 
         System.out.println("You've tied.... Computer also picked paper."); 
         output.println(count + " Tie "); 
         break; 
        } 
      } else if (j.equalsIgnoreCase("scissors")|| j.equalsIgnoreCase("s")) { 
       count++; 
       switch (i){ 
        case 1: 
         System.out.println("You've tied.... Computer picked scissors."); 
         output.println(count + " Tie "); 
         break; 
        case 2: 
         System.out.println("You've lost; Computer picked rock."); 
         output.println(count + " Loss "); 
         break; 
        case 3: 
         System.out.println("You've won! Computer also picked paper."); 
         output.println(count + " Win "); 
         break; 
        } 
      } else if (j.equalsIgnoreCase("w")) { 
       count++; 
       System.out.println("You've effortlessly defeated the computer!"); 
       output.println(count + " Win "); 
      } else if (j.equals("-1")) { 
       System.out.println("Thanks for playing!"); // need to find way to reach end. 

       if (count == 1) { // If the user terminates after the first match. 
        System.out.println("You've played a single match.");   
       } else if (count > 1) { // Anything more than 1 match played upon termination. 
        System.out.println("You've played " + count + " matches total."); 
       } else { // This is for exceptions when user inputs gibberish for their sign and then 'no' for the second input. 
        System.out.println("No matches were played."); 
      }   
       System.out.println("Good Bye!"); 
       System.exit(0); 
      } else { 
       System.out.println("You didn't input the right thing."); 
      } 
     } catch (FileNotFoundException e) { 
       System.out.println("File was not found; try again"); 
     } 
    } 

    public static void again() { 
      System.out.println("Do you want to play again? (Type in 'y' for Yes or 'n' for No.)"); 

      Scanner console2 = new Scanner (System.in); 

      String t = console2.next(); 

      while (t.equalsIgnoreCase("yes")||t.equalsIgnoreCase("y")) { 
       System.out.println(); 
       System.out.println(); 
       execute(); // 
      } 
      if (t.equalsIgnoreCase("no") || t.equalsIgnoreCase("n") || t.equals("-1")) { 
       System.out.println("Hope you had fun! I'm sure I've had just as much fun with making this program! Good Bye!");   

       if (count == 1) { // If the user terminates after the first match. 
         System.out.println("You've played a single match.");   
       } else if (count > 1) { // Anything more than 1 match played upon termination. 
         System.out.println("You've played " + count + " matches total."); 
       } else { // This is for exceptions when user inputs gibberish for their sign and then 'no' for the second input. 
         System.out.println("No matches were played.");    
       } 
       System.exit(0); 

      } else { // If the user doesn't input 'yes' or 'no.' 
       System.out.println("Not the proper response, but it's assumed that you don't want to continue."); 
       if (count == 1) { // If the user terminates after the first match. 
        System.out.println("You've completed a single match."); 
       } else if (count >= 2) { // Anything more than 1 match played upon termination. 
        System.out.println("You've completed " + count + " matches total."); 
       } else { // The user haphazardly messes up both inputs. 
        System.out.println("No matches were finished."); 
       } 
       System.exit(0); 
      } 
     } 
} 

回答

0

您可以創建一個新的布爾變量keepPlaying,它初始化爲true,然後一旦玩家希望退出遊戲,它設置爲false。

然後在主方法說:

public static void main(String[] args) { 

System.out.println("This program will allow you to play \n\"Rock, Paper, Scissors\" against a computer."); 
    System.out.println(); 
    System.out.println("Enter 'r' for Rock, 'p' for Paper, or s for Scissors."); 
    System.out.println("Enter 'w' to have an insta-win for that round. Enter '-1' at anytime to exit program."); 

    while (keepPlaying == true) { 
     again(); 
    } 
} 

代替輸入代碼到again()方法的開始。

private static void again() { // Maybe rename to play()? 
    String info = userInput(); 
    int value = guessCode(); 
    decideOutcome(value, info); 
    ..... 
} 

然後您不需要​​。如另一個答案所建議的,方法和變量只應該被公開,除非另一個類需要它們。

0

在主要方法execute中做一個簡單的修改,並在again(它可能是一個簡單的布爾值)的結果中測試,以確定用戶是否想要繼續。

順便說一句,在我看來execute應該是唯一的公共方法,沒有理由擁有一切public staticcount只是private的候選人。否則,例如,重新訪問該類不會確保其初始值爲0。

0

這是您的代碼的修改版本。有幾個重複的代碼行可以重新用於diff條件。已修改它們。將它與您的代碼進行比較以檢查已更改的內容。希望能幫助到你。

import java.util.*; 
import java.awt.*; 
import java.io.*; 

public class Test { 

public static int count = 0; 
private static Scanner console; 

public static void main(String[] args) { 
    console = new Scanner(System.in); 
    execute(); 
} 

public static void execute() { 
    String info = null; 
    boolean accept; 
    do { 
     System.out 
       .println("This program will allow you to play \n\"Rock, Paper, Scissors\" against a computer."); 
     System.out.println(); 
     System.out 
       .println("Enter 'r' for Rock, 'p' for Paper, or s for Scissors."); 
     System.out 
       .println("Enter 'w' to have an insta-win for that round. Enter '-1' at anytime to exit program."); 

     info = userInput(); 
     int value = guessCode(); 
     decideOutcome(value, info); 
     accept = again(); 
    } while (!info.equalsIgnoreCase("-1") && accept); 
} 

public static String userInput() { 
    String s = console.next(); 
    return s; 
} 

public static int guessCode() { 
    Random r = new Random(); 
    return (r.nextInt(3) + 1); // Random integer between 1 and 3; 
} 

public static void decideOutcome(int i, String j) { 
    try { 
     PrintStream output = new PrintStream(new FileOutputStream(
       "records.txt", true)); 
     if (j.equalsIgnoreCase("w")) { 
      count++; 
      System.out 
        .println("You've effortlessly defeated the computer!"); 
      output.println(count + " Win "); 
     } else if (j.equals("-1")) { 
      System.out.println("Thanks for playing!"); // need to find way 
                 // to reach end. 

      if (count == 1) { // If the user terminates after the first 
           // match. 
       System.out.println("You've played a single match."); 
      } else if (count > 1) { // Anything more than 1 match played 
            // upon termination. 
       System.out.println("You've played " + count 
         + " matches total."); 
      } else { // This is for exceptions when user inputs gibberish 
         // for their sign and then 'no' for the second 
         // input. 
       System.out.println("No matches were played."); 
      } 
      System.out.println("Good Bye!"); 
      System.exit(0); 
     } else if (j.equalsIgnoreCase("rock") || j.equalsIgnoreCase("r") 
       || j.equalsIgnoreCase("paper") || j.equalsIgnoreCase("p") 
       || j.equalsIgnoreCase("scissors") 
       || j.equalsIgnoreCase("s")) { 
      count++; 
      switch (i) { 
      case 1: 
       if (j.equalsIgnoreCase("rock") || j.equalsIgnoreCase("r")) { 
        System.out 
          .println("You've won! Computer picked scissors."); 
        output.println(count + " Win "); 
       } 
       if (j.equalsIgnoreCase("paper") || j.equalsIgnoreCase("p")) { 
        System.out 
          .println("You've lost; Computer picked scissors."); 
        output.println(count + " Loss "); 
       } 
       if (j.equalsIgnoreCase("scissors") 
         || j.equalsIgnoreCase("s")) { 
        System.out 
          .println("You've tied.... Computer also picked scissors."); 
        output.println(count + " Tie "); 
       } 

       break; 
      case 2: 
       if (j.equalsIgnoreCase("rock") || j.equalsIgnoreCase("r")) { 
        System.out 
          .println("You've tied.... Computer also picked rock."); 
        output.println(count + " Tie "); 
       } 
       if (j.equalsIgnoreCase("paper") || j.equalsIgnoreCase("p")) { 
        System.out.println("You've won! Computer picked rock."); 
        output.println(count + " Win "); 
       } 
       if (j.equalsIgnoreCase("scissors") 
         || j.equalsIgnoreCase("s")) { 
        System.out 
          .println("You've lost; Computer picked rock."); 
        output.println(count + " Loss "); 
       } 
       break; 
      case 3: 
       if (j.equalsIgnoreCase("rock") || j.equalsIgnoreCase("r")) { 
        System.out 
          .println("You've lost. Computer picked paper."); 
        output.println(count + " Loss "); 
       } 
       if (j.equalsIgnoreCase("paper") || j.equalsIgnoreCase("p")) { 
        System.out 
          .println("You've tied.... Computer also picked paper."); 
        output.println(count + " Tie "); 
       } 
       if (j.equalsIgnoreCase("scissors") 
         || j.equalsIgnoreCase("s")) { 
        System.out 
          .println("You've won! Computer picked paper."); 
        output.println(count + " Win "); 
        break; 
       } 
      } 
     } else { 
      System.out.println("You didn't input the right thing."); 
     } 
    } catch (FileNotFoundException e) { 
     System.out.println("File was not found; try again"); 
    } 
} 

public static boolean again() { 
    System.out 
      .println("Do you want to play again? (Type in 'y' for Yes or 'n' for No.)"); 
    String t = console.next(); 
    if (t.equalsIgnoreCase("yes") || t.equalsIgnoreCase("y")) { 
     System.out.println(); 
     System.out.println(); 
     return true; //w 
    } else { 
     if (t.equalsIgnoreCase("no") || t.equalsIgnoreCase("n") 
       || t.equals("-1")) { 
      System.out 
        .println("Hope you had fun! I'm sure I've had just as much fun with making this program! Good Bye!"); 
     } else { 
      System.out 
        .println("Not the proper response, but it's assumed that you don't want to continue."); 
     } 
     if (count == 1) { // If the user terminates after the first match. 
      System.out.println("You've played a single match."); 
     } else if (count > 1) { // Anything more than 1 match played upon 
           // termination. 
      System.out 
        .println("You've played " + count + " matches total."); 
     } else { // This is for exceptions when user inputs gibberish for 
        // their sign and then 'no' for the second input. 
      System.out.println("No matches were played."); 
     } 
     return false; 
    } 
} 
}