2014-10-28 2 views
0

мой код выглядит примерно так, но у меня есть проблема. Всякий раз, когда выбор один и тот же, игра перезапускается. После окончания игры я получаю предупреждение «undefined», потому что функция startGame() снова запускается с параметрами из первого раунда (где выборы были одинаковыми).Как остановить цикл после того же выбора?

Я новичок в словах JS и хотел бы сохранить это как можно более простым. Может ли кто-нибудь помочь мне, предоставив решение о том, как остановить «неопределенный»?

// the game starts here 
 
function startGame() { 
 
    // the user 
 
    var userChoice = prompt("Do you choose rock, paper or scissors?"); 
 

 
    // if invalid input 
 
    while ((userChoice != "rock") && (userChoice != "paper") && (userChoice != "scissors")) { 
 
    userChoice = prompt("Please select again, this time correctly!"); 
 
    } 
 

 
    alert("You chose " + userChoice); 
 

 
    // computer 
 
    var computerChoice = Math.random(); 
 
    if (computerChoice < 0.34) { 
 
    computerChoice = "rock"; 
 
    } else if (computerChoice <= 0.67) { 
 
    computerChoice = "paper"; 
 
    } else { 
 
    computerChoice = "scissors"; 
 
    } 
 
    alert("Computer pick: " + computerChoice); 
 

 
    // comparison between user and computer 
 
    var compare = function(choice1, choice2) { 
 

 
    // if both selections are the same 
 
    if (choice1 == choice2) { 
 
     alert("Tie, restart the game!"); 
 
     startGame(); 
 
    } 
 

 
    // if the user selects rock 
 
    else if (choice1 == "rock") { 
 
     if (choice2 == "scissors") { 
 
     return "You have won the game!"; 
 
     } else { 
 
     return "LOOOOOSSEEER!"; 
 
     } 
 
    } 
 

 
    // if the user selects scissors 
 
    else if (choice1 == "scissors") { 
 
     if (choice2 == "rock") { 
 
     return "You have won the game!"; 
 
     } 
 
    } else { 
 
     return "LOOOOOSSEEER"; 
 
    } 
 
    }; 
 

 
    alert(compare(userChoice, computerChoice)); 
 
} 
 

 
// startGame();

+0

В вашей сначала 'if', т. е.' if (choice1 == choice2) {..', вы снова запускаете игру, вызывая 'startGame();' явно там. Разве это не нормально для игры для перезапуска в соответствии с вашим кодом? –

+0

Вы должны использовать функцию сравнения только для возврата статуса игры .. и после этого в зависимости от ее значения вы можете либо поставить предупреждение, либо перезапустить startHame fn call. например, var result = compare (ch1, ch2); if (result === "...") {... – Amitesh

+0

@Amitesh Kumar вы можете дать мне пример из моего кода? Я не понимаю, что вы пытаетесь объяснить. –

ответ

1

Вы можете использовать рекурсию здесь. Функция startGame() запускается снова, и первый вызов compare() ожидает оператора return. Но в этом случае if у вас нет никакого выражения возврата вообще.

// if both selections are the same 
if (choice1 == choice2) { 
    alert("Tie, restart the game!"); 
    startGame(); 
} 

Вы решаете это вместо того, чтобы возвращать результат только с предупреждением с инструкциями if. вот jsfiddle (вызов функции комментировал):

http://jsfiddle.net/v5poL9cm/

Edit:

Другой подход, чтобы вернуть сообщение во всех случаях, и пусть функция StartGame() есть оператор возврата, а также. jsfiddle здесь (вызов функции комментировал):

http://jsfiddle.net/65sg7mcL/

0
$(function() { 
    startGame(); 
}); 

// the game starts here 
function startGame() { 
    // the user 
    var userChoice = prompt("Do you choose rock, paper or scissors?"); 

    // if invalid input 
    while ((userChoice != "rock") && (userChoice != "paper") && (userChoice != "scissors")) { 
     userChoice = prompt("Please select again, this time correctly!"); 
    } 

    alert("You chose " + userChoice); 

    // computer 
    var computerChoice = Math.random(); 
    if (computerChoice < 0.34) { 
     computerChoice = "rock"; 
    } else if (computerChoice <= 0.67) { 
     computerChoice = "paper"; 
    } else { 
     computerChoice = "scissors"; 
    } 
    alert("Computer pick: " + computerChoice); 

    // comparison between user and computer 
    var result = compare(userChoice, computerChoice); 
    if (result == "1") { 
     alert("Tie, restart the game!"); 
     startGame(); 
    } else if (result == "2") { 
     alert("You have won the game!"); 
    } else { 
     alert("LOOOOOSSEEER"); 
    } 
} 

// return 1 -- > Tie 
// return 2 -- > You have won 
// return 3 -- > LOOOOOSSEEER 
function compare(choice1, choice2) { 

    // if both selections are the same 
    if (choice1 == choice2) { 
     return "1"; 
    } 
    // if the user selects rock 
    else if (choice1 == "rock") { 
     if (choice2 == "scissors") { 
      return "2"; 
     } else { 
      return "3"; 
     } 
    } 
    // if the user selects scissors 
    else if (choice1 == "scissors") { 
     if (choice2 == "rock") { 
      return "2"; 
     } 
    } else { 
     return "3"; 
    } 
}; 
0

Я согласен с @Escobear! Проблема в том, что вы ничего не возвращаете из своей секции, но перезапускаете игру. В какой-то момент вы вернетесь к вам и попытаетесь оповестить о неопределенности.

Я думаю, что я хотел бы сделать что-то вроде этого:

// comparison between user and computer NOTE: This method is global, but it seemed pointless to redefine it for every game 
 
function compare(choice1, choice2) { 
 
    // if both selections are the same 
 
    if (choice1 == choice2) { 
 
    return -1; 
 
    } 
 

 
    // if the user selects rock 
 
    else if (choice1 == "rock") { 
 
    if (choice2 == "scissors") { 
 
     return 1; 
 
    } 
 
    return 0; 
 
    } 
 

 
    // if the user selects scissors 
 
    else if (choice1 == "scissors") { 
 
    if (choice2 == "rock") { 
 
     return 0; 
 
    } 
 
    return 1; 
 
    } 
 

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

 
// the game starts here 
 
function startGame() { 
 
    // the user 
 
    var userChoice = prompt("Do you choose rock, paper or scissors?"); 
 

 
    // if invalid input 
 
    while ((userChoice != "rock") && (userChoice != "paper") && (userChoice != "scissors")) { 
 
    userChoice = prompt("Please select again, this time correctly!"); 
 
    } 
 

 
    alert("You chose " + userChoice); 
 

 
    // computer 
 
    var computerChoice = Math.random(); 
 
    if (computerChoice < 0.34) { 
 
    computerChoice = "rock"; 
 
    } else if (computerChoice <= 0.67) { 
 
    computerChoice = "paper"; 
 
    } else { 
 
    computerChoice = "scissors"; 
 
    } 
 
    alert("Computer pick: " + computerChoice); 
 

 
    var result = compare(userChoice, computerChoice); 
 

 
    if (result === -1) { 
 
    alert('Tie, restart the game!'); 
 
    startGame(); 
 
    } else { 
 
    alert(result ? 'You have won the game!' : 'LOOOOOSSSEEER!'); 
 
    } 
 
} 
 

 
startGame();

(я также исправлены некоторые логики для победы, и добавил пользовательский ввод = бумага)

Смежные вопросы