我有这个功能:
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
。
答案 0 :(得分: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();
}
答案 1 :(得分: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
更好。
答案 2 :(得分:0)
/(.)\1/
将匹配双字符。
对不起,我应该更好地解释一下!
这是regular expression使用如下......
if (/(.)\1/.test( WordToGuess )) CreateHiddenWord();
/
分隔正则表达式
(.)
匹配任何字符并将其记录为捕获的组
\1
匹配任何第一组(在这种情况下,紧接在前的组) - 即重复。
.test()
将此表达式应用于字符串,并评估为true
匹配,false
不匹配。