2013-02-18 80 views
0

所以我試圖做一個簡單的遊戲,如財富之輪/ Hang子手。用戶輸入1輸入一個字母,2輸入解決方法,3輸入退出。當我輸入字母時,出現錯誤:爲什麼我的課程不會調用其他方法?

Enter your choice: 
(1) to guess a letter 
(2) to solve the puzzle 
(3) to quit 
1 
Please enter your letter 
b 
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 8 
    at java.lang.AbstractStringBuilder.charAt(Unknown Source) 
    at java.lang.StringBuilder.charAt(Unknown Source) 
    at Puzzle.<init>(Puzzle.java:68) 
    at PuzzleTester.main(PuzzleTester.java:50) 

當我輸入解決方案時出現同樣的錯誤。 退出選項正常工作。那麼這些錯誤怎麼了?

Puzzle.java:

/** 
* A puzzle is used to represent a word puzzle. A puzzle contains a solution 
* and the current state of the puzzle. The current state of the puzzle is 
* represented with a hyphen for each letter in the puzzle that has not yet been 
* guessed. For example if a puzzle is created like this: 
* 
* Puzzle puzzle = new Puzzle("BIG JAVA"); 
* 
* a call to puzzle.getPuzzle() should return: --- ---- 
* 
* Notice that all letters in the solution were replaced with hyphens but the 
* space character remained in place. 
* 
* A call to puzzle.guessLetter('b') should return 1 and a subsequent 
* call to puzzle.getPuzzle() should return: B-- ---- 
* 
* Calling puzzle.guessLetter('b') a second time should return 0 since the 
* letter B has already been guessed and should leave the puzzle unchanged. 
* 
* <p/> 
* Bugs: (List any known issues or unimplemented features here) 
* 
* @author (Insert your first and last name) 
* 
*/ 
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); 
      } 

      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"); 
      } 


    } 

} 
+3

你可以張貼實際的代碼? – 2013-02-18 21:11:13

+0

是的,您需要使用代碼才能獲得最基本和最抽象的幫助。 – Xyene 2013-02-18 21:11:59

+0

沒有代碼就沒有辦法給你任何有意義的答案。 – 2013-02-18 21:12:42

回答

3

的在您的Puzzle類的構造函數循環是罪魁禍首:

for(int count=0; count<=length; count++) 

你的條件應該是<而不是<=。由於您的索引開始於0,因此您可以訪問的字符串的最後一個索引是string.length() - 1。因此,你不應該重複,直到length,但只有值1 less than length

因此,將其更改爲:

for(int count=0; count < length; count++) 

同樣是在guessLetter方法的情況下:

for(int seq=0; seq<=k; seq++) // Change here too 

此外,在您的guessLetter方法而已,我不明白是什麼您正試圖在您的for statement

solution.equalsIgnoreCase(solution); 

您沒有將該值分配給任何變量,也沒有在任何地方使用它。就目前而言,上述比較沒有用處。

+0

你太快了! :) – 2013-02-18 21:17:07

+0

'guessLetter(char letter)'中的'for(int seq = 0; seq <= k; seq ++)' – Shivam 2013-02-18 21:17:36

+0

解釋爲什麼使用<<'而不是'<=',並且您有最佳答案所有。 – 2013-02-18 21:18:49

1

你循環

for(int count=0; count<=length; count++) 

應該

for(int count=0; count<length; count++) 
相關問題