按下错误键时javascript减去计数?

按下错误键时javascript减去计数?,javascript,Javascript,我正在做一个游戏,我需要做一个计数函数,每次按下一个错误的键,就减去1次尝试 以下是我目前的代码: var names = ["Adam Red", "Bob Green", "Chris Blue"]; var nameChosen = names[Math.floor(Math.random() * names.length)]; var nameSplit = nameChosen.split(""); var updated = []; var attempt = nameChosen.

我正在做一个游戏,我需要做一个计数函数,每次按下一个错误的键,就减去1次尝试

以下是我目前的代码:

var names = ["Adam Red", "Bob Green", "Chris Blue"];
var nameChosen = names[Math.floor(Math.random() * names.length)];
var nameSplit = nameChosen.split("");
var updated = [];
var attempt = nameChosen.length - 2;

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

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

//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
var name=[“亚当红”、“鲍勃绿”、“克里斯蓝”];
var nameselected=names[Math.floor(Math.random()*names.length)];
var nameSplit=nameSelected.split(“”);
var更新=[];
var trunt=nameselected.length-2;
功能显示(字符){
//用下划线替换每个字母,用破折号替换空格
char=char | |'';//在没有给定字符时设置为默认值
显示的变量名称=[];
对于(var i=0;i
我知道我需要把
尝试--
放在循环中的某个地方,但我只能在按下错误的键时使其减去所有字母的长度


例如:如果选择的名称是
Adam Red
,并且按下了
键z
,则会给出
trunt=trunt-1
,而不是
trunt=trunt-7
(Adam Red中的字母总数).

从您的代码中,您似乎可以访问
名称选择
尝试
全局。如果确实如此,则可以通过以下方式更新事件侦听器:

document.addEventListener('keypress', function(evt) {
    evt = evt || window.event;
    var charCode = evt.keyCode || evt.which;
    var charStr = String.fromCharCode(charCode);

    if (nameChosen.includes(charStr))
        display(charStr); // call when typing
    else 
        attempts--;
});
基本上,我所做的更改是在更新UI之前使用方法添加一个检查,以验证所选名称是否包含字符串。此外,您可能需要添加一些UI反馈,以便玩家知道他的尝试次数正在减少


希望有帮助。

给定的解决方案使用包括ES6的一部分。如果您还想支持较旧的浏览器,这里有一个使用indexOf的解决方案

var updated = new Array(nameSplit.length).join('_');
function display(char) {
    //replace each of the letters with underscore and space with dash
    char = char || '_';   // set to default when no char given
    var nameDisplayed = [];

    var indexAt = nameSplit.indexOf(char);
    if(indexAt !== -1) {
        // to avoid in next search
        nameSplit[indexAt] = null;
        updated[indexAt] = char;
    } else {
        attempt--;
    }
    document.getElementById("nameDisplay").innerHTML = nameDisplayed;
}

我已经编写了另一个代码部分来完成同样的工作。我尝试过使用一些
ES6
代码,比如
lambda函数

我写的代码可以做下面的事情

  • 当按下键时,检查字母是否在名称中
  • 所有按键只能按一次
  • 显示尝试计数
  • 说你赢了当您找到名称时
  • 说你输了如果在尝试计数器归零之前找不到
代码如下:

let names=[“亚当红”、“鲍勃绿”、“克里斯蓝”];
让NameSelected=names[Math.floor(Math.random()*names.length)];
让nameSplit=nameSelected.split(“”);
让尝试=NameSelected.length-2;
const chosenName=[];
常量=[];
让checkWin=()=>chosenName.filter(val=>val.isleter).map(val=>val.isFound).reduce((a,b)=>a&&b,true);
让toText=()=>chosenName.map(val=>val.valueFound).reduce((a,b)=>a+“”+b,“”);
forEach(函数(val,i){
chosenName.push({
isLetter:val.match(/[a-z]/i)?true:false,
我发现:错,
值:val,
valueFound:val==“”?“-”:“uz”,
索引:i
});
});
功能检查(charStr){
如果(包括(字符))
返回false;
推(charStr);
chosenName.filter(val=>!val.isFound&&val.isleter).forEach(函数(val,i){
if(charStr.toLowerCase()==val.value.toLowerCase()){
val.valueFound=val.value;
val.isFound=true;
}
});
如果(!chosenName.map(val=>val.value.toLowerCase()).includes(charStr.toLowerCase()))
企图--;
}
//获取用户按下的键
文档。添加的文本列表器(“按键”,功能(evt){
evt=evt | | window.event;
var charCode=evt.keyCode | | evt.which;
var charStr=String.fromCharCode(charCode);
支票(charStr);
document.getElementById(“名称显示”).innerHTML=toText();
document.getElementById(“尝试”).innerHTML=尝试;
if(checkWin())
document.getElementById(“尝试”).innerHTML=“你赢了!”;

如果(尝试谢谢你,Nguele。顺便说一句,你如何确保一个键只被使用一次或打印出一次错误的键?只要用户按下一个键,我只能将它们全部打印出来。谢谢!顺便问一下。你知道如何确保一个键只被允许按下一次吗?在这种情况下,此解决方案将不起作用。你需要在中使用indexOf。)循环以使用var index=[],i=-1;while((i=arr.indexOf(val,i+1))!=-1){indexes.push(i);}您可以检查更新的数组中是否存在按下的键。如果存在,则表示键已按下,在本例中,不需要尝试--只需从函数返回即可。很抱歉,我不明白您的代码是做什么的。是否有一种方法可以将按下的键的所有值/字符存储在数组中,以便我可以在按下键时进行检查?谢谢Gurkana谢谢你的建议。我会试试看,让你知道它是否对我有效。嗨,Gurkanat。我可以使用你的代码来确保键被允许按一次。但是,由于我使用循环来替换字母和下划线,空格和破折号,我不能使用checkWin函数。你能帮我吗?还有,如果我得到checkLose是的,我怎样才能停止使用更多的新按键?