2015-04-06 2 views
2

заявление if (xPos === xGold3 && yPos === yGold3), код каким-то образом не распознает значения для xGold3 и yGold3, а мой код не работает, но если я присвою некоторые значения вручную, например if (xPos === 400 && yPos === 0), тогда код работает. Может ли кто-нибудь сказать мне, что я делаю неправильно? спасибо, используя глобальную переменную для хранения числа (JavaScript)

<!DOCTYPE html> 
<html> 
    <head> 
     <title>P</title> 
     <style> 
      div.box{ width: 600px; height: 400px; border: 5px solid black; 
       margin: auto; position: relative; } 

     </style> 
      <button type="button" onclick="position();setGoldPos();">New Game</button> 
    </head> 

    <body onLoad ="getGoldPos()" onKeyDown = "move(event)"> 
     <script> 
      var dx = 20; 
      var dy = 20; 

      var xPos = 0; 
      var yPos = 0; 

      var xGold3 = 0; 
      var yGold3 = 0; 

      //generates random gold positions at the start of every game 
      function getGoldPos() 
      { 
       xGold3 = Math.floor((Math.random() * 545) + 1); 
       yGold3 = Math.floor((Math.random() * 350) + 1); 
      } 

      //assigns randomly generated position to image "gold3"   
      function setGoldPos() 
      { 
       document.getElementById("gold3").style.top= yGold3 + "px"; 
       document.getElementById("gold3").style.left= xGold3 + "px"; 
      } 

      function position() 
      { 
       kitty = document.getElementById("sprite"); 
       kitty.style.left = xPos+"px"; 
       kitty.style.top = yPos+"px"; 
       if (xPos === xGold3 && yPos === yGold3) 
       { 
        document.getElementById("gold3").style.top= 420 + "px"; 
        document.getElementById("gold3").style.left= 0 + "px"; 
       } 
       setTimeout("position()",10); 
      } 

      function move(event) 
      { 
       var keyPressed = String.fromCharCode(event.keyCode); 
       if ((keyPressed == "W" || keyPressed == "I" || event.keyCode == '38') && yPos >= 2) 
       { 
        yPos -= dy; 
       } 
       else if ((keyPressed == "D" || keyPressed == "L" || event.keyCode == '39') && xPos <=545) 
       { 
        xPos += dx; 
       } 
       else if ((keyPressed == "S" || keyPressed == "K" || event.keyCode == '40') && yPos <= 350) 
       { 
        yPos += dy; 
       } 
       else if ((keyPressed == "A" || keyPressed == "J" || event.keyCode == '37') && xPos >= 3) 
       { 
        xPos -= dx; 
       } 
       } 
     </script> 

     <div STYLE="text-align:center"> <h2> Use WASD or IJKL or arrow keys to move kitty </h2> </div> 

     <div class="box"> 
      <img src="sprite.jpg" alt="kitty" id="sprite" width="40px" 
          style="position: absolute; left: 0px; top: 0px;"> 

     <img id="gold3" src="gold.jpg" style="position:absolute; 
          left: 400; top: 100; width: 30px; height: 35px;"/>     

     </div> 
    </body> 
</html> 
+1

«Uncaught ReferenceError: setMonsterPos не определен " – epascarello

+0

спасибо @epascarello, это не проблема, но я все равно удалил его – Chalupa

ответ

5

Подумайте над этим вопросом. Вы выбираете случайное число, а ваш шаг - на 20. Таким образом, если случайное число не является фактором 20, для них невозможно быть равным.

xGold3: 86 <-- actual value 
xPos: 10, 30, 50, 70, 90, 110 <-- Possible values of X 

С возможными значениями, не представляется возможным для xPos и xGold3 когда-либо быть равным с этим конкретным значением. Когда вы жестко закодировали его до значения в операторе if, 400 было возможным значением для xPos, следовательно, почему это сработало.

Так что вам нужно поместить золото на шаг шага, или вам нужно быть диапазоном.

Таким образом, вам нужно либо изменить генератор случайных чисел на округление до ближайшего коэффициента вашего шага, либо изменить инструкцию if, чтобы узнать, находится ли золото в пределах шага. Проверка должна быть примерно такой: (непроверенный)

if (xGold3 >= xPos && xGold3 < xPos+dx && yGold3 >= yPos && yGold3 < yPos+dy) 
+0

извините, если я не понял часть вашего ответа, но я установил диапазон для генерации случайного числа – Chalupa

+1

Но 0 + 20 (n) никогда не сможет равный 86. – epascarello

+0

@epascarello он говорит диапазон в 'if' проверке не случайное число генератор, я думаю (что означает 'if x> num && x

0

Как я ввел в него, тип переменной не был проблемой.

Это работает ниже! Рабочий JSFiddle https://jsfiddle.net/t7k0a395/

Если вы вычитаете по модулю случайного числа, чтобы сделать его делимым на 20, это будет равно переменной вашего шага 20. Когда он добирается до золота, теперь золото выходит за пределы поля.

xGold3 = Math.floor((Math.random()* 545) + 1); 
yGold3 = Math.floor((Math.random()* 350) + 1); 
xGold3 = xGold3-(xGold3 % 20); 
yGold3 = yGold3-(yGold3 % 20); 

RGecy

REVISED: Может быть, лучше было бы взять мод в xGold3 и дх и сделать то же самое для значений у. Таким образом, если вы изменили dx или dy, вам не нужно будет изменять значение мод.

xGold3 = Math.floor((Math.random()* 545) + 1); 
yGold3 = Math.floor((Math.random()* 350) + 1); 
xGold3 = xGold3-(xGold3 % dx); 
yGold3 = yGold3-(yGold3 % dy); 
+0

Должен быть ответ. Работает на моем конце безупречно! – BGecko

+0

Рабочий JSFiddle: https://jsfiddle.net/t7k0a395/ – BGecko

1

позиция никогда не будет равна с текущим кодом, попробуйте что-то вроде этого вместо того, чтобы увидеть, если оба х и у кошки находятся в пределах 20pxs:

if (Math.abs(xPos - xGold3) <= 20 && Math.abs(yPos - yGold3) <= 20) 
Смежные вопросы