2016-07-05 106 views
0

你好,我正在做一个游戏的基本计算器,但我面临一个问题,我刚开始学习这种编程语言阅读我发现的所有教程,现在我只是做一些代码,并获得一些经验,所以我写了一个计算代码,我之前在php中编写的计算代码工作完美,但我在那里使用不同的技术,所以在JavaScript中我创建了一个函数,将被称为计算按钮将被按下,并创建一个对象存储的5名球员全部数据来看一看:Javascript的基本计算总是得到NaN

function count(){ 

    function ninjas (name,dmg,dmgrate,dmggrow,speed,fury) { 
     this.name = name; 
     this.dmg = dmg; 
     this.dmgrate = dmgrate; 
     this.dmggrow = dmggrow; 
     this.speed = speed; 
     this.fury = fury; 
    } 
    var name = []; 
    var dmg = []; 
    var dmgrate = []; 
    var dmggrow = []; 
    var speed = []; 
    var fury = []; 
    var ninja = []; 
    for(var i = 0; i <5; i++){ 
     name[name.length] = document.getElementById("ninja" + (i +1)).value; 
     dmg[dmg.length] = document.getElementById("dmg" + (i +1)).value; 
     dmgrate[dmgrate.length] = document.getElementById("dmgrate" + (i +1)).value; 
     dmggrow[dmggrow.length] = document.getElementById("dmggrow" + (i +1)).value; 
     speed[speed.length] = document.getElementById("speed" + (i +1)).value; 
     fury[fury.length] = 50; 
     ninja[i] = new ninjas(name[i],dmg[i],dmgrate[i],dmggrow[i],speed[i],fury[i]); 
    } 

    ninja.sort(function(a, b){return b.speed - a.speed}); 

    var totaldmg; 
    var damagerate; 
    var damagegrow; 
    var furydmg; 

    for(var a = 0; a < 6; a++){ // 6 fight 
     for(var b = 0; b < 5; b++){ // 5 ninjas 
      if(ninja[b].name == "Kabuto"){ 
       if(ninja[b].fury == 100){ 
        damagerate = ninja[b].dmg/100 * ninja[b].dmgrate; 
        damagegrow = damagerate/100 * ninja[b].dmggrow; 
        furydmg = damagegrow + (damagegrow/100) * ((ninja[b].fury - 100)/0.25); 
        totaldmg += furydmg; 
        for(var c = 0; c < 5; c++){ // add fury each ninja by 25 
         ninja[c].fury +=25; 
        } 
        ninja[b].fury -= 25; 
        ninja[b].fury +=100; 
       }else if(ninja[b].fury > 100){ 
        damagerate = ninja[b].dmg/100 * ninja[b].dmgrate; 
        damagegrow = damagerate/100 * ninja[b].dmggrow; 
        totaldmg += damagegrow; 
        for(var c = 0; c < 5; c++){// add fury each ninja by 25 
         ninja[c].fury +=25; 
        } 
        ninja[b].fury -= 25; 
        ninja[b].fury +=100; 
       }else { 
        damagerate = ninja[b].dmg/100 * ninja[b].dmgrate; 
        totaldmg += damagerate; 
        ninja[b].fury += 50; 
       } 
      } else { 
       if(ninja[b].fury == 100){ 
        damagerate = ninja[b].dmg/100 * ninja[b].dmgrate; 
        damagegrow = damagerate/100 * ninja[b].dmggrow; 
        totaldmg += damagegrow; 
        ninja[b].fury = 0; 
       }else if(ninja[b].fury > 100){ 
        damagerate = ninja[b].dmg/100 * ninja[b].dmgrate; 
        damagegrow = damagerate/100 * ninja[b].dmggrow; 
        furydmg = damagegrow + (damagegrow/100) * ((ninja[b].fury - 100)/0.25); 
        totaldmg += furydmg; 
        ninja[b].fury = 0; 
       }else { 
        damagerate = ninja[b].dmg/100 * ninja[b].dmgrate; 
        totaldmg += damagerate; 
        ninja[b].fury += 50; 
       } 
      } 
     } 
    } 

    document.getElementById("result").innerHTML = totaldmg; 
}; 

我用几个循环的所有数据存储在自己的地方,然后每一步我做了车后的速度属性使用功能的短短大家CK如果一切都好,但最终以某种方式,我仍然有结果这是NaN有人可以帮助我解决这个问题我检查了我的代码多次,但可以找到哪里是错误的,也许有一些我不知道一个JavaScript和错过

+0

尝试将问题压缩为[mcve],它不仅可以帮助我们,还可以帮助您理解问题的来源 – BeyelerStudios

+1

您正在对字符串执行数学运算。 –

+0

[欢迎使用JavaScript](https://www.destroyallsoftware.com/talks/wat) – Nixon

回答

1

初始化变量总数为0

这样totaldmg + =值不会导致totaldmg =“未定义+值;

var totaldmg = 0; 
var damagerate = 0; 
var damagegrow = 0; 
var furydmg = 0; 

此外,从DOM读取值时,将它们转换为数值作为字符串常量将串连

for(var i = 0; i <5; i++){ 
    name[i] = parseInt(document.getElementById("ninja" + (i +1)).value, 10); 
    dmg[i] = parseInt(document.getElementById("dmg" + (i +1)).value, 10); 
    dmgrate[i] = parseInt(document.getElementById("dmgrate" + (i +1)).value, 10); 
    dmggrow[i] = parseInt(document.getElementById("dmggrow" + (i +1)).value, 10); 
    speed[i] = parseInt(document.getElementById("speed" + (i +1)).value, 10); 
    fury[i] = 50; 
    ninja[i] = new ninjas(name[i],dmg[i],dmgrate[i],dmggrow[i],speed[i],fury[i]); 
} 
+0

好吧,所以我不知道如果我必须设置0这些变量,但是我检查DOM的typeof值他们是一个字符串,所以我用parseInt将它们转换为一个数字,现在它的工程罚款tnx你解释 – yahoo5000

0

我不知道你想做什么,代码应该如何工作,但从这里看你的代码是我能识别的第一个错误:

name[name.length] 
dmg[dmg.length] 
dmgrate[dmgrate.length] 
speed[speed.length] 
//etc 

这是错误的。阵列中的元素从0开始并结束到array.length - 1。这意味着name[name.length]不存在。

这里是一个JavaScript数组是如何工作的一些链接:

http://www.w3schools.com/js/js_arrays.asp

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

我希望这可以帮助你。我会继续看到你的代码,如果我发现任何其他错误,我将它们添加到我的回答

2)这是如何工作的:

for(var i = 0; i <5; i++){ 
    name[name.length] = document.getElementById("ninja" + (i +1)).value; 
    dmg[dmg.length] = document.getElementById("dmg" + (i +1)).value; 
    dmgrate[dmgrate.length] = document.getElementById("dmgrate" + (i +1)).value; 
    dmggrow[dmggrow.length] = document.getElementById("dmggrow" + (i +1)).value; 
    speed[speed.length] = document.getElementById("speed" + (i +1)).value; 
    fury[fury.length] = 50; 
    //... 
} 

如果你想添加元素在JavaScript中的数组,name[name.length]是不是它可以完成的方式。在上面的链接中,您可以看到如何使用array.push(arg);函数。

+0

你是错误有很多方法推动数组,我知道他们几乎都选择了这个wai,因为我认为它更适合我 – yahoo5000