微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果函数导致飞扬的小鸟随机死亡,则 JavaScript 多重条件出错

如何解决如果函数导致飞扬的小鸟随机死亡,则 JavaScript 多重条件出错

我在 JavaScript 中有以下简单的flappy-bird-clone 游戏,并且在结束游戏的代码中存在逻辑错误(检测碰撞)。

这是我遇到问题的部分:

if (birdY<topPipeBottomY || birdY > (topPipeBottomY + pipeGap) && pipeX < birdSize || birdY > canvasSize){
              birdDY=0;
              biryY=200;
              pipeX=canvasSize;
              score=0;
              alert("boo");
          }

我主要用括号尝试了各种方法,但逻辑不正确。我希望这只鸟只有在与管道相撞或撞到底部时才会死亡。目前,它在通过第二个管道后随机死亡,然后我无法摆脱警报。

我希望指出错误/解决方代码,并清楚地解释出了什么问题。 a) 死亡的逻辑(为什么它会在通过第二组管道时死亡) b) 在死亡时,“警报”似乎处于无限循环中,并在关闭后重新打开。为什么? (请和解决方案)

完整代码

 <body style="height: 100vh; background: #111; text-align: center;">
  <canvas id="c" width="400" height="400"></canvas>
  

          
  <script>
      
    
    context = c.getContext("2d");
    
    const bird = new Image();
    bird.src = "bird.png";
    
    var canvasSize = 400;
    var birdSize=30;
    var birdX = 0;
    var birdY =200;
    var birdDY = 0;
    
    var score = 0;
    var bestscore=0;
    var interval = 30; //the speed at which the game is played
      
    //Makes the bird go UP > a simpler way of writing the below is: c.onclick = () => (birdDY = 9) ;
     c.addEventListener("click",function(){ birdDY = 9; 
    }
      );     
      
    //PIPE VARIABLES
    var pipeX=400;
    var pipeWidth=24;
    var pipeGap=200;
    var topPipeBottomY=24;
      
      
      setInterval(() => {
      context.fillStyle = "skyblue";
      context.fillRect(0,canvasSize,canvasSize); // Draw sky
      birdY -= birdDY -= 0.5; // Gravity
      context.drawImage(bird,birdX,birdY,birdSize,birdSize); // Draw bird (multiply the birdSize by a number to adjust size)
      context.fillStyle = "black";
      context.fillText(`Flappy Birds`,170,10); //x and y
      context.fillText(`score: ${score++}`,350,380); // Draw score
          
    //DRAW PIPES    
      context.fillStyle="green";
     
      context.fillStyle = "green";
      context.fillRect(pipeX,pipeWidth,topPipeBottomY); //top pipe     
      context.fillRect(pipeX,topPipeBottomY + pipeGap,canvasSize); // Draw bottom pipe
      
      pipeX -= 8; // Move pipe
     
          if (pipeX < -pipeWidth) {
            pipeX = canvasSize;
            topPipeBottomY = pipeGap * Math.random();
        }
          
       /*   
        (((birdY < topPipeBottomY || birdY > topPipeBottomY + pipeGap) && pipeX < birdSize * (524/374))// Bird hit pipe?
       || birdY > canvasSize) && // Bird falls off screen
      ((birdDY = 0),(birdY = 200),(pipeX = canvasSize),(score = 0),(alert("boo"))); 
      */

      if (birdY<topPipeBottomY || birdY > (topPipeBottomY + pipeGap) && pipeX < birdSize || birdY > canvasSize){
          birdDY=0;
          biryY=200;
          pipeX=canvasSize;
          score=0;
          alert("boo");
      }
      
       
    },interval)
  </script>
</body>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。