初学者JavaScript

时间:2012-04-29 16:35:30

标签: javascript

我是JavaScript的新手。 我通过学习JavaScript(o'reilly)来完成我的工作,但我只想尝试制作我的第一个JavaScript。

我认为最好能够处理我感兴趣的事情,因为事实证明它非常复杂。

我基本上试图模拟(最终)Space Hulk(Boardgame)中的情况,其中Genestealer在他和Space Marine之间有12步。 在第一步它的6个骰子杀死Genestealer,然后在那5或6杀死。 如果骰子上的数字是相同的,枪就会卡住。

我只想模仿这里的第一步。我认为问题出在 jamCheck

基本上,即使我将其更改为“!”,它也会一直输出!=它始终显示枪声卡住。

我想知道变量是否需要传递到另一个局部变量,但它适用于killCheck而不必这样做。 (我尝试过,虽然我可能做错了)

这里完全有可能存在一些非常简单的错误。

我希望你能提供帮助,或指出我正确的方向。

非常感谢!

        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
        <head>
        <title>SH</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script type="text/javascript">
      //<![CDATA[

    function diceRoll1() {
       iValue = Math.random(); // random number between 0 and 1
       iValue *= 6; // multiply by 6 to move the decimal
       iValue = Math.floor(iValue)+1; // round to nearest integer. +1 to 1-6.
       var roll1 = iValue;
       document.getElementById('result1').innerHTML = 'Dice roll 1 : ' + roll1;
       killCheck (roll1);
       jamCheck (roll1);
       return;
    }

    function diceRoll2() {
       iValue = Math.random(); // random number between 0 and 1
       iValue *= 6; // multiply by 6 to move the decimal
       iValue = Math.floor(iValue)+1; // round to nearest integer. +1 to 1-6.
       var roll2 = iValue;
       document.getElementById('result2').innerHTML = 'Dice roll 2 : ' + roll2;
       killCheck (roll2);
       jamCheck (roll2);
       return;  
    }

    function killCheck(roll1,roll2){
        if (roll1==6 || roll2==6)
        {
        document.getElementById('kill').innerHTML = 'GS KILLED';
        }
        return;
    }

    function jamCheck(roll1,roll2){
        if (roll1 == roll2)
        {
        document.getElementById('jam').innerHTML = 'GUN JAMMED';
        }
        return;
    }   

    //]]>
    </script>
    </head>
    <body onload="diceRoll1();diceRoll2();killCheck();jamCheck();">
      <p id="result1">Dice roll 1</p>
      <p id="result2">Dice roll 2</p>
      <p id="kill">GS ALIVE</p>
      <p id="jam">GUN FINE</p>

    </body>
    </html>

编辑:我最终在朋友的帮助下到达那里;这是当前的代码:

...
function getDiceValue() {
var diceValue = Math.random(); 
diceValue *= 6;
diceValue = Math.floor(diceValue) + 1; 
return diceValue;
}

function killCheck(roll1, roll2) {
if (roll1 === 6 || roll2 === 6) {
document.getElementById('kill').innerHTML = 'GS KILLED';
}
return;
}

function jamCheck(roll1, roll2){
if (roll1 === roll2) {
document.getElementById('jam').innerHTML = 'GUN JAMMED';
}
return;
}

function rollDice() {
var roll1 = getDiceValue(),
roll2 = getDiceValue();
document.getElementById('result1').innerHTML = 'Dice roll 1 : ' + roll1;
document.getElementById('result2').innerHTML = 'Dice roll 2 : ' + roll2;
killCheck (roll1, roll2);
jamCheck (roll1, roll2);
}
//]]>
...
<body onload="rollDice();">

2 个答案:

答案 0 :(得分:4)

Math.floor()向下舍入(考虑名称... ceil向上舍入)如果你真的想要舍入到你需要使用Math.round()的“最接近的”整数。

在你的情况下,如果乘以6并向下舍入,你将永远不会得到高于5的数字。

我怀疑这是你的问题,虽然我只看了你的代码,所以,请原谅我,如果这只是一个错误,而不是你的问题的原因。

[编辑]经过进一步思考,无视上述情况。问题是你的方法需要2个参数,但你只传入一个。

我认为你误解了参数传递的工作方式。

jamCheck(p1, p2){}您的名字与此无关。这些标签仅存在于您的方法中。我怀疑让你困惑的是你为你传入的变量使用相同的标签,以及你方法中的变量。因此,当您调用方法jamCheck(roll1)时,它无法执行它所需的操作,因为它可以处理2个变量。除此之外,你得到的结果只是浏览器试图弥补其语法被破坏的代码。在像C或Java这样的语言中,你甚至无法编译这样的代码;编译器会指出这些行没有任何意义。

所以,解决方案是(类似的)......

var roll1,roll2;

roll1 = diceRoll1();
roll2 = diceRoll2();
jamCheck(roll1,roll2);
killCheck(roll1,roll2);

但是在你的diceRoll方法中,你需要做的最后一件事是return roll1;(或分别是roll2)

看看kirean关于如何在init方法中包装这一切的答案,这样你就不会从body的onload回调中调用4个(或更多)方法。

答案 1 :(得分:1)

你在这里做了一些错误,第一个是将函数范围变量与全局范围变量混淆。

这个功能

function jamCheck(roll1,roll2){
    if (roll1 == roll2)
    {
    document.getElementById('jam').innerHTML = 'GUN JAMMED';
    }
    return;
} 

需要两个参数,但是你在这里传递 none body onload="...jamcheck()"

因此,undefined等于undefined,所以当然是真的。

您需要一个与此类似的包装函数

function executeGame(){
   var dice1 = rollDice1();
   var dice2 = rollDice2();

   jamCheck(dice1, dice2)
}

然后在body onload上调用此函数。