1

私はしばらくの間このトピックを調査しましたが、あまり成功していません。私は StringBuilder を見つけましたが、それは驚異的に機能しますが、それは私が得た限りです。以下は、ハングマンプログラムを正常に動作させる方法です。

  if(strGuess.equalsIgnoreCase("t")){
        mainword.replace(0,1,"T");
        gletters.append('T');      
    }
        else if(strGuess.equalsIgnoreCase("e")){
        mainword.replace(1,2,"E");
        gletters.append('E');       
    }
        else if(strGuess.equalsIgnoreCase("c")){
        mainword.replace(2,3,"C");
        gletters.append('C');         
    }
        else if(strGuess.equalsIgnoreCase("h")){
        mainword.replace(3,4,"H");
        gletters.append('H');      
    }
        else if(strGuess.equalsIgnoreCase("n")){
        mainword.replace(4,5,"N");
        gletters.append('N');      
    }
        else if(strGuess.equalsIgnoreCase("o")){
        mainword.replace(5,6,"O");
        mainword.replace(7,8,"O");
        gletters.append('O');       
    }
        else if(strGuess.equalsIgnoreCase("l")){
        mainword.replace(6,7,"L");
        gletters.append('L');       
    }
         else if(strGuess.equalsIgnoreCase("g")){
        mainword.replace(8,9,"G");
        gletters.append('G');      
    }
        else if(strGuess.equalsIgnoreCase("y")){
        mainword.replace(9,10,"Y");
        gletters.append('Y'); 
    }
        else{
        JOptionPane.showMessageDialog(null, "Sorry, that wasn't in the word!");
        errors++;
        gletters.append(strGuess.toUpperCase());
    }
        SetMain = mainword.toString();
        GuessedLetters = gletters.toString();
        WordLabel.setText(SetMain);
        GuessedLabel.setText(GuessedLetters);
        GuessText.setText(null);
        GuessText.requestFocusInWindow();

ただし、すべての単語のすべての文字に対してこれを行うことはできません。これを行う簡単で効率的な方法はありますか? 私が欲しいのは、何らかの単語に対して一度だけ使用する必要があるように、ある種のループを持つことです。したがって、単語はテクノロジー (上記のように)、アップル、ピクルス、クリスマス、ハローなど、何でもかまいません。

for ループを使用してみましたが、答えはそこにあると感じています。そして、誰かが charAt() メソッドとそれをどこでどのように使用するかを説明できれば、それは良いことです. より効率的になるために私が得た最も近いものは次のとおりです。

for(i = 0; i < GuessWord.length(); i++) { 
    if (GuessWord.charAt(i) == guess2) { 
        mainword.replace(i,i,strGuess.toUpperCase()); 
    }

それで、それをベースとして使用して、それを修正するように変更できるとしたら? または、私が考えていないことを教えてください。

4

1 に答える 1

3

いい質問です。明らかに繰り返されているコードがあるので、それらすべてを再利用可能なものに置き換えるにはどうすればよいでしょうか。実際、すべてのコードを省くことができます。

そのコード ブロック全体を 1 行で置き換えることができます (すべての単語で機能します)。

String word = "TECHNOLOGY"; // This is the word the user must guess
mainword = word.replaceAll("[^" + gletters + "]", "_");

これはreplaceAll()、「まだ推測されていない任意の文字」を意味する正規表現で使用され、アンダースコア文字に置き換えられます"_"。Stringは不変であり、replaceAll()メソッドは変更された String を返すことに注意してください。呼び出された String は変更されません。

実際の動作を示すテスト コードを次に示します。

public static void main(String[] args) {
    String word = "TECHNOLOGY"; // what the user must guess
    StringBuilder gletters = new StringBuilder("GOTCHA"); // letters guessed
    String mainword = word.replaceAll("[^" + gletters + "]", "_");
    System.out.println(mainword);
}

出力:

T_CH_O_OG_
于 2012-11-06T18:07:46.897 に答える