1

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

我认为最好做一些我感兴趣的事情,结果证明是相当复杂的。

我基本上是在尝试(最终)模拟 Space Hulk(棋盘游戏)中的一种情况,即基因窃取者与星际战士之间有 12 步。在第一步中,任何一个骰子的 6 都可以杀死基因窃取者,然后是 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();">
4

2 回答 2

4

如果你真的想四舍五入到你需要使用 Math.round() 的“最近”整数,Math.floor() 会向下取整(想想名字...... ceil 向上取整)。

在您的情况下,如果您乘以 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 方法中,这样您就不会从主体的 onload 回调中调用 4 个(或更多)方法。

于 2012-04-29T16:39:35.740 回答
1

您在这里做错了几件事,首先是将函数作用域变量与全局作用域变量混淆。

这个函数

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

需要两个参数,但你在这里没有传入body onload="...jamcheck()"

结果,未定义等于未定义,因此当然是正确的。

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

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

   jamCheck(dice1, dice2)
}

然后在 body onload 上调用这个函数。

于 2012-04-29T16:48:45.957 回答