2013-02-18 48 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

相关问题