如何使if语句只出现一次?

时间:2017-03-20 05:09:00

标签: javascript

如何使if语句只运行一次。我正在用javascript制作一个游戏,一旦用户得分为5,我想在阵列中添加一个新的敌人。我遇到的问题是,如果if语句为真,它会不断添加新的敌人,直到整个屏幕被敌人覆盖。我希望它在得分为5时只添加1个新敌人,然后在得分为10时添加另一个敌人等等。我无法想到实现这一目标的方法。谢谢。

Sketch.js

   var score = 0;

   //3 three enemies once game starts
   function StartingEnemies() { 
      for (var i = 0; i < 2; i++) {
        enemies[i] = new BasicEnemy();
      }
   }


   //add new enemies into the array
   function spawnNewEnemies() {
     enemies.push(new BasicEnemy());
   }


   if (score == 5) {
     spawnNewEnemies();
   }

7 个答案:

答案 0 :(得分:4)

你需要一个简单的闩锁。尝试添加一个名为isEnemyAddedAtFive的布尔变量,并将其设置为false,因为它是默认值。

var isEnemyAddedAtFive = false;

然后在你的检查点测试这个值,如果没有锁定,则执行并锁定:

if( score == 5 && !isEnemyAddedAtFive ) {
    addEnemy();
    isEnemyAddedAtFive = true;
}

祝你好运!

答案 1 :(得分:3)

if ( score != 0 && score % 5 == 0) {
     spawnNewEnemies();
}

试试这个。

答案 2 :(得分:2)

TimePref p = (TimePref) findPreference(prefKey);
p.setValue(value);

如果您正在运行函数内部的代码,请确保在某个地方声明addNew,它将在调用之间保持不变。

答案 3 :(得分:2)

这比你目前的编码要复杂一些。有几种方法可以解释这一点。坚定您的要求。

如果分数可以被5整除,你是否只想添加一个敌人......只有当分数以0或5(5,10,15,20等)结束时才有意义:

If (score % 5 == 0) {
  enemies.push(new BasicEnemy());
}

否则,您可能需要跟踪总分和一个级别/分段分数,代表自该计划上次对游戏采取行动以来的分数。

// Initialization
var totalScore = 0;
Var currents core = 0;

// Game event loop
while (player.lifeState > 0) {

// Check current score is 5 or more on every iteration of the game event loop
if (currentScore >= 5) {
// Handle score
spawnNewEnemies();
// Update scoring
totalScore += currentScore;
// Reset currentScore (or not if you want to do more stuff in the level before resetting but this may change the above logic)
currentScore = 0;
}

随着您的更多功能,您的逻辑将变得更加复杂。最好的第一步是在编码之前定义明确的要求,因为退休可能会影响您实施另一个

的方式

答案 4 :(得分:1)

//post this snippet at some top level of your code.
var onceMap = {};

function once(key) {
  if (onceMap[key]) {
    return false;
  } else {
    onceMap[key] = true;
    return true;
  }
}
var score = 10;

//do this in your task function
function task() {
  if (score >= 5 && once("score5")) {
    console.log("score 5 action");
  }
  if (score >= 10 && once("score10")) {
    console.log("score 10 action");
  }
}
task();
task();
task();

答案 5 :(得分:1)

看到您的代码后首先想到的是:

  • 应该是

    for (var i = 0; i < 3; i++)
    

    3个敌人

  • 您正在多次调用您的代码(即.js文件)。这意味着每次调用时分数重置为0,并且分数== 5条件多次出现。

<强>解决方案:

更改你的逻辑,使得.js文件只被调用一次,并在整个游戏期间存储得分。

希望这有帮助

答案 6 :(得分:0)

 !( score != 0 && score % 5 == 0) || spawnNewEnemies()
//how it functions
 !true || run()

我不得不承认这有点抽象。但是,这样做的是,如果分数为true,则将其逼为false并运行spawnNewEnemies。如果分数不正确。它会强制为真,而不会运行错误条件。

但是id建议对函数进行编辑:

var spawnNewEnemies =scored=> !(scored !=0 && scored%5===0) || enemies.push(new BasicEnemy());
spawnNewEnemies(score);

SpawnNewEnemies现在带有一个得分参数。而且还有一个箭头功能,可用于快速单线。由于得分是依赖项,因此它将在该条件下运行。如果基本得分是0,并且也可以被5整除,则条件返回true,但是“ bang”(!)运算符将其强制为false,并执行新的敌人。如果分数不能被五整除,它将返回false,但爆炸声将其翻转,并且不会返回OR的错误论证。