Как написать счетчик ОСТАЛОСЬ попыток 3

104
30 ноября 2020, 00:40

Вот мой скрипт. Не могу понять почему после ввода продолжает проверять цикл? Задача следущая: При посещении страницы, необходимо попросить пользователя ввести свой пароль, после чего проверить содержит ли массив passwords пароль введенный пользователем. Пароль можно ввести не верно всего n раз.

написал вот такой скипт:

const passwords = ['qwerty', '111qwe', '123123', 'r4nd0mp4zzw0rd'];
let attemptsLeft = 3;
let i=1;
let input;
while (i <= attemptsLeft) {
  input = prompt('Введите пароль:');
  if (input === null) {
    break;
  }
  for (const pass of passwords) {
    if (pass === input) {
      alert('Добро пожаловать!');
      break;
    } 
    else if (i < attemptsLeft) {
      alert(`Неверный пароль, у вас осталось ${attemptsLeft - i} попыток`);
      break;
    } else {
      alert('У вас закончились попытки, аккаунт заблокирован!');
      break;
    }
  }
  i += 1;
}
Answer 1

break останавливает ближайший к нему цикл. В вашем случае это for, так что while продолжает работать. По этому можно либо использовать метки, либо вынести часть с условным выражением из цикла.

про метки https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/label

про Array.prototype.some() https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/some

const passwords = ['qwerty', '111qwe', '123123', 'r4nd0mp4zzw0rd']; 
let attemptsLeft = 3, 
    i = 1, 
    input; 
 
while (i <= attemptsLeft) { 
  input = prompt('Введите пароль:'); 
 
  if (input === null) { 
    break; 
  } 
   
  if(passwords.some(password => password === input)){ 
      alert('Добро пожаловать!'); 
      break; 
  } else if (i < attemptsLeft) { 
      alert(`Неверный пароль, у вас осталось ${attemptsLeft - i} попыток`); 
  } else { 
      alert('У вас закончились попытки, аккаунт заблокирован!'); 
  } 
   
  i += 1; 
}

Answer 2
const passwords = ['qwerty', '111qwe', '123123', 'r4nd0mp4zzw0rd'];
let attemptsLeft = 3;
let i=1;
let input;
let isAllow = false;
main_loop:
while (i <= attemptsLeft) {
  input = prompt('Введите пароль:');
  if (input === null) {
    break;
  }
  for (const pass of passwords) {
    if (pass === input) {
      isAllow = true;
      break main_loop;
    } 
  }
  alert(`Неверный пароль, у вас осталось ${attemptsLeft - i} попыток`);
  i += 1;
}
if (isAllow) {
    alert('Добро пожаловать!');
}
else {
    alert('У вас закончились попытки, аккаунт заблокирован!');
}
READ ALSO
Проблема конкатенации media правил

Проблема конкатенации media правил

Дело в том что при построении кода таким образом, когда @media правила разбросаны по всем файлам, появляется потребность в их конкатенации в одно...

111
галерея на grid css

галерея на grid css

есть галерея выполненная на css grid

138
Qt/C++ динамическая надпись на 3D текстуре куба

Qt/C++ динамическая надпись на 3D текстуре куба

Пробую работать с Qt 3D C++ и понадобилось выводить динамически созданную надпись на текстуру кубаКод для отрисовки куба:

114
Как преобразовать строку в массив int?

Как преобразовать строку в массив int?

Нужно преобразовать строку(количество элементов не известно) в массив типа int и вывести i-тый элемент массива

131