1

我几乎完成了一个基本的刽子手游戏,但我在课堂上使用“makeGuess”方法时遇到了困难。我正在尝试针对秘密单词测试用户输入(他们的一个字符猜测),并在他们的猜测正确或不正确时更新伪装的单词。任何正确方向的建议或指示将不胜感激。每次运行时我都会收到此错误:

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

}

4

3 回答 3

2

这里有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 时会抛出异常;


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

于 2013-04-12T14:47:04.467 回答
0
int i = 0; i <= disguisedWord.length(); i++

这一行,您必须将<=简单地更改为 a ,<否则您将以比最大索引大 1 的字符串长度访问索引,因为字符串索引从 0 开始并且长度只是总长度字符数

于 2013-04-12T14:48:03.193 回答
0

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

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

Everthing在 JAVA 中是从 0 开始索引的:"abc"char'a'位于 index 0'b'at1'c'at 2,而其长度为3.

于 2013-04-12T14:48:27.737 回答