如何更改子字符串的值?

时间:2017-05-18 06:17:12

标签: java string replace substring

我正在尝试创建一个经典的hangman程序(GUI很好,没问题),用户一次猜一个字母。问题是,当用户猜到一个字母时,它会用猜到的字母替换“_”的位置(如果字母在单词中),但是当猜到下一个字母时,它会忘记最后一个猜测,并且地方回到“_”。对不起,如果不清楚,这是一个例子

Word is tiger,  
user guesses "g",  
outputs _ _ g _ _,  
user guesses "r",  
outputs _ _ _ _ r.

我希望代码如何工作:

Word is tiger,  
user guesses "g",  
outputs _ _ g _ _,  
user guesses "r",  
outputs _ _ g _ r.

我怎样才能做到这一点?请记住,老虎只是一个例子,单词是从数组中随机抽取的。我认为唯一的方法是在空格中更改子字符串的值,但我不知道如何做到这一点。截至目前,用户猜出GUI窗口中的字母(男人本人所在的位置)并通过按下按钮提交答案。输出现在只在控制台上打印。

这是该计划的麻烦部分:

// guess is the name of JTextPane next to button
// randWord is the word pulled randomly from an array
private void guessLetter() {
    guessedLetter = guess.getText();
    if (randWord.contains(guessedLetter)){
        reveal(); // method below
    } else {
        wrongGuesses++; // when wrongGuesses adds,
        update(); // another body part is added, method not below
    }
}

private void reveal() {
    int start = randWord.indexOf(guessedLetter); //gets the index of the letter guessed
    String print = blanks.substring(0, start) + guessedLetter + blanks.substring(start+1); //reveals the letter
    System.out.println(print);//prints the revealed letter in correct spot
}

3 个答案:

答案 0 :(得分:5)

解决此问题的一种方法是维护一个StringBuilder对象,该对象会在每次猜到一个字母时更新。

String wordToGuess = "tiger";
StringBuilder wordToShow = new StringBuilder();
for (int i=0; i < wordToGuess.length(); ++i) {
    wordToShow.append("_");
}

// update publicly shown string; return true if one or more matches found,
// otherwise return false
public boolean guessLetter(char letter) {
    boolean result = false;
    for (int i=0; i < wordToGuess.length(); ++i) {
        if (wordToGuess.charAt(i) == letter) {
            // reveal the correctly guessed character
            wordToShow.setCharAt(i, letter);
            result = true;
        }
    }

    return result;
}

public String reveal() {
    return wordToShow.toString();
}

答案 1 :(得分:0)

当一个单词多次包含一个字母时,你需要考虑你想要做什么:

guessedSoFar = reveal(guessedSoFar, randWord, guessedLetter);

private String reveal(String guessedSoFar, String randWord, char letter) {

    String newString = "";

    for (int i = 0 ; i < randWord.length(); i++) {
        if (randWord.charAt(i) == letter && guessedSoFar.charAt(i) == '_')
            newString += randWord.charAt(i);
        else 
            newString += guessedSoFar.charAt(i);
    }

    return newString;
}

答案 2 :(得分:0)

您只需创建一个私有变量(我将其命名为currentWord),并将其设置为blanks。然后,您需要对代码进行一些小修改:

public class Hangman extends JFrame {
    private String currentWord;
    //when "blanks" gets assigned a value, make "currentWord" equal to it   
    //... 
    //...
private void guessLetter() {
    guessedLetter = guess.getText();
    if (randWord.contains(guessedLetter)){
        reveal();
    } else {
        wrongGuesses++;
        update();
    }
}

private void reveal() {
    int start = randWord.indexOf(guessedLetter);
    currentWord = currentWord.substring(0, start) + guessedLetter + currentWord.substring(start+1);
    System.out.println(currentWord);
    if (currentWord.equals(randWord)){
        System.out.println("You win!!");
    }
}

这将一次更改currentWord一个字母,直到您用完猜测,或currentWord等于原始单词。这通过一次更改一个子字符串,将currentWord分配给该值来实现。然后打印该单词,随后进行下一次猜测,打印等,直到您输赢为止。