0

私は JavaScript の学習を始めたばかりで (実際には今日)、入れ子になった if-else ステートメントについて助けていただければ幸いです。練習用に簡単なプログラムを書いてみようと思ったのですが、どのパラメーターを入力したかに関係なく、if ブロック内のすべての if-else ステートメントが実行されるようです。手は感謝されます。再度、感謝します。私のコードは以下です。

編集:私は今それを手に入れました、そして私のやり方の誤りを学びました。コメントやアドバイスを迅速に提供してくれたすべての人に感謝します。

var playerOne = prompt('Choose rock, paper, or scissors'); 
var playerTwo = prompt('Choose rock, paper, or scissors'); 

var fight = function (playerOne, playerTwo)
{ 
    if( playerOne == 'rock' || 'Rock')
    { 
        if (playerTwo == 'paper' || 'Paper')
        {
            alert('Player Two Wins!');
        }
        else if (playerTwo == 'rock' || 'Rock')
        {
            alert('Tie!');
        }
        else
        {
            alert('Player One wins!');
        }
    }

        if(playerOne == 'paper' || 'Paper')
        { 
            if (playerTwo == 'paper' || 'Paper')
            {
                alert('Tie!');
            }
            else if (playerTwo == 'rock' || 'Rock')
            {
                alert('Player One Wins!'); 
            }
            else 
            {
                alert('Player Two  wins!');
            }
        }

        if (playerOne == 'scissors' || 'Scissors')
        {
             if (playerTwo == 'paper' || 'Paper')
             {
                alert('Player One Wins!');
             }
            else if (playerTwo == 'rock' || 'Rock')
            {
                alert('Player Two Wins!');
            }
            else
            {
                alert('Tie!');
            }
        }

};

fight(playerOne, playerTwo); 
4

3 に答える 3

2

何人かが指摘しているように、ifステートメントは次の形式にする必要があります。

if (playerOne == 'paper' || playerOne == 'Paper')

またはより簡潔に:

if (playerOne.toLowerCase() == 'paper')

問題は、playerOne == 'paper' || 'Paper'常に「Truthy」値を返すことです ( Truthy 値と Falsy 値の詳細については、http://11heavens.com/falsy-and-truthy-in-javascript を参照してください)

余談ですが、複数のifステートメントにまったく問題はありませんが、この演習をコーディングする場合、私の方法ではifステートメントが少なくなります (そして、次のようになります)。

var playerOne = prompt('Choose rock, paper, or scissors');
var playerTwo = prompt('Choose rock, paper, or scissors');
var fists = {
    "rock": {
        "beats": "scissors",
        "loses": "paper"
    },
    "paper": {
        "beats": "rock",
        "loses": "scissors"
    },
    "scissors": {
        "beats": "paper",
        "loses": "rock"
    }
}

var fight = function (playerOne, playerTwo) {
    playerOne = playerOne.toLowerCase();
    playerTwo = playerTwo.toLowerCase();

    if (fists[playerOne] === undefined || fists[playerTwo] === undefined) {
        alert('Someone threw an unknown fist!');
    } else if (fists[playerOne].beats === playerTwo) {
        alert('Player One wins!');
    } else if (fists[playerTwo].beats === playerOne) {
        alert('Player Two Wins!');
    } else {
        alert('Tie!');
    }
};

fight(playerOne, playerTwo);

じゃんけんの組み合わせをオブジェクト化することで、コードは非常に読みやすくなります。

于 2013-07-03T17:25:50.153 に答える
1

他のコメントと回答は素晴らしいので、彼らが言ったことを繰り返しません。しかし、あなたはアドバイスを求めましたが、私は最初からあまり多くのifステートメントを使用しないようにしています。プログラミングの大部分は、不要なコードや繰り返しコードを削減する方法を学ぶことです。これには、オブジェクトや配列などのデータ構造が適しています。

var win_conditions = {    //simple object showing which hands beat which
    'rock': 'scissors',
    'paper': 'rock',
    'scissors': 'paper'
}

var fight = function(p1, p2) {
    var result;

    if (!win_conditions.hasOwnProperty(p1) || !win_conditions.hasOwnProperty(p2)) {
        result = false;       //error! user typed something invalid
    } else {
        if (win_conditions[p1] == p2) {
            result = 'Player One wins!';
        } else if (win_conditions[p2] == p1) {
            result = 'Player Two wins!';
        } else {
            result = 'Tie!';
        }
    }

    return result;
}

var fight_result = false;
var prompt_text = 'Choose rock, paper, or scissors';
var playerOne = prompt(prompt_text); 
var playerTwo = prompt(prompt_text); 

//keep asking until the user types a valid option
while (!fight_result) {
    fight_result = fight(playerOne.toLowerCase(), playerTwo.toLowerCase());
}
alert(fight_result);
于 2013-07-03T17:28:51.910 に答える
0

FireBugを使用して JavaScript コードをデバッグすることをお勧めします。コードをデバッグするときは、単純な文字列に変更alert()console.log()てください。playerOne/playerTwo

(あなたの質問に完全に適合するわけではありませんが、学習を続けるなら、全体的に良いアドバイスです。)

于 2013-07-03T17:04:27.307 に答える