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

除了实际上返回单个字母而不是单词的令人困惑的函数名称之外:

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 回答
2

您可以使用do...while循环,直到获得唯一字符。也使用String.indexOf会告诉你重复:

var WordToGuess = "MYWORD";
do {
    var char = GetRandomCharacter();
} while ( WordToGuess.indexOf(char) > -1 );   

WordToGuess += char;

function GetRandomCharacter() {
    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;
}

实际上,其中一个地方do...while比普通的要好while

于 2013-06-07T13:05:54.357 回答
0

/(.)\1/将匹配一个双字符。

对不起,我应该解释得更好一点!

这是一个正则表达式,使用如下...

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

/分隔正则表达式本身

(.)匹配任何字符并将其记录为捕获的组

\1匹配第一个(在本例中为紧接在前的)组是什么 - 即重复。

.test()将此表达式应用于字符串并计算true为匹配和false不匹配。

于 2013-06-07T13:06:14.137 回答