2014-01-06 2 views
0

Я нахожусь на уроке codecademy (найдено here), но продолжает говорить мне: «Ваш код вернул« роковые победы »вместо« бумажных побед », когда входы бумаги и камня», почему? Это должно быть правильно. Поскольку речь идет о «рок-победах», тогда речь идет о скале против ножниц. Так почему же он говорит, что «вместо бумажных побед», когда нет даже бумаги, участвующей в единственном исходе «роковых побед»?Скамья, бумага, ножницы в JavaScript

var compare = function (choice1, choice2) { 

    if (choice1 === choice2) { 
     return("The result is a tie!"); 
    } 

    if (choice1 === "rock") { 
     if (choice2 === "scissors"); 
    } else { 
     return ("rock wins"); 
    } 

    if (choice1 === "paper") { 
     if (choice2 === "rock"); 
    } else { 
     return ("paper wins"); 
    } 

    if (choice1 === "paper") { 
     if (choice2 === "scissors"); 
    } else { 
     return ("scissors wins"); 
    } 

}; 
+3

'if (choice1 ===" paper ") {if (choice2 ===" rock "); } 'не так, как вы проверяете, являются ли оба условия истинными или что вы пытаетесь сделать с этим. Читайте на логических операциях: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators –

+0

Возможно, это поможет - http://bit.ly/19NPQLh –

+0

Задача с запятой после 'if'. – elclanrs

ответ

3

Посмотрите на свой первое условие:

if (choice1 === "rock") { 
    if (choice2 === "scissors"); 
} else { 
    return ("rock wins"); 
} 

choice1 Так что, если это рок, вы входите в if -блок (который на самом деле не возвращать ничего, но так как в этом случае choice1 фактически "paper" он отправляется в else -block, что безоговорочно возвращает "rock wins". Попробуйте реорганизовать это, чтобы это было примерно так:

if (choice1 === choice2) { 
    return("The result is a tie!"); 
} 

if (choice1 === "rock") { 
    if (choice2 === "scissors") { 
     return ("rock wins"); 
    } else { 
     return ("paper wins"); 
    } 
} 

if (choice1 === "paper") { 
    if (choice2 === "rock") { 
     return ("paper wins"); 
    } else { 
     return ("scissors wins"); 
    } 
} 

if (choice1 === "paper") { 
    if (choice2 === "scissors") { 
     return ("scissors wins"); 
    } else { 
     return ("rock wins"); 
    } 
} 

Но, эй, давай прикинемся. Попробуйте положить свой выбор в массив:

var choices = ["rock", "paper", "scissors"]; 

Теперь обратите внимание, что элемент вправо всегда побеждает пункт слева (если мы считаем, что массив обтекает). Как мы можем использовать это для упрощения кода? Ну, мы можем просто сравнить показатели каждого выбора, следя за тем, чтобы справиться с краевым случаем ножниц против рока:

var x = choices.indexOf(choice1), 
    y = choices.indexOf(choice2); 
if (x === y) { 
    return("The result is a tie!"); 
} else if (x > y) { 
    if (x == 3 && y == 0) { 
     return choice2 + " wins"; 
    } else { 
     return choice1 + " wins"; 
    } 
} else { 
    return choice2 + " wins"; 
} 

Но мы можем использовать remainder operator (%) здесь, чтобы обработать случай краев более легко:

var choices = ["rock", "paper", "scissors"]; 
var compare = function (choice1, choice2) { 
    var x = choices.indexOf(choice1), 
     y = choices.indexOf(choice2); 
    if (x === y) { 
     return("The result is a tie!"); 
    } 

    return (((x - y) % 3) > 0 ? choice1 : choice2) + " wins"; 
} 
+0

Хороший ответ. Вы могли бы рассмотреть возможность использования else-if на первичных условиях –

0
if (choice1 === "rock") { 
    if (choice2 === "scissors"); 
} else { 
    return ("rock wins"); 
} 

Посмотрите на это снова. Вы говорите:

IF Choice1 === рок, ТОГДА IF Choice2 === ножницы ТОГДА ДЕЛАТЬ НИЧЕГО не ELSE (Choice1 не рок) возвращение 'рок' побеждает

Это тот случай, когда явные скобки помог бы. Я предполагаю, что вы имели в виду, чтобы сделать это:

if (choice1 === "rock") { 
    if (choice2 === "scissors") { 
    } 
} else { 
    return ("rock wins"); 
} 
1

Ваша функция всегда будет возвращать «рок победы», когда Choice1 не «рок». Это связано с тем, что вы использовали инструкцию if-else.

Что вы делаете: если Choice1 рок сделать что-то -то еще возвращение «рок победы»

Я дам вам первое заявление:

if (choice1 === "rock") { 
     if (choice2 === "scissors") return ("rock wins"); 
     if (choice2 === "paper") return ("Paper wins"); 
    } 
0

если данные очень контролируется, вы можете просто сделать:

если в (CHOICE1 + "" + Choice2) вы найдете "кс", "Rr" или "SP", вы Choice1 выиграна, еще потерял (пример ниже)

function getWinner(choice1, choice2){ 
    var both_str, after_removing; 

    if(choice1 == choice2){ 
     return "The result is a tie!"; 
    } 

    both_str = (choice1 + "" + choice2); 
    after_removing = both_str.replace(RegExp("ks|rr|sp", "g"), ""); 

    return (choice1 + ((both_str.length - after_removing.length) ? " won" : " lost")); 
} 

И вы получите следующие результаты:

console.log(getWinner("scissors", "paper")); //scissors won 
console.log(getWinner("rock", "scissors")); //rock won 
console.log(getWinner("paper", "rock")); //paper won 

console.log(getWinner("scissors", "rock")); //scissors lost 
console.log(getWinner("rock", "paper")); //rock lost 
console.log(getWinner("paper", "scissors")); //paper lost 

console.log(getWinner("scissors", "scissors")); //The result is a tie! 
console.log(getWinner("rock", "rock")); //The result is a tie! 
console.log(getWinner("paper", "paper")); //The result is a tie! 
1

jsFiddle Demo

Есть интересные варианты, которые вы сделали при использовании операторов if. После них не должно быть полуколонок. Кроме того, логическая композиция может работать при использовании множества операторов if, then else. Часто в этих ситуациях лучше использовать switch case statementMDN.

var compare = function (choice1, choice2) { 
if(choice1==choice2)return "The result is a tie!"; 
switch(choice1+choice2){ 
    case "rockscissors": case "scissorsrock": 
     return "rock wins"; 
    case "rockpaper": case "paperrock": 
     return "paper wins"; 
    default: return "scissors wins"; 
} 
}; 
Смежные вопросы