0

私はこの機能を持っています:

function CreateHiddenWord() {
    var wordsTable = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
    var Hiddenletter = wordsTable[Math.floor((Math.random() * 26) + 1)];
    return Hiddenletter;
}
var WordToGuess += CreateHiddenWord();

重複した文字があるかどうかを確認するにはどうすればよいですか。重複しWordToGuessている場合は、もう一度呼び出しますCreateHiddenWord

4

3 に答える 3

3

実際には単語ではなく 1 文字を返す紛らわしい関数名は別として:

do {
    var newChar = CreateHiddenWord();
} while (WordToGuess.indexOf(newChar) >= 0)
WordToGuess += newChar;

ただし、このループが終了するとは限らないことに注意してください。小さなランダムな文字列を作成するだけであれば、おそらく問題にはなりませんが、27 文字の文字列を作成しようとしても、明らかにうまくいきません! 文字列が長くなればなるほど、これまでに描いたことのないランダムな文字を描くのが難しくなります。

より良い解決策は、候補文字の配列を作成し、ランダムな文字を描画してから、その文字を配列から削除することです。そうすれば、重複していないものを見つけようとするためにループし続ける必要がなくなります。

次のようなものを探します(変数lengthに目的の文字列の長さが含まれていると仮定します):

function WordGenerator() {
    var letters = ['A','B','C',...];
    this.GetNextLetter = function() {
        if (letters.length) {
            var index = Math.floor(Math.random * letters.length);
            return letters.splice(index,1)[0];
        }
    }
}

次に、新しい単語が必要な場合:

var myGenerator = new WordGenerator();
var word = "";
for (var i=0; i < length; i++) {
    word += myGenerator.GetNextLetter();
}
于 2013-06-07T13:10:20.793 に答える
0

/(.)\1/ダブル文字に一致します。

申し訳ありませんが、もう少し詳しく説明する必要があります。

これは、次のように使用される正規表現です...

if (/(.)\1/.test( WordToGuess )) CreateHiddenWord();

/正規表現自体を区切ります

(.)任意の文字に一致し、キャプチャされたグループとして記録します

\1最初の (この場合は直前の) グループが何であれ、つまり繰り返しに一致します。

.test()この式を文字列に適用し、一致するtrue場合と一致falseしない場合に評価します。

于 2013-06-07T13:06:14.137 に答える