2017-05-05 10 views
1

現在imは「Hangman」ゲームをJavaで作成していますが、問題が発生しました。文字列の複数の文字を異なる位置に置き換えます

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

私は「スター」の文字列(アンダースコアからなる単語)に特定の場所で特定の文字を置換したい場合には、それが唯一の一致する最初の文字を置き換えます。何度も繰り返し、勝つことは不可能です。

"potato"や "cool"のような単語は機能しません。

私がしたいのは、それが見ている最初のものだけでなく、すべての一致する文字を置き換えることです。配列を作成せずにこれを行うことは可能ですか?

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

あなたは文字列全体のためにあなたのケースで手紙の交換を行うだろう方法です。そして、それは同じ文字を再び見つけることを避けるための+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

アンダースコアはcharですので、例えば '' 'replace(attempt、 '_')' '' –

+0

ええ、その後は全てのアンダースコアが正しいものになります?私の場合、 'replace(attempt、 '_')' – tTim

関連する問題