【问题标题】:A variable in my code doesn't seem to be incrementing我的代码中的变量似乎没有增加
【发布时间】:2014-01-23 03:08:19
【问题描述】:

我正在开发一个井字游戏,以自学画布元素,但转数计数器似乎没有增加。任何帮助将不胜感激。

Fiddle

function turn() {
    var turnNum = 1;
    while (turnNum <= 9) {
        alert(turnNum % 2);
        showCurrent(turnNum);

        $(canvas).click(function(event) {
            // jQuery would normalize the event
            mouse = getMouse(event);
            //now you can use the x and y positions

            if (turnNum % 2) {
                drawX(Math.floor(mouse.y / 100), Math.floor(mouse.x / 100));
            } else {
                drawO(Math.floor(mouse.y / 100), Math.floor(mouse.x / 100));
            }
        });

        turnNum = turnNum++;
    }
}

【问题讨论】:

  • 在倒数第三行尝试turnNum++;,而不是turnNum = turnNum++;
  • 谢谢!现在应该可以看到了。唯一的问题是第 138 行的警报语句。将其留在垃圾邮件警报中,但将其取出会使程序崩溃。

标签: javascript jquery canvas


【解决方案1】:

您的问题可能与此语句有关@

除此之外,另一个问题是,在循环中,您将点击事件绑定到 canvas,并在其中使用共享变量 turnNum,这意味着当您的点击事件运行时,它始终具有最后一个值似乎您将同一个点击事件多次绑定到同一个canvas

【讨论】:

    【解决方案2】:

    而不是使用

    turnNum = turnNum++;
    

    请只使用

    turnNum++;
    

    【讨论】:

      【解决方案3】:

      虽然关于如何增加turnNum 的两个答案都是正确的,但还有一个更基本的问题是关于何时这样做。

      您需要在点击事件期间更新此变量。而且您绝对不想一遍又一遍地重新绑定该单击事件。所以你需要对这个逻辑进行一些重大的重组。

      更新

      这是重构代码的一种简单方法。删除turn 函数,在drawGrid 调用之后,改用它:

      var turnNum = 0;
      showCurrent(turnNum);
      
      $(canvas).click(function(event) {
          if(turnNum++ < 9) {
              showCurrent(turnNum);
          }
          mouse = getMouse(event);
          //now you can use the x and y positions
      
          if(turnNum%2) {
              drawX(Math.floor(mouse.y/100),Math.floor(mouse.x/100));
          } else {
              drawO(Math.floor(mouse.y/100),Math.floor(mouse.x/100));
          }
      });
      

      JSFiddle 上似乎有一个版本可以正常工作。

      【讨论】:

        【解决方案4】:

        您的事件绑定必须在循环之外(如果不是,您将绑定多次),应该是这样的:

        var turnNum;
        $(canvas).click(function(event) {
            // jQuery would normalize the event
            mouse = getMouse(event);
            //now you can use the x and y positions
            if (turnNum % 2) {
                drawX(Math.floor(mouse.y / 100), Math.floor(mouse.x / 100));
            } else {
                drawO(Math.floor(mouse.y / 100), Math.floor(mouse.x / 100));
            }
         });
        function turn() {
           turnNum = 1;
           while (turnNum <= 9) {
              alert(turnNum % 2);
              showCurrent(turnNum);      
              turnNum++;
           }
        }
        

        请注意,我们取出了 turnNum 变量,因此它可以访问但事件侦听器。 另外,你的 turnNum 增量是错误的。

        希望这会有所帮助。干杯

        【讨论】:

        • 这帮助很大!它仍然给我所有的Os,寿。是因为增加的 turnNum 只能在 turn() 函数内部访问吗?
        • 哦,现在我明白你的问题了。也许不需要转弯方法。在这里你有小提琴:jsfiddle.net/edgarinvillegas/tM4p7/8
        【解决方案5】:

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

        正如您在链接中看到的那样,++ 仅在分配变量后才增加变量。

        做:

        turnNum = ++turnNum;
        

        或者简单地说:

        turnNum++;
        

        【讨论】:

        • 删除第一部分。这是多余的, ++​​ 运算符已经将递增的值分配给变量。不需要双重赋值(隐式和显式)
        • 是的......不过我会在评论中留下它,以便其他人可以学习
        猜你喜欢
        • 2011-06-30
        • 2014-03-24
        • 1970-01-01
        • 2017-06-21
        • 2020-08-05
        • 2014-04-11
        • 2018-03-26
        • 2020-11-13
        • 1970-01-01
        相关资源
        最近更新 更多