2013-04-12 56 views
0

我几乎完成了一个基本的Hang子手游戏,但是我在课堂上“makeGuess”方法遇到困难。我试图测试用户输入(他们的一个字符猜测)对秘密词,并更新伪装的单词,如果他们的猜测是正确的或不正确的。任何意见或指针在正确的方向将不胜感激。爪哇Hang子手方法错误

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 11 
at java.lang.String.charAt(String.java:686) 
at hangmandemo.Hangman.makeGuess(Hangman.java:42) 
at hangmandemo.HangmanDemo.main(HangmanDemo.java:24) 
Java Result: 1 

这里是刽子手类:我每次运行时我得到这个错误

package hangmandemo; 

public class Hangman { 

private String secretWord; 
private String disguisedWord; 
private int guesses; 
private int wrongGuesses; 
boolean found=false; 

public String getDisguisedWord() { 
    return disguisedWord; 
} 

public String getSecretWord() { 
    return secretWord; 
} 

/** 
* returns number of guesses 
*/ 
public int getGuesses() { 
    return guesses; 
} 

/** 
* continues game until secretWord is found 
*/ 
public boolean isFound() { 
    return found; 
} 

/** 
* brings in a char to test against String 
*/ 
public void makeGuess(char c) { 
    for (int i = 0; i <= disguisedWord.length(); i++) { 

     if (c == secretWord.charAt(i)) { 
      disguisedWord = disguisedWord.substring(0, i-1) + c + disguisedWord.substring(i+1); 

     } 
     if (secretWord.equals(disguisedWord)) { 
      found = true; 
     } 
    } 
    wrongGuesses++; 
} 

/** 
* assigns secret String to secret word 
*/ 
public void createSecretWord(String secret) { 
    secretWord = secret; 
} 

/** 
* disguises secret word with "???" 
*/ 
public void createDisguisedWord() { 

    for (int i = 0; i < secretWord.length(); i++) { 
     disguisedWord += "*"; 
    } 
} 

/** 
* returns number of wrong guesses 
*/ 
public int getWrongGuesses() { 
    return wrongGuesses; 
} 

}

,这是我的演示主类

package hangmandemo; 
import java.util.Scanner; 
public class HangmanDemo { 
public static void main(String[] args) { 
    Scanner keyboard = new Scanner(System.in); 
    Hangman game = new Hangman(); 
    game.createSecretWord("assessments"); 
    game.createDisguisedWord(); 
    System.out.println("This is the hangmandemo. Press the number '3' to quit."); 
    System.out.println("The disguised word is..."+ game.getDisguisedWord()); 
    while (!game.isFound()) { 
     System.out.println("Enter a one character guess"); 
     char c = keyboard.next().charAt(0); 
     if (c == 3) { 
      System.out.println("game over, the word was... " + game.getSecretWord()); 
      System.exit(0); 
     } 
     game.makeGuess(c); 
     System.out.println(game.getDisguisedWord()); 
    } 

    System.out.println("you guessed it, the word was... " + game.getSecretWord()); 
    System.out.println("you had " + game.getGuesses() + " guesses."); 
    System.out.println("you had " + game.getWrongGuesses() + " wrong guesses."); 
} 

}

+3

你是否理解了'Hangman.java:42'中的[StringIndexOutOfBoundsException](http://docs.oracle.com/javase/7/docs/api/java/lang/StringIndexOutOfBoundsException.html)? – Kai

+2

'我<=伪装的词。length();'应该是<不是<=? – adchilds

+0

@bytebybyte这是“offtopic”,但看看'createDisguisedWord()'方法。如果调用两次,它会将''Cat''生成为'“******”'而不是''***'',您应该将'disguisedWord'重新初始化为'''''。另外请注意你的评论,说'伪装秘密词与“???”,这是错误的,因为你使用'*';) – Goodwine

回答

1

there ar这里有3个问题。

在循环

for (int i = 0; i <= disguisedWord.length(); i++) 

disguisedWord的最后一个元素是在,`disguisedWord [disguisedWord.length -1],因为阵列索引从0开始。

这是习惯格式你喜欢的循环

for (int i = 0; i < disguisedWord.length(); i++) 

但即使这样还不够,因为

disguisedWord.substring(i+1) 

会在该点出界。

和表达

disguisedWord.substring(0, i-1) 

将抛出异常当i = 0;


您需要密切关注您的边缘条件。

+0

谢谢。我仍然试图找出如何用正确的猜测填写新的伪装词。 – bytebybyte

0
int i = 0; i <= disguisedWord.length(); i++ 

这条线,你必须改变<=只需一个<否则你将访问在任何字符串的长度比最大指数1时的指数由于该字符串的索引开始在第0和长度为简单的字符的总数目

0

替换for (int i = 0; i <= disguisedWord.length(); i++)

for (int i = 0; i < disguisedWord.length(); i++)

寄托都是0为基础的索引在JAVA:​​有焦炭'a'1'c'2索引0'b',而其长度是3