2013-02-18 16 views
0

所以我玩的命運之輪/ hang子手,我已經將解決​​方案的字母轉換爲「 - 」來隱藏解決方案。現在我試圖在用戶正確猜測它們之後將它們轉換回字母。但是,當輸入正確的字母時,僅打印「 - 」。這裏是我的代碼: Puzzle.java:爲什麼不把「 - 」改回字母?

public class Puzzle 
{ 
    /** The solution is the complete word or phrase that is to be guessed */ 
    private String solution="BIG JAVA"; 


    /** 
    * The puzzle is the word or phrase that is to be guessed with hyphens for 
    * all unguessed letters. Initially the puzzle should include all hyphens 
    * for all letters in the solution. As the user guesses a letter the hyphens 
    * for that letter are replaced with the letter. 
    */ 
    private StringBuilder puzzle; 


    /** 
    * Constructs a new Puzzle object with the given puzzle solution. Puzzles 
    * can contain any character and should be case insensitive. This 
    * constructor should set the current state of the puzzle so the all letters 
    * in the puzzle are set to a hyphen. All non letter values should be left 
    * unchanged in the puzzle. The puzzle should be set to the solution passed 
    * in. 
    * 
    * @param solution the solution to the puzzle 
    */ 
    public Puzzle(String Solution) 
    { 
     puzzle=new StringBuilder(this.solution); 
     int length= this.solution.length(); 
     for(int count=0; count<length; count++) 
     { 
      if (Character.isLetter(puzzle.charAt(count))) 
      { 
       puzzle.setCharAt(count, '-'); 
      } 
     } 



    } 


    /** 
    * The guessLetter method is used to determine how many times the letter 
    * that is passed in occurs in the puzzle. If the letter has already been 
    * guessed previously, this method should return zero. This method should be 
    * case insensitive. In other words 'H' is the same as 'h'. After a call to 
    * to this method the puzzle should be updated to remove the hyphen from 
    * the location in the puzzle for each occurrence of the letter. 
    * 
    * @param letter 
    *   the letter that the user is guessing 
    * @return the number of times the letter occurs in the solution only if the 
    *   letter has not already been guessed. If the letter has been 
    *   previously guessed this method should return 0. 
    */ 
    public int guessLetter(char letter) 
    { 
     int count = 0; 
     int k=this.solution.length(); 
     solution.equalsIgnoreCase(solution); 
     for(int seq=0; seq<k; seq++) 
     { 
      if(solution.charAt(seq)==letter) 
      { 
       count++;     
       puzzle.setCharAt(seq, letter); 

      } 
     } 

     return count; 
    } 

    /** 
    * 
    * The getPuzzle method should return the current state of the puzzle. The 
    * puzzle should include a hyphen for any letters that have not been guessed. 
    * 
    * @return the current state of the puzzle 
    */ 
    public String getPuzzle() 
    { 
     String str=new String(puzzle); 


     return str; 
    } 

    /** 
    * The solvePuzzle method is used to verify that a solution passed in 
    * matches the solution to this puzzle. The check for matching solutions 
    * should be case insensitive. 
    * 
    * @param solution 
    * @return true if the solution passed in matches the solution for the 
    *   puzzle 
    */ 
    public boolean solvePuzzle(String solution) 
    { 
     if(this.solution==solution) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 

     } 

    } 

} 

PuzzleTester.java:

import java.util.Scanner; 
public class PuzzleTester 
{ 

    /** 
    * (Insert a brief description that describes the purpose of this method) 
    * 
    * @param args 
    */ 
    public static void main(String[] args) 
    { 
     String str=""; 

     Scanner input= new Scanner(System.in); 


     System.out.println("Enter your choice: "); 
     System.out.println("(1) to guess a letter"); 
     System.out.println("(2) to solve the puzzle"); 
     System.out.println("(3) to quit"); 
     int choice=input.nextInt(); 

     while(choice!=3) 
     {   
      if(choice==1) 
      { 
       System.out.println("Please enter your letter"); 
       str=input.next(); 

       char letter=str.charAt(0); 
       Puzzle game=new Puzzle(str); 
       game.guessLetter(letter); 

       System.out.print(game.getPuzzle()); 
      } 

      if(choice==2) 
      { 
       System.out.println("Please solve the puzzle"); 
       input.nextLine(); 
       String solution=input.next(); 
       Puzzle game=new Puzzle(solution); 
       game.solvePuzzle(solution); 
      } 


     } 

     if(choice==3) 
      { 
       System.out.println("Good Bye"); 
      } 


    } 

} 

我真的認爲,在嵌套添加puzzle.setCharAt(seq, letter);如果在聲明中對guessLetter方法下的循環會改變「 - 「回信。我的代碼錯了,還是有更好的方法?

+1

我覺得'solution.equalsIgnoreCase(解決方案)'並不完全符合你的想法。它所做的一切就是將「解決方案」與自己進行比較,以不區分大小寫的方式進行,這顯然總是會返回真實的!該方法不會更改'solution'字符串,因爲字符串在Java中是不可變的。見http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String) – andersschuller 2013-02-18 22:00:18

回答

0

你不能比較字符串這樣的:

if (this.solution==solution) 

解決方案是從來沒有在構造函數中使用:

public Puzzle(String Solution) 

你的遊戲目標是在每一步復位。您必須創建一次。

+0

好吧,所以我改變了'if(this.solution.equalsIgnoreCase(solution ))來解決這個問題。但我不明白的是我的puzzel對象每次都被重置。我只需要在條件下取出'String Solution'? – SkyVar 2013-02-18 22:11:54

+0

如果我確實瞭解了拼圖的條件,那麼在益智類中,「益智遊戲=新拼圖(str)」變得未定義。 – SkyVar 2013-02-18 22:15:10

+0

我的意思是:每當用戶做出選擇時,都會創建一個新的益智遊戲。你應該在while循環之外定義「遊戲」變量 – 2013-02-18 22:17:11

相關問題