【问题标题】:How to change the value of a substring?如何更改子字符串的值?
【发布时间】:2017-05-18 06:17:12
【问题描述】:

我正在尝试制作一个经典的刽子手程序(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.

我怎样才能做到这一点?请记住,tiger 只是一个示例单词,单词是从数组中随机抽取的。我认为这样做的唯一方法是将子字符串的值更改为空白,但我不知道该怎么做。截至目前,用户从 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
}

【问题讨论】:

  • 已将guessedLetters 保存在空白处?
  • 您应该尝试缩小您的问题范围。我认为一个完整的解决方案至少需要 50-100 行 Java 代码,这对于单个答案来说有点过于宽泛。
  • @d9ngle 差不多。如果正确,我希望blanks 的子字符串保存guessedLetter 的值。看看我在帖子中的例子:)
  • @TimBiegeleisen 我只是想问是否有办法改变子字符串的值。那不应该只需要几行吗?
  • 我已经知道reveal()方法的第3行需要改,但不知道改成什么。

标签: java string replace substring


【解决方案1】:

解决此问题的一种方法是维护一个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();
}

【讨论】:

  • 这是有道理的,但是在我的程序中要做很多改变。有没有类似的方法可以在不使用 char 的情况下做到这一点?我宁愿坚持使用字符串,但如果我不能,那也没关系。快速,有用的答案。 :)
  • 如果您的用户真的一次输入一个字符,那么char 是最适合在这里使用的原始类型。我的方法的不同之处在于 reveal() 方法现在已简化为基本上只返回一个字符串;每次用户进行猜测时,都会发生真正的逻辑。您可以随意使用。
  • 但是在这种情况下,您的变量wordToShow 就像我的变量blanks,它包含许多下划线(与单词的长度一样多)。如果wordToShow 是一个字符串,这是否会使wordToShow.setCharAt(i, letter); 成为不可能?这听起来很愚蠢,但是一个字符可以像字符串一样容纳超过 1 个字符吗?
  • Java 中的字符串是不可变的,这意味着一旦创建它们,就无法更改它们(有点像 SAT 分数)。使用StringBuilder 将下划线翻转为每个成功猜测的字符。
  • 抱歉,你说的翻转下划线是什么意思?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您可以简单地创建一个私有变量(我将我的命名为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 分配给该值来工作。然后这个词被打印出来,随着下一次猜测而改变,打印等等,直到你赢或输。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多