2017-05-05 221 views
1

我正在用java編寫一個「Hangman」遊戲,而且我偶然發現了一個問題。在不同位置替換字符串中的多個字符

static String word = JOptionPane.showInputDialog(null, "Enter word"); 
static String star = ""; 
public static Integer word_length = word.length(); 
public static Integer nrOfAttempts = 12; 
public static Integer remainingAttempt = nrOfAttempts; 

public static void main(String[] args) { 
    // String görs med lika många stjärnor som ordet har tecken 
    for (int i = 0; i < word.length(); i++) { 
     star += "_"; 
    } 
    attempt(); 
} 

public static void attempt(){ 

    for(int o = 0; o < nrOfAttempts; o++) { 
     String attempt = JOptionPane.showInputDialog(null, "Enter first attempt"); 

     if (attempt.length() > 1) { 
      JOptionPane.showMessageDialog(null, "Length of attempt can only be one character long"); 
      attempt(); 

     } else { 

      if (word.contains(attempt)) { 
       int attemptIndex = word.indexOf(attempt); 
       star = star.substring(0,attemptIndex) + attempt + star.substring(attemptIndex+1); 


       JOptionPane.showMessageDialog(null, "Hit!\nThe word is now:\n"+star); 
       nrOfAttempts++; 

       if (star.equals(word)) { 
        JOptionPane.showMessageDialog(null, "You've won!"); 
        System.exit(0); 
       } 
      } else { 
       remainingAttempt--; 
       JOptionPane.showMessageDialog(null, "Character not present in chosen word\nRemaining Attempts: "+remainingAttempt); 
      } 
     } 
    } 
    JOptionPane.showMessageDialog(null, "Loser!"); 
} 

當我想要替換在特定的地方,特定字符的「明星」的字符串(包括下劃線的字),只替換匹配的第一個字符。一遍又一遍,這樣就不可能取勝。

因此,諸如「馬鈴薯」和「酷」等詞語不起作用。

我想要它做的是取代所有匹配的字母,而不僅僅是它看到的第一個。有沒有可能做到這一點,而不創建一個數組?

回答

1

這裏是你會怎麼做信更換你的情況整個字符串:

int attemptIndex = word.indexOf(attempt); 
while (attemptIndex != -1) { 
    star = star.substring(0, attemptIndex) + attempt + star.substring(attemptIndex + 1); 
    attemptIndex = word.indexOf(attempt, attemptIndex + 1); 
} 

indexOf指數的第二個版本,開始從提供搜索。這是一個+1來避免再次找到同一封信。文檔indexOf

請注意,使用字符數組StringBuilder可能是一個更有效的解決方案,因爲它可以避免創建許多臨時字符串。

0

要替換所有匹配的字母一步一步,你可以使用正則表達式replaceAll(String regex, String replacement)String doc
例子:

String word = "potato"; 
String start = "______"; 
String attempt = "o"; 

start = word.replaceAll("[^"+attempt+"]", "_"); 
// start = "_o___o"; 

attempt += "t"; 
start = word.replaceAll("[^"+attempt+"]", "_"); 
// start = "_ot_to"; 

attempt += "p"; 
start = word.replaceAll("[^"+attempt+"]", "_"); 
// start = "pot_to"; 

attempt += "a"; 
start = word.replaceAll("[^"+attempt+"]", "_"); 
// start = "potato"; -> win 
+0

的事情是,我想這個詞來替換字符,其中僅下劃線。要做到這一點,我必須使用索引(我認爲) – tTim

+0

下劃線是一個字符,所以你可以例如'''替換(嘗試,'_')''' –

+0

是的,但然後所有的下劃線將成爲一個權利?在我的情況下,它會'替換(嘗試,'_')' – tTim

相關問題