Javascript 有什么简单的方法写这个吗?

Javascript 有什么简单的方法写这个吗?,javascript,Javascript,我仍然在写我的文本RPG,但是我没有任何简单的方法来编写我的升级代码。。。我得到的是: var LEVEL = 1; var XP = 0; var ATTACK = 0; var STRENGTH = 0; var DEFENSE = 0; var RANGED = 0; var MAGIC = 0; var AGILITY= 0; var HEALTH = 0; if(LEVEL = 1 && XP >= 20) { LEVEL = 2; ATTACK

我仍然在写我的文本RPG,但是我没有任何简单的方法来编写我的升级代码。。。我得到的是:

var LEVEL = 1;
var XP = 0;
var ATTACK = 0;
var STRENGTH = 0;
var DEFENSE = 0;
var RANGED = 0;
var MAGIC = 0;
var AGILITY= 0;
var HEALTH = 0;

if(LEVEL = 1 && XP >= 20) {
    LEVEL = 2;
    ATTACK++;
    STRENGTH++;
    DEFENCE++;
    RANGED++;
    MAGIC++;
    AGILITY++;

} else if(LEVEL = 2 && XP >= 60) {
    LEVEL = 3;
    ATTACK++;
    STRENGTH++;
    DEFENCE++;
    RANGED++;
    MAGIC++;
    AGILITY++;

} else if(LEVEL = 3 && XP >= 120) {
    LEVEL = 4;
    ATTACK++;
    STRENGTH++;
    DEFENCE++;
    RANGED++;
    MAGIC++;
    AGILITY++;

} else if(LEVEL = 4 && XP >= 240) {
    LEVEL = 5;
    ATTACK++;
    STRENGTH++;
    DEFENCE++;
    RANGED++;
    MAGIC++;
    AGILITY++;

} else if(LEVEL = 5 && XP >= 480) {
    LEVEL = 6;
    ATTACK++;
    STRENGTH++;
    DEFENCE++;
    RANGED++;
    MAGIC++;
    AGILITY++;

} else if(LEVEL = 6 && XP >= 960) {
    LEVEL = 7;
    ATTACK++;
    STRENGTH++;
    DEFENCE++;
    RANGED++;
    MAGIC++;
    AGILITY++;

} else if(LEVEL = 7 && XP >= 1920) {
    LEVEL = 8;
    ATTACK++;
    STRENGTH++;
    DEFENCE++;
    RANGED++;
    MAGIC++;
    AGILITY++;

} else if(LEVEL = 8 && XP >= 3840) {
    LEVEL = 9;
    ATTACK++;
    STRENGTH++;
    DEFENCE++;
    RANGED++;
    MAGIC++;
    AGILITY++;

} else if(LEVEL = 9 && XP >= 7680) {
    LEVEL = 10;
    ATTACK++;
    STRENGTH++;
    DEFENCE++;
    RANGED++;
    MAGIC++;
    AGILITY++;

} else if(LEVEL = 10 && XP >= 15360) {
    LEVEL = 11;
    ATTACK++;
    STRENGTH++;
    DEFENCE++;
    RANGED++;
    MAGIC++;
    AGILITY++;

} else if(LEVEL = 11 && XP >= 30720) {
    LEVEL = 12;
    ATTACK++;
    STRENGTH++;
    DEFENCE++;
    RANGED++;
    MAGIC++;
    AGILITY++;

} else if(LEVEL = 12 && XP >= 61440) {
    LEVEL = 13;
    ATTACK++;
    STRENGTH++;
    DEFENCE++;
    RANGED++;
    MAGIC++;
    AGILITY++;

} else if(LEVEL = 13 && XP >= 122880) {
    LEVEL = 14;
    ATTACK++;
    STRENGTH++;
    DEFENCE++;
    RANGED++;
    MAGIC++;
    AGILITY++;

} else if(LEVEL = 14 && XP >= 245760) {
    LEVEL = 15;
    ATTACK++;
    STRENGTH++;
    DEFENCE++;
    RANGED++;
    MAGIC++;
    AGILITY++;

} else if(LEVEL = 15 && XP >= 491520) {
    LEVEL = 16;
    ATTACK++;
    STRENGTH++;
    DEFENCE++;
    RANGED++;
    MAGIC++;
    AGILITY++;

} else if(LEVEL = 16 && XP >= 983040) {
    LEVEL = 17;
    ATTACK++;
    STRENGTH++;
    DEFENCE++;
    RANGED++;
    MAGIC++;
    AGILITY++;

} else if(LEVEL = 17 && XP >= 1966080) {
    LEVEL = 18;
    ATTACK++;
    STRENGTH++;
    DEFENCE++;
    RANGED++;
    MAGIC++;
    AGILITY++;

} else if(LEVEL = 18 && XP >= 3932160) {
    LEVEL = 19;
    ATTACK++;
    STRENGTH++;
    DEFENCE++;
    RANGED++;
    MAGIC++;
    AGILITY++;

} else if(LEVEL = 19 && XP >= 7864320) {
    LEVEL = 20;
    ATTACK++;
    STRENGTH++;
    DEFENCE++;
    RANGED++;
    MAGIC++;
    AGILITY++;

}

我不知道我是否可以使用for()或while()循环,但如果有人能帮助我,那将节省大量的空间和时间!(顺便说一句,我的xp对每个级别的要求是两倍)

您在每个if语句中重复相同的6行代码。这是一个关于何时使用函数的完美示例。这给了我们代码重用和更好的可读性

改为这样做:

注意:在if语句中应该使用三重等于进行比较

if(LEVEL === 1 && XP >= 20){
 LEVEL = 2;
 incrementStats();
}

function incrementStats(){
  ATTACK++;
  STRENGTH++;
  DEFENCE++;
  RANGED++;
  MAGIC++;
  AGILITY++;
}

现在,您只需在每个if语句中调用
incrementStats()
,而不是每次都键入所有内容。

您可以使用一个带有levels参数的函数来存储要增加级别的XP值,例如

var incrementLevels = (function (){
  var levels = {1:20,2:60,3:120,4:240};  // and so on…
  return function() {
    if (XP >= levels[LEVEL]) {
      LEVEL++;
      ATTACK++;
      STRENGTH++;
      DEFENCE++;
      RANGED++;
      MAGIC++;
      AGILITY++;
    }
  }
}());
我同意elclanrs的观点,即更倾向于使用小写字母作为变量

编辑 上面创建了一个名为incrementLevels的函数,该函数的调用类似于:

incrementLevels();
它使用您指定的全局变量。最好将它们放在一个对象中,比如称为“能力”(或能力)的对象:

然后,设置对象属性的值并根据需要将其传递给incrementLevels函数,而不是将值设置为全局值。然后可以是:

var incrementLevels = (function() {
  var levels = {1:20, 2:60, 3:120, 4:240 };  // and so on…
  var powerList = ['level','attack','strength','defence','ranged','magic','agility'];

  return function(powers) {
    if (powers.xp >= levels[powers.level]) {
      powerList.forEach(function (p){powers[p]++});
    }
  }
}());
并称之为:

incrementLevels(powers);
您可以拥有多个与其他对象关联的powers对象,例如powersA、powersB

请注意,包装函数的括号
()
并非绝对必要,但在您进入底部并查看最终的
()
之前,指出函数是立即调用的函数表达式(IIFE)非常重要。另见

一些枫树:

powers.xp = 30;
incrementLevels(powers);
console.log(JSON.stringify(powers));
// {"xp":30,"level":2,"attack":1,"strength":1,"defence":1,"ranged":1,"magic":1,"agility":1}

powers.xp = 128;
incrementLevels(powers);
console.log(JSON.stringify(powers));
// {"xp":128,"level":3,"attack":2,"strength":2,"defence":2,"ranged":2,"magic":2,"agility":2}

制作一个名为“++”的函数,并重复函数名。您需要在
if
语句中使用
=
,而不是
=
。您可以将XP截止值存储在一个数组中,然后根据数组检查XP,使用当前级别作为索引。然后,不管当前的级别如何,如果用户拥有所需的XP,您可以一次增加所有内容。我首先将变量小写,这将有助于提高可读性。大写变量是常量的约定,但您的是可变的。谢谢您的帮助!谢谢,这对我很有帮助不客气!如果您满意,请将我的回答标记为答案。谢谢,但是,我有几个问题-使用1:20有什么意义,-特别是:?这是一个或文本的语法(也是)。函数完成后,您是否可以去掉}之间的()呢???这对于我的编码水平来说有点高级,但是谢谢!!如果
XP==30
LEVEL==1
,则不会在应该时增加级别。另外,答案应该有解释,而不仅仅是代码。@RobG的作者要求重构,而不是解释。如果你想从30xp开始一级,只需在countLevel条件下将60替换为30实际上我问过是否有人可以帮助我,只是一般性的,解释或只是一些提示,但有帮助总比没有好!:P
powers.xp = 30;
incrementLevels(powers);
console.log(JSON.stringify(powers));
// {"xp":30,"level":2,"attack":1,"strength":1,"defence":1,"ranged":1,"magic":1,"agility":1}

powers.xp = 128;
incrementLevels(powers);
console.log(JSON.stringify(powers));
// {"xp":128,"level":3,"attack":2,"strength":2,"defence":2,"ranged":2,"magic":2,"agility":2}
var LEVEL = 1;
var XP = 0;
var ATTACK = 0;
var STRENGTH = 0;
var DEFENSE = 0;
var RANGED = 0;
var MAGIC = 0;
var AGILITY = 0;
var HEALTH = 0;

function xpUp(xp){
    if (LEVEL !== countLevel(xp, 1)) {
        LEVEL++;
        ATTACK++;
        STRENGTH++;
        DEFENSE++;
        RANGED++;
        MAGIC++;
        AGILITY++;
        HEALTH++;
    }
    console.log(LEVEL);
}

function countLevel(xp, level){
    if (Math.floor(xp / 60) > 0)
        return countLevel(xp / 2, ++level);
    else
        return level;
}