2017-04-06 2 views
2

蛇のゲームを作成しようとしています。私の問題は、ヘビが食べ物と出会ったとき、マッチがないときです。 xfood_position_xと同じである必要があり、yfood_position_yである必要があります。eat()のコードを確認してください。2つの位置を比較しようとすると一致しません

(function() { 
 
    var canvas = document.getElementById('canvas'), 
 
     ctx = canvas.getContext('2d'), 
 
     x = 0, 
 
     y = 0, 
 
     speed = 1; 
 
     x_move = speed, 
 
     y_move = 0, 
 
     food_position_x = Math.floor(Math.random() * canvas.width); 
 
     food_position_y = Math.floor(Math.random() * canvas.height); 
 

 
    function eat() { 
 
    if (x == food_position_x && y == food_position_y) { 
 
     alert('Match!');  
 
    } 
 
    } 
 
    
 
    // Drawing 
 
    function draw() { 
 
    eat(); 
 
    requestAnimationFrame(function() {  
 
     draw();  
 
    });  
 
    // Draw the snake 
 
    ctx.beginPath(); 
 
    ctx.rect(Math.floor(x/10)*10, Math.floor(y/10)*10, 10, 10); 
 
    ctx.clearRect(0, 0, canvas.width, canvas.height); 
 
    ctx.fillStyle = '#ffffff'; 
 
    ctx.fill(); 
 
    ctx.closePath(); 
 

 
    // Draw the food 
 
    ctx.beginPath(); 
 
    ctx.rect(Math.floor(food_position_x/10)*10, Math.floor(food_position_y/10)*10, 10, 10);  
 
    ctx.fillStyle = "blue"; 
 
    ctx.fill(); 
 
    ctx.closePath(); 
 

 
    // Increase the value of x and y in order to animate 
 
    x = x + x_move; 
 
    y = y + y_move;  
 
    } 
 
    draw(); 
 

 
    // Key Pressing 
 
    document.addEventListener('keydown', function(event) { 
 
    switch(event.keyCode) { 
 
     case 40: // Moving down 
 
     if (x_move != 0 && y_move != -1) { 
 
      x_move = 0; 
 
      y_move = speed; 
 
     } 
 
     break; 
 
     case 39: // Moving right 
 
     if (x_move != -1 && y_move != 0) { 
 
      x_move = speed; 
 
      y_move = 0; 
 
     } 
 
     break; 
 
     case 38: // Moving top 
 
     if (x_move != 0 && y_move != 1) { 
 
      x_move = 0; 
 
      y_move = -speed; 
 
     } 
 
     break; 
 
     case 37: // Moving left 
 
     if (x_move != 1 && y_move != 0) { 
 
      x_move = -speed; 
 
      y_move = 0; 
 
     } 
 
     break; 
 
    } 
 
    }); 
 
})();
canvas { background-color: red; }
<canvas width="500" height="300" id="canvas">

私が間違って何をしているのですか?

+1

それはfood_position_x' 'のように見えると' food_position_y'は任意の整数を指定できますキャンバス上の座標が、あなたのヘビの位置は、あなたが同じの上に食べ物を描いている10によって常に割り切れます10ピクセルグリッドをヘビとして使用していますが、実際の位置は2つのセルの間です。最初のステップとして、あなたがそれを設定するときに、食品の位置を10で割り切れるように強制します。 –

+0

同じことがあなたのスネークの位置になります。あなたは10ピクセルのグリッド上に描画しますが、実際の位置は任意の整数にすることができます。実際にヘビが(82,129)にあり、食品が(85,124)にあるとき(80,120)に描かれた食べ物の上にいるように見えます。 –

答えて

1

以下のコードは動作する解決策です。問題はピクセル単位で測定しているため、正確なピクセル座標が常に一致するとは限りません。それを範囲(10ピクセル、この答えでは、調整することができます)に展開すると、より良い一致をキャッチします。

また、「Match!」が表示されないようにフラグ(matched)を追加しました。スネークが許容範囲内を移動する各ピクセルのメッセージ。

範囲は調整できますが、その範囲は標準のデスクトップモニタでうまくいきます。

(function() { 
 
     var matched = false; 
 
     var canvas = document.getElementById('canvas'), 
 
      ctx = canvas.getContext('2d'), 
 
      x = 0, 
 
      y = 0, 
 
      speed = 1; 
 
      x_move = speed, 
 
      y_move = 0, 
 
      food_position_x = Math.floor(Math.random() * canvas.width); 
 
      food_position_y = Math.floor(Math.random() * canvas.height); 
 

 
     function eat() { 
 
     var xdiff = food_position_x - x; 
 
     var ydiff = food_position_y - y; 
 
     if ((xdiff > -6 && xdiff < 6) && (ydiff > -6 && ydiff < 6) && !matched) { 
 
      alert('Match!'); 
 
      matched = true; 
 
     } 
 
     else if (!(xdiff > -5 && xdiff < 5) && (ydiff > -5 && ydiff < 5)) { 
 
      matched = false; 
 
     } 
 
     } 
 
     
 
     // Drawing 
 
     function draw() { 
 
     eat(); 
 
     requestAnimationFrame(function() {  
 
      draw();  
 
     });  
 
     // Draw the snake 
 
     ctx.beginPath(); 
 
     ctx.rect(Math.floor(x/10)*10, Math.floor(y/10)*10, 10, 10); 
 
     ctx.clearRect(0, 0, canvas.width, canvas.height); 
 
     ctx.fillStyle = '#ffffff'; 
 
     ctx.fill(); 
 
     ctx.closePath(); 
 

 
     // Draw the food 
 
     ctx.beginPath(); 
 
     ctx.rect(Math.floor(food_position_x/10)*10, Math.floor(food_position_y/10)*10, 10, 10);  
 
     ctx.fillStyle = "blue"; 
 
     ctx.fill(); 
 
     ctx.closePath(); 
 

 
     // Increase the value of x and y in order to animate 
 
     x = x + x_move; 
 
     y = y + y_move;  
 
     } 
 
     draw(); 
 

 
     // Key Pressing 
 
     document.addEventListener('keydown', function(event) { 
 
     switch(event.keyCode) { 
 
      case 40: // Moving down 
 
      if (x_move != 0 && y_move != -1) { 
 
       x_move = 0; 
 
       y_move = speed; 
 
      } 
 
      break; 
 
      case 39: // Moving right 
 
      if (x_move != -1 && y_move != 0) { 
 
       x_move = speed; 
 
       y_move = 0; 
 
      } 
 
      break; 
 
      case 38: // Moving top 
 
      if (x_move != 0 && y_move != 1) { 
 
       x_move = 0; 
 
       y_move = -speed; 
 
      } 
 
      break; 
 
      case 37: // Moving left 
 
      if (x_move != 1 && y_move != 0) { 
 
       x_move = -speed; 
 
       y_move = 0; 
 
      } 
 
      break; 
 
     } 
 
     }); 
 
    })();
canvas { background-color: red; }
<canvas width="500" height="300" id="canvas">

+0

あなたの答えをありがとう。私はあなたの解決策をテストしました。何らかの理由で時々私はマッチを得ない。 –

+0

@RezaSaadati範囲を大きくする必要があるかもしれません(-5から5の代わりに、-7から7を試してみてください)。これは、おそらく画面のサイズ/解像度によって変わります。もう一つのアイデアは、Eric Dobbsが提案したものを行い、食べ物とヘビのために10で割り切れるポジションだけを使うことです。 – freginold

関連する問題