javascript - 如何防止用户在不是他们的 'turn' 时激活 jquery 点击功能?

标签 javascript jquery css

我正在构建一款 Simon 游戏,该游戏以 90 年代(?)的旧掌上游戏为蓝本。我无法弄清楚如何防止用户在轮到他们时单击 4 个彩色按钮,并且基本上不按顺序破坏我的程序。我怎样才能阻止他们在“Simon”轮到他时激活下面的 mousedown jquery?我真的很感激任何帮助,谢谢。

Codepen 链接:http://codepen.io/MindfulBell/pen/ZbgQym

相关代码(我想,只编程了6个月)...

西蒙斯行动:

function simonSaysLv1(){   
    simonsMoves.push(Math.floor(Math.random() * (4-1+1)) + 1);
    doSimonMove(0);     
    playerTurn = true;    
    simonTurn = false;
  }

  function doSimonMove(index){ 

    if(index < simonsMoves.length){
      simonlightUp(simonsMoves[index]);
      setTimeout(function(){
        doSimonMove(index + 1);
      }, simonSpeed);
    }
  }

鼠标按下播放器 Action :

$('.sim-button').mousedown(function(){

    if (playerTurn && started && gameOn) {
    var playerPress = '#' + this.id
    switch(playerPress){
      case grn:
        grn1Audio.play();
        $(grn).css('background-color', '#00ff00')
        playerMoves.push(1)       
        break;
      case red:
        red2Audio.play();
        $(red).css('background-color', '#ff1a1a')
        playerMoves.push(2)         
        break;
      case yel:
        yel3Audio.play();
        $(yel).css('background-color', '#ffffb3')
        playerMoves.push(3)         
        break;
      default:
        blue4Audio.play();
        $(blue).css('background-color', '#b3d1ff')
        playerMoves.push(4)          
        break;
    }    
       }  
      })
  //letting go of click
  $('.sim-button').mouseup(function(){
    if (playerTurn && started && gameOn) {
    var playerPress = '#' + this.id
    switch(playerPress){
      case grn:        
        $(grn).css('background-color', 'green')               
        break;
      case red:        
        $(red).css('background-color', '#cc0000')                 
        break;
      case yel:        
        $(yel).css('background-color', '#e4e600')                
        break;
      default:        
        $(blue).css('background-color', '#0052cc')                 
        break;
    }

      if (playerMoves.length === 21) {
        alert('You Win!')
      }
      //fail on strict
      else if (checkLoss() && strict) {
        reset();
        setTimeout(simonSaysLv1, 1200);
        $('#strict').css('border-color', '#99ff66')
        $('#count-num').text(simonsMoves.length+1)
      }
      //fail on non strict
      else if (checkLoss()) {
        playerMoves = [];
        setTimeout(function() {
          doSimonMove(0)}, 1200)        
      }
      //back to simon for his turn
      else if (playerMoves.length === simonsMoves.length) {
        speedCheck(simonsMoves.length)
        setTimeout(simonSaysLv1, 1200);
        $('#count-num').text(simonsMoves.length+1); //score
        playerMoves = [];
        simonTurn = true;
        playerTurn = false;      
      }
    }
  }) 

最佳答案

主要问题是在返回传递给 setTimeout 的回调之前,playerTurn 将被设置为 true。 Javascript 代码异步执行。 setTimeout 回调将在当前调用堆栈执行完毕后调用,playerTurn 对 true 的赋值是当前调用堆栈的一部分。请注意,无论您的超时是 0 还是 100000,这都是正确的。

您需要在 setTimeout 回调中添加 turn bool 值,以确保当用户触发点击事件时 playerTurn 变量处于正确状态。对于此程序,这仅意味着您的点击回调中的任何内容都不会执行,因为 if-block 条件将失败。有几种方法可以做到这一点,但一个简单的方法是这样做:

function simonSaysLv1(){   
  simonsMoves.push(Math.floor(Math.random() * (4-1+1)) + 1);
  doSimonMove(0);     
}

function doSimonMove(index){ 

  if(index < simonsMoves.length){
    simonlightUp(simonsMoves[index]);
    setTimeout(function(){
      doSimonMove(index + 1);
      if (index + 1 === simonsMoves.length) {
        playerTurn = true;    
        simonTurn = false;
      }
    }, simonSpeed);
  }
}

关于javascript - 如何防止用户在不是他们的 'turn' 时激活 jquery 点击功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34115242/

相关文章:

html - 用 HTML 表示舞台脚本的最佳方式是什么?

javascript - 如何引用原型(prototype)中定义的函数

javascript - jQuery div 类更改

css - 如何选择最后一个 child 之前的元素?

javascript - 带指令的 Angular 三向按钮

jQuery 插件 .live() 到 .on()

html - 如何为溢出隐藏的div提供填充底部?

javascript - 使用 jquery 将数据加载到服务器

Javascript 格式化异常

javascript - 如何着手创建一个在动画位置和不透明度时立即显示的工具提示?