JavaScript

时间:2016-05-12 18:28:16

标签: javascript html css

我正在制作游戏:http://codepen.io/abdulahhamzic/pen/xVMXQa

游戏由玩家猜测一个单词组成,他们只有五次尝试正确猜测它。如果玩家单词中的一个字母位于适当的位置,那么它应该变为绿色。如果一个字母在单词中,但不在正确的位置,那么它应该涂成红色,以便给玩家提示该字母是否存在,但是应该放在单词中的其他位置。我使用这部分代码来实现该功能:

if (userWord[i].toUpperCase() == word[i]){
    document.getElementsByClassName("letters")[input].children[i].style.background = "green";
}
else if (word.indexOf(userWord[i].toUpperCase()) > -1){
    document.getElementsByClassName("letters")[input].children[i].style.background = "red";
}    

问题在于,当玩家输入包含两个或多个相同字母的单词并且正确的单词包含较少的字母时,只有位于确切位置的字母应为绿色而其他字母不应为红色,因为这意味着这封信有多次。例如:

  • 如果单词为“ABBBB”且玩家输入“AAAAC”,则只有“AAAAC”的第一个“A”应保持为绿色,而另一个“A”应保持黄色且不变为红色。
  • 如果单词是“ABABB”并且玩家输入“ACBAA”,则第一个“A”应该保持为绿色,只有第二个“A”应该是红色,而不是最后一个“A”都指定为这个词中只有两个“A”。此外,“B”当然应该是红色。
  • 如果单词是“ABABA”并且玩家输入“AAAAA”,那么,只有第一个,第三个和最后一个“A”应该是绿色,但是另一个“A”应该保持黄色而不是变红了。

所以,这些是一些例子。我想你现在明白了。我真的无法弄清楚如何正确实现这个功能。

3 个答案:

答案 0 :(得分:1)

  1. 将猜测的单词和所需单词放在哈希表(对象)中,计算字母的频率
  2. 例2:

        actualWord = { a: 2, b: 3}
        guessedWord = { a: 3, b: 1, c: 1}
    
    1. 每次猜测后,同时迭代两个字符串

    2. 如果您所在的信件匹配,则将其突出显示为绿色,因为它是正确的字母和正确的位置。

    3. 减少哈希表中的两个值(它们匹配且不再被考虑)

      actualWord = { a: 1, b: 3}
      guessedWord = { a: 2, b: 1, c: 1}
      
    4. 如果它们不匹配,请检查哈希表。如果猜测的字母在实际的字符哈希表中,则它存在,但它位于错误的位置。突出显示为红色。减少一个

      actualWord = { a: 0, b: 3}
      guessedWord = { a: 1, b: 1, c: 1} 
      
    5. 如果查找有效,但实际单词的散列为0,则表示用户输入了太多相同的字母,因此您将其着色为黄色(我认为)< / p>

答案 1 :(得分:0)

我有一个解决方案。

首先检查信件是否在正确的位置。

然后处理另一封信。

每个找到的字母都会增加特定字母的计数器。 所以每次你都可以查看你是否已经找到了这封信。

&#13;
&#13;
var target= "aabccd".toLowerCase();
var guess = prompt("guess the word(6 Letters)","").toLowerCase();

function countLetter(letter, string)
{
   var count = 0, n = 0, i = 0;
  
   while((i = string.indexOf(letter, n)) != -1)
   {
      n += i + 1;
      count++;
   }
  return count;
}

var guessLetterCount = {};
var style = [];
for(var i = 0; i < target.length; i++)
  style.push("yellow");

// get letter who match
for(var i = 0; i < target.length; i++)
{
  if(target[i] == guess[i])
  {
     style[i] = "green";
     if(guessLetterCount[target[i]])
          guessLetterCount[target[i]]++;
     else
          guessLetterCount[target[i]] = 1;
  }
}

// get letter at the wrong place
for(var i = 0; i < target.length; i++)
{
  // only process letter who aren't at the right place
  if(style[i] == 'yellow')
  {
    // check if letter match and compare the letter count
    if(target.indexOf(guess[i]) != -1 && (guessLetterCount[guess[i]] == null ||   countLetter(guess[i], target) > guessLetterCount[guess[i]]))
    {
      // set read background
      style[i] = "red";
      if(guessLetterCount[guess[i]])
        guessLetterCount[guess[i]]++;
      else
        guessLetterCount[guess[i]] = 1;
    }
  }
}

// write result
for(var i = 0; i < target.length; i++)
{
   document.write('<span style="font-size:20px; background:' + style[i] + '">'+guess[i]+'</span>');
  
}
&#13;
&#13;
&#13;

答案 2 :(得分:0)

Here's your working answer.注意测试词是一个名为'word'的变量,在这个例子中是var word ='AABBCC';

<%= f.email_field :name, autofocus: true, class: "form-control", id: "email" %>