如何通过按键转换后返回数组项

时间:2017-08-16 19:38:23

标签: javascript

我正在构建游戏,我已经完成了这个:

var names=["Adam Black", "Brad White"];
var namePicked = var namePicked = names[Math.floor(Math.random() * names.length)]; //pick a random name
var nameArray = namePicked.split(""); //turn name string into array of letters
var nameHidden = [];

window.onload = function() {

    //replace each of the letters with underscore and space with dash
    for (var i = 0; i < nameArray.length; i++) {
        if (nameArray[i] == " ") {
            nameHidden += "- ";
        }
        else {
            nameHidden += "_ ";
        }
    }

    document.getElementById("nameDisplay").innerHTML = nameHidden;
}

//get key pressed by user
document.onkeypress = function(evt) {
    evt = evt || window.event;
    var charCode = evt.keyCode || evt.which;
    var charStr = String.fromCharCode(charCode);

    nameArray = nameArray.map(function(x) {return x.toLowerCase()}); //lowercase all letters so uppercase letters get caught when key pressed

    // check letter entered with letters of names
    for (var i = 0; i < nameArray.length; i++) {
        if (charStr == nameArray[i]) {
        }
    }
}

我被困在这里。如何将值切换/替换回字母?

例如:“Adam Black”将转换为4个下划线1个破折号和5个下划线,当用户按下键a时,两个字母a都将显示: A _ a _ - _ _ _ _

按下右键时,我无法将nameHidden[i]更改回nameArray[i]。我可以通过console.log获取键的值。

我试过循环,新变种,布尔......

另外,如何确定一个键被预先设定(即“a”),用户可以再次按下它但没有任何反应?

2 个答案:

答案 0 :(得分:3)

你并不是那么遥远,但是将更新HTML的部分变成一个函数会更容易,只需用给定的字符调用该函数,比如

var names      = ["Adam Black", "Brad White"];
var namePicked = names[Math.floor(Math.random() * names.length)]; //pick a random name
var nameArray  = namePicked.split(""); //turn name string into array of letters
var updated    = []; // keep track of values that are already updated

function display(char) {
  //replace each of the letters with underscore and space with dash
  char = char || '_';   // set to default when no char given
  var nameHidden = [];

  for (var i = 0; i < nameArray.length; i++) {
    if (updated[i] || (char.toLowerCase() === nameArray[i].toLowerCase())) {
      nameHidden += nameArray[i];
      updated[i] = true;
    } else if (nameArray[i] == " ") {
      nameHidden += "- ";
    } else {
      nameHidden += "_ ";
    }
  }
  document.getElementById("nameDisplay").innerHTML = nameHidden;
}

//get key pressed by user
document.addEventListener('keypress', function(evt) {
  evt = evt || window.event;
  var charCode = evt.keyCode || evt.which;
  var charStr = String.fromCharCode(charCode);
  display(charStr); // call when typing
});

display(); // call onload
<div id="nameDisplay"></div>
<br /><br /><br />
<p>Focus here, and hit keys !</p>

答案 1 :(得分:1)

另一种方法是定义一个函数,将常规名称转换为隐藏名称(带下划线和短划线),知道已在数组中按下的字符。

function convertToHidden(name, charsPressed) {
    var hiddenName = "";
    // iterate over each character in the |name| string
    for (var n=0; n<name.length; n++) {
        var currCharInName = name[n];
        // now check if that character has been pressed
        var hasBeenPressed = false;
        for (var p=0; p<charsPressed.length; p++) {
            if (charsPressed[p] == currCharInName) hasBeenPressed = true;
        }
        if (hasBeenPressed) hiddenName += currCharInName;
        else hiddenName += "_";
        hiddenName += " ";
    }
    return hiddenName;
}

然后你可以在按键功能中使用它,如下所示:

var charsPressed = [];
document.onkeypress = function(evt) {
    evt = evt || window.event;
    var charCode = evt.keyCode || evt.which;
    var charStr = String.fromCharCode(charCode);

    if (! charsPressed.includes(charStr)) charsPressed.push(charStr);
    var nameHidden = convertToHidden(namePicked, charsPressed);
    // display |nameHidden|
}