【问题标题】:How to make if statement true only once?如何使 if 语句只为真一次?
【发布时间】:2017-03-20 05:08:59
【问题描述】:

如何让 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();
   }

【问题讨论】:

  • 你以后要加分吗
  • 向我们展示你在 spawnNewEnemies() 中做了什么;

标签: javascript


【解决方案1】:
var addNew=true;
if (score == 5 && addNew) {
  spawnNewEnemies();
  addNew=false;
}

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

【讨论】:

    【解决方案2】:

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

    var isEnemyAddedAtFive = false;
    

    然后在您的检查点测试此值,如果未锁定,则执行并锁定:

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

    祝你好运!

    【讨论】:

      【解决方案3】:
      if ( score != 0 && score % 5 == 0) {
           spawnNewEnemies();
      }
      

      试试这个。

      【讨论】:

      • 如果这被纳入评分方法,那么它就是正确答案。因为您只需要在分数更改时进行一次检查。它还将消除对 isAdded 检查的需要,并减少每个周期的分数检查。
      • 同意答案,但你应该描述这段代码在做什么。有些人可能不知道 mod 运算符
      【解决方案4】:

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

      如果分数可以被 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;
      }
      

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

      【讨论】:

        【解决方案5】:

        //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();

        【讨论】:

        • 看来我来晚了
        【解决方案6】:

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

        • 应该是

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

          3 个敌人

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

        解决方案:

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

        希望对你有帮助

        【讨论】:

          【解决方案7】:
           !( score != 0 && score % 5 == 0) || spawnNewEnemies()
          //how it functions
           !true || run()
          

          我不得不承认这有点抽象。但是,如果分数为真,它会强制为假并运行 spawnNewEnemies。如果分数不真实。它强制进入 true 并且不运行 false 条件。

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

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

          SpawnNewEnemies 现在采用 score 参数。但也是一个箭头功能,可用于快速单行。由于 score 是一个依赖项,它将在该条件下运行。如果基本分数为 0 且可被 5 整除,则条件返回 true,但 "bang" (!) 运算符将其强制为 false,并处决新的敌人。如果分数不能被 5 整除,它会返回 false,但 bang 会翻转它并且不会返回 OR 错误论证。

          【讨论】:

            猜你喜欢
            • 2019-01-12
            • 2018-10-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多