2015-08-21 4 views
3

Я недавно начал изучать JavaScript и работал над окончательным заданием для класса, где мы должны создать игру «Rock, Paper, Scissors». Хотя мне удалось решить один и тот же тип игры на codecademy.com - это было в основном с помощью нескольких функций If Statement и 1. Однако для этого задания мы должны использовать функции, массивы и циклы, сохраняя при этом оценку прогресса каждого игрока, уведомляя пользователя о обновленных оценках, а также предоставляя возможность выйти из игры в любое время ... вот подробное объяснение того, что требуется для этого задания:JavaScript - рок, бумага, ножницы - пользовательский ввод не подтвержден

Написать игру Rock, Paper, Scissors. Ваша задача - создать логику для игры Rock, Paper Scissors. Игра будет приветствовать пользователя и затем запрашивает у пользователя их первого раунда игры, попросив их типа рок, бумагу или ножницы Каждый раунд будет иметь следующие шаги:

  1. пользователю будет предложено ввести , рок, бумага, ножницы или выход
  2. компьютер случайным образом выберет либо рок, бумагу или ножницы и предупреждает пользователь этого выбора
  3. победитель будет объявлен и точка будет вручена победителю.
  4. Пользователь будет предупрежден о текущем счете как для себя, так и для компьютера.
  5. Круглый будет повторяться

Вы должны оценить, победит ли или нет пользователя, теряет или привязывает раунда, на основе правил здесь: http://www.rinkworks.com/games/rps.shtml Игра должна иметь бесконечное количество патронов , пока пользователь не выберет exit в игре . Если пользователь вводит слово exit в приглашение, сообщите пользователю , кто выиграл игру и окончательный счет. В конечном итоге я оставлю архитектуры программы, но для этого требуются: Вы будете иметь необходимо включить условные обозначения, циклы, массивы и использовать вызовы функций и comments для создания этой программы. - компьютер создает новый случайный выбор между камнем, бумагой и ножницами, вызывая функцию, которую вы создаете, чтобы вернуть либо «камень», «бумага», «ножницы» - логика определения победителя раунда содержится внутри функция вам дизайн принять как пользователь и выбор компьютера в качестве параметров

Я проверил это в консоли Chrome для ошибок и проблема, что я имею что код, кажется, работает ... только то, что это компьютер, который является единственным победителем здесь ... следовательно, кажется, что пользовательский ввод полностью игнорируется. Кроме того, если я нажал кнопку «Отмена» я получаю сообщение об ошибке (в соответствии с консоли Хрома) в строке 20 говорил мне:

Не удается прочитать свойство «toLowerCase» нулевых

... Я «в первоначально добавили следующую строку коды по причине, которая должна убедиться, что пользовательский ввод соответствует всем вариантам строчных ...

return userInput.toLowerCase(); 

Когда я удалил.toLowerCase() метод только, чтобы просто вернуть UserInput (а затем побежал код в консоли Chrome снова), я застрял в бесконечном цикле ...

Вот весь мой код:

var choice1Score = 1; 
 
var choice2Score = 1; 
 

 
function compChoice() { 
 
\t var choiceArr = ["rock", "paper", "scissors"]; 
 
\t var random = choiceArr[Math.floor(Math.random() * 3)]; 
 
\t return random; 
 
} 
 

 
function userChoice(){ 
 
\t var userInput = prompt("Please enter your choice of either rock, paper or scissors. To exit, hit the 'Cancel' button."); 
 
\t return userInput.toLowerCase(); 
 
} 
 

 

 
while (userChoice != "Cancel") { 
 

 
    function scoring(choice1, choice2) { 
 
     if (choice1 === choice2) { 
 
      return "The result is a tie."; 
 
     } if (choice1 === "rock") { 
 
      if (choice1 === "scissors") { 
 
       return "Rock wins. Your score is: " + choice1Score++; 
 
      } else { 
 
       return "Paper wins. The computer's score is: " + choice2Score++; 
 
      } 
 
     } if (choice1 === "paper") { 
 
      if (choice1 === "rock") { 
 
       return "Paper wins. Your score is: " + choice1Score++; 
 
      } else { 
 
       return "Scissors win. The computer's score is: " + choice2Score++; 
 
      } 
 
     } if (choice1 === "scissors") { 
 
      if (choice1 === "paper") { 
 
       return "Scissors win. Your score is: " + choice1Score++; 
 
      } else { 
 
       return "Rock wins. The computer's score is: " + choice2Score++; 
 
      } 
 
     } 
 
    } 
 
    alert(scoring(userChoice(), compChoice())); 
 

 
}

Любая помощь, предложения и комментарии будут высоко оценены!

+0

для аварии на отмене, скорейшее возвращение нулевой чтобы показать, что пользователь не вошел ничего. вам понадобится специальный случай для этого – litelite

+1

. Одна проблема, которую я вижу сразу, заключается в том, что в цикле 'while' вы сравниваете строку' cancel' с самой 'function' * * *, в отличие от результата функции. В этом разница между 'while (func! =" Cancel ")' и 'while (func()!= «отменить») '- первый всегда будет равен false –

+1

Вы сценарий не удовлетворяет первому шагу:« Пользователю будет предложено ввести тип, камень, бумага, ножницы ** ИЛИ выйти ** » – Andreas

ответ

-4

Во-первых, это изменить: while (userChoice != "Cancel")

To: while(userChoice != "cancel")

+0

вы читаете это требование? «Игра должна иметь ** бесконечное количество раундов **, пока пользователь не выберет exit в подсказке игры« – Andreas

+0

'userChoice' даже не вызван. он также должен быть 'userChoice()'. это будет inifite loop из-за 'toLowerCase()' по сравнению с Cancel (обратите внимание на капитал C) – litelite

+0

Все еще не называется – litelite

2

Знаете ли вы, что ваш цикл, пока проверка, если "Отмена" не "отменить" вводится? Если вы возьмете нижний регистр «caNCel», он никогда не будет равен «Отмена». Я также замечаю, что userChoice, переменная, не задана или не определена нигде. Предполагая, что вы предоставили весь ваш код, вам нужно продумать, как с этим справиться (СОВЕТ: вы должны вызывать userChoice() только один раз для каждого раунда, так как вам нужно сделать несколько проверок, они вступили в отмена или кто выиграл , вам нужно сначала сохранить его в переменной).

Кроме того, я думаю, вы имеете в виду для вложенных операторов if, которые нужно проверить с выбором2.

Могу ли я предложить вам изучить, как использовать консоль Chrome для отладки с использованием контрольных точек, чтобы вы могли посмотреть на значение переменных в каждой команде, так как Chrome выполняет программу за строкой? Это обе проблемы, которые вы легко поймали бы, если бы взглянули на точные значения, которые использовал Chrome.

2

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

if (choice1 === "rock") { 
    if (choice1 === "scissors") { 
     return "Rock wins. Your score is: " + choice1Score++; 
    } 
    else { 
     return "Paper wins. The computer's score is: " + choice2Score++; 
} 

Вторая линия должна быть if (choice2 === "scissors") {

1

Когда вы нажмете кнопку «Отмена», prompt() возвращается null, так userInput имеет нулевое значение, что приводит к ошибке. Вместо того, чтобы проверить, является ли выбор пользователя равным "Cancel", проверьте, userInput - null. Если это так, остановите игру.

Кроме того, в scoring у вас есть три опечатки, в которых вы вводите choice1 по выбору компьютера. Помните, что выбор компьютера составляет choice2, когда вы их передавали, а не choice1.

Кроме того, не помещайте scoring() в свою петлю while, потому что тогда scoring() воссоздается снова и снова каждый раз, когда игрок играет в игру. Это намного менее эффективно, чем просто создать его, поставив его снаружи.

var choice1Score = 1; 
 
var choice2Score = 1; 
 

 
function compChoice() { 
 
\t var choiceArr = ["rock", "paper", "scissors"]; 
 
\t var random = choiceArr[Math.floor(Math.random() * 3)]; 
 
\t return random; 
 
} 
 

 
function userChoice(){ 
 
\t var userInput = prompt("Please enter your choice of either rock, paper or scissors. To exit, hit the 'Cancel' button."); 
 
\t //If userInput is null, return null: 
 
\t if (userInput == null) return null; 
 
\t //Otherwise, return the lowercase version of userInput: 
 
\t return userInput.toLowerCase(); 
 
} 
 

 
function scoring(choice1, choice2) { 
 
    if (choice1 === choice2) { 
 
     return "The result is a tie."; 
 
    } if (choice1 === "rock") { 
 
     if (choice2 === "scissors") { 
 
      return "Rock wins. Your score is: " + choice1Score++; 
 
     } else { 
 
      return "Paper wins. The computer's score is: " + choice2Score++; 
 
     } 
 
    } if (choice1 === "paper") { 
 
     if (choice2 === "rock") { 
 
      return "Paper wins. Your score is: " + choice1Score++; 
 
     } else { 
 
      return "Scissors win. The computer's score is: " + choice2Score++; 
 
     } 
 
    } if (choice1 === "scissors") { 
 
     if (choice2 === "paper") { 
 
      return "Scissors win. Your score is: " + choice1Score++; 
 
     } else { 
 
      return "Rock wins. The computer's score is: " + choice2Score++; 
 
     } 
 
    } 
 
} 
 

 
//Keep looping infinitely: 
 
while (true) { 
 
    //Get the user's choice: 
 
    var curUserChoice = userChoice(); 
 
    //If the user's choice is clicking the "Cancel" button, exit: 
 
    if (curUserChoice == null) break; 
 
    //Otherwise, play the game and alert the user: 
 
    alert(scoring(curUserChoice, compChoice())); 
 
}

+0

Почему вы перешли определение 'scoring()'? И вы изменили правила (см. Шаг 1: «... ** exit **») – Andreas

+0

Не помещайте функцию внутри цикла while. Кроме того, я действительно не изменял правила; Я просто реализовал его так, как вам показалось, что вы этого хотели. Я сделал так, чтобы пользователь мог выйти, нажав кнопку «Отмена». –

+0

Кроме того, причина, по которой вы не должны помещать функцию внутри цикла while, если вам действительно не нужно, потому что эта функция воссоздается каждый раз, когда вы проходите через цикл while, который намного менее эффективен, чем просто создавать его один раз ставя его снаружи. –

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