Создание игры в угадывание букв для школьного задания в JavaScript - PullRequest
1 голос
/ 22 марта 2020

Так что я застрял в этом упражнении слишком долго и не уверен, что именно я делаю неправильно. Я испытываю трудности с массивами и включаю в них циклы.

Задача состоит в том, чтобы поместить в массив 10 букв, и пользователь должен угадать хотя бы одну букву справа. После 3 попыток сообщите пользователю, что он потерял, и прекратите выполнение кода.

<!DOCTYPE html>
<html>
<head>
  <title>Exercise 5</title>
  <link rel="stylesheet" type="text/css" href="css/styles5.css"/>
</head>



<body>
  <!--E X C E R S I S E 5 !-->
  <section id="allContent">
    <div id="container">
      <div class="bar1"></div><div id="bar2"></div>
      <h1 id="excersize">E x c e r c i c e &ensp;5</h1>
      <div id="titleBox">
        <p id="titlePRG">Enter five words</p>
      </div>
      <input type="text"   id="textField">
      <form>
        <input type="button" value="Enter" class="button" onclick="getValue()">   
      </form>
      <div id="valueReturned">
        <p id="returnText"><p>
        </div>
        <a href="index6.html"><h3> Next Exercise </h3></a>
      </div>
      <img src ="blank-laptop-png-transparent-pictures-free-icons-graphic-transparent-library-laptop-png-4042_3027.png" alt="laptopGraphic">
  </section>
    <!--E N D   O F   E X C E R c I c E 5 !-->


            <!-- S C R I P T I N G !-->
            <script>
        function getValue(){
          var input = document.getElementById("textField").value;
          var letters  =  ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"] ;
          var a = letters.indexOf(input);


          for(var attempts = 0; attempts < 3; attempts++){

            if(input == ""){
            document.getElementById("valueReturned").innerHTML = "No input!";
            }else if( a >= 0){
              document.getElementById("valueReturned").innerHTML = "You guessed right!";

             break;

            } else if(input != a && attempts == 0){
              document.getElementById("valueReturned").innerHTML = "Two tries left!";
            }else if(input != a && attempts == 1){
              document.getElementById("valueReturned").innerHTML = "One more try!";
            }else if(input != a && attempts == 2){
              document.getElementById("valueReturned").innerHTML = "That was your last try! Get lost!";
            }

            }

           }// end of function
   </script>
   </body>
   </html> 

Итак, если пользователь угадает, я хочу, чтобы код прекратил работать, или, скорее, l oop. Если предположение неверно с первой попытки, то должно появиться сообщение «Осталось две попытки!» Если предположение неверно со второй попытки, то должно появиться сообщение «Одна попытка ушла!» И так далее ...

Пока я не закрывал свои условия с помощью оператора else, не уверенного, нужно ли это. Правильно ли настроен мой For l oop? Если я, то если условия не в порядке?

Мне очень нужна ваша помощь, ребята!

Ответы [ 2 ]

1 голос
/ 22 марта 2020

Проблема в том, что вы повторяете 3 попытки для каждой попытки .

Вам необходимо выполнить глобальную итерацию для всех попыток.

Другими словами, отслеживать попытки за пределами функции, в противном случае каждый раз, когда вызывается функция, вы сбрасываете попытки на 3 - она ​​никогда не будет go.

Вот мой рефакторинг вашего кода, который также исправляет несколько других вещи и оптимизирует его.

(() => {
    let attempts = 3,
        input_el = document.getElementById('textField'),
        result_el = document.getElementById('valueReturned');
    window.getValue = () => {
        let input = input_el.value,
        letters  =  ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
        correct = letters.includes(input),
        msg;

        if (!attempts)
            msg = 'No attempts left!';
        else if (!input)
            msg = "No input!";
        else if(!correct) {
            attempts--;
            switch (attempts) {
                case 2:
                    msg = 'Two tries left!'
                    break;
                case 1:
                    msg = 'One more try!';
                    break;
                case 0:
                    msg = 'That was your last try! Get lost!';
                    break;
            }
        } else
            msg = 'You guessed right!';

        result_el.innerHTML = msg;

    }
})();

Fiddle

Некоторые замечания:

  • Назовите свои переменные ориентировочно
  • Отделите JS от HTML - поместите его в выделенные .js файлы.
  • Используйте let более var в наши дни
  • Рассматривайте централизованную обработку событий, а не встроенную JS через onclick атрибуты. Это также означало бы, что нам не нужно объявлять глобальную функцию в window для вашей onclick для ссылки.
  • Мы заключаем все это в IIFE (выражение функции немедленного вызова), чтобы предотвратить загрязнение глобального пространства имен.
  • Подумайте о том, что не нужно дублировать каждый раз, когда запускается ваше событие. Нам не нужно каждый раз извлекать из DOM ссылки на одни и те же элементы - давайте сделаем это вне функции.
  • array.includes(val) эквивалентно array.indexOf(val) !== -1.
  • I ' Мы также сделали невозможным для пользователей более 3 попыток.
1 голос
/ 22 марта 2020

давайте пройдемся по вашей логике c

<script>
        function getValue(){
          var input = document.getElementById("textField").value;
          var letters  =  ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"] ;
          var a = letters.indexOf(input);

, в этом бите вы открыли тег сценария и объявили функцию getValue. Затем вы получаете входные данные из элемента html с идентификатором "textField", инициализируете массив letters с 10 буквами, затем ищите letters для input, возвращая его индекс. Однако это приводит к тому, что ввод будет прочитан только один раз. Затем он выполнит ваш для l oop в течение трех итераций, создавая потенциально нежелательную ошибку.

Подумайте об этом так,

Ваша функция должна быть где-то запущена. При встраивании в html это будет происходить onclick() для кнопки под входом. это означает, что каждый раз, когда вызывается функция, вход считывается один раз, и l oop запускается три раза на одном и том же входе . Я бы начал с создания переменной вне вашей getValue функции - мы назовем ее attempts - которая позволит нам обновлять переменную при каждом запуске функции. Затем избавьтесь от for для l oop и используйте условное ветвление, например,

var attempts = 0;
function getValue(){
  var input = document.getElementById("textField").value;
  var letters  =  ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"] ;
  var a = letters.indexOf(input);
  if (attempts < 3) {
    // check if input is right
    if (input != "" && a != -1) {
       alert("success");
    }
    attempts += 1;
  }
// no else statement needed to terminate the program
// simply don't handle occurrences of attempts greater than  3
}

Просьба прокомментировать все, что вы не уверены в

...