1

私はJavaScriptが初めてです。JavaScript の学習 (o'reilly) を通じて作業を進めてきましたが、初めての JavaScript を作成しようとしています。

私は自分が興味を持っていることに取り組むのが最善だと思っていましたが、それはかなり複雑であることが判明しました。

私は基本的に、ジーンスティーラーが彼とスペースマリーンの間に12歩あるスペースハルク(ボードゲーム)の状況を(最終的に)シミュレートしようとしています. 最初のステップでは、いずれかのダイスで 6 でジーンスティーラーを殺し、その後は 5 または 6 で殺します。サイコロの目が同じ場合、銃が詰まります。

ここで最初のステップをエミュレートしようとしています。問題はjamCheckにあると思います。

基本的に、これは != に変更しても常に true として出力され、常に銃が詰まっていることを示します。

変数を別のローカル変数に渡す必要があるかどうか疑問に思いましたが、これを行わなくても 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.floor() は、Math.round() を使用する必要がある「最も近い」整数に丸めたい場合は、切り捨てます (名前について考えてみてください... ceil は切り上げます)。

あなたの場合、6 を掛けて切り捨てると、5 を超える数値は得られません。

私はあなたのコードをちらりと見ただけですが、これはあなたの問題だと思います。

[編集]さらに熟考すると、上記は無視されます。問題は、メソッドが 2 つのパラメーターを想定しているのに、1 つしか渡していないことです。

パラメータの受け渡しの仕組みを誤解していると思います。

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) です。

そして、ボディの onload コールバックから 4 つ (またはそれ以上) のメソッドを呼び出さないように、これをすべて init メソッドにまとめる方法については、kirean の回答を参照してください。

于 2012-04-29T16:39:35.740 に答える
1

ここでいくつか間違ったことをしています。1 つ目は、関数スコープの変数とグローバル スコープの変数を混同していることです。

この機能

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

2 つのパラメーターが必要ですが、ここでは何も渡していませんbody onload="...jamcheck()"

その結果、未定義は未定義と等しいので、もちろん真です。

これに似たラッパー関数が必要です

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

   jamCheck(dice1, dice2)
}

そして、ボディのオンロードでこの関数を呼び出します。

于 2012-04-29T16:48:45.957 に答える