Базовый JavaScript: Подсчет карт - функция подсчета карт со строками

Функция карты объяснялась несколько раз, и я это понимаю. Для тех, кто этого не знает: моя функция получает параметр карты, который может быть числом или строкой. Затем я увеличиваю или уменьшаю глобальную переменную счетчика в соответствии со значением карты 2, 3, 4, 5, 6 приращений, 7,8,9 сохраняет ее на 0, а 10, J, Q, K, A уменьшает. Затем моя функция возвращает строку с текущим счетчиком и строку «Ставка», если счет положительный, или «Удерживать», если он отрицательный.

Итак, я понимаю, как выполняется функция, и FreeCodeCamp принял мое решение, поскольку технически оно соответствует их условиям. Но есть вопрос относительно этой функции:

var count = 0;

function cc(card) {
  if (card >= 2 && card <= 6) {
    count++;
  } else if (card >= 7 && card <= 9) {
    count += 0;
  } else {
    count--;
  }

  if (count <= 0) {
    return count + " Hold";
  } else {
    return count + " Bet";
  }
}

console.info(cc(2));
console.info(cc(3));
console.info(cc(7));
console.info(cc('K'));
console.info(cc('A'));

Как я вижу, первое условие довольно просто и легко определить, как и else if. В третьем случае задействованы как числа, так и строки. Не означает ли это, что когда я помещаю ЛЮБУЮ строку в cc, она будет уменьшаться? Как все, что не находится между 2 и 6 или 7 и 9, будет автоматически уменьшаться? Даже если пользователь вводит что-то, что не является картой или не является значением из списка?

Я понимаю, что существует список предопределенных значений и имен карт, но, тем не менее, есть ли лучший способ обусловить мое утверждение, чтобы убедиться, что мое условие будет выполняться ТОЛЬКО, ЕСЛИ карта 10, J, Q, K или A, а не какое другое значение?

Вы можете изменить else на else-if и проверить наличие 10, J, Q, K или A, а затем в своем else сразу же вернуться или показать какое-то сообщение об ошибке, чтобы предупредить пользователя о том, что введенные им данные не являются действительными. карта. Добавляем ответ ниже.

Ryan Wilson 02.07.2018 21:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
1 003
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Вы можете изменить свой текущий else, чтобы вернуть и сообщение об ошибке или просто вернуться немедленно в случае, если ввод является недействительной картой, и добавить еще один else-if для проверки 10 через Ace:

if (card >= 2 && card <= 6) {
    count++;
  } else if (card>=7 && card <=9) {
    count+= 0;
  } else if (card === 10 || card === 'J' || card === 'Q' || card === 'K' || card === 'A'){
    count--;
  }else {
    //Either just return or alert an error message and return
  }

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

// Check if card is valid
var cardRegex = /^(10|[2-9AJQK])$/i;
if (!cardRegex.test(card)) { 
    return "Invalid Card";
}

Итак, в контексте вашего кода это будет выглядеть так:

var count = 0;

function cc(card) {
  
  // Check if card is valid
  var cardRegex = /^(10|[2-9AJQK])$/i;
  if (!cardRegex.test(card)) { 
    return "Invalid Card";
  }
  
  if (card >= 2 && card <= 6) {
    count++;
  } else if (card >= 7 && card <= 9) {
    count += 0;
  } else {
    count--;
  }

  if (count <= 0) {
    return count + " Hold";
  } else {
    return count + " Bet";
  }
}

// Valid inputs
console.info(cc(2));
console.info(cc(3));
console.info(cc(7));
console.info(cc('K'));
console.info(cc('a'));

// Invalid inputs
console.info(cc('e'));
console.info(cc('L'));
console.info(cc(0));

Есть несколько способов справиться с этой ситуацией. Вы можете сначала проанализировать ввод и сказать, что «J» - 11, «Q» - 12, «K» - 13 и «A» - 1 (если вам нужно различать), или просто общее число для этой категории. Все остальное является недопустимым вводом, и вы немедленно возвращаете / отправляете сообщение об ошибке. Что-то вроде:

var count = 0;

function cc(card) {

  if (card == 'J' || card == 'Q' || card == 'K' || card == 'A')
     card = 11;

  if (card >= 2 && card <= 6) {
    count++;
  } else if (card>=7 && card <=9) {
    count+= 0;
  } else if (card >= 10 && card <= 11) {
    count--;               // to keep structure cleaner we use dummy 11 value
  } else
    //error message

  if (count <= 0) {
    return count + " Hold";
  } else {
    return count + " Bet";
  }
}


cc(2); cc(3); cc(7); cc('K'); cc('A');

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

Определите набор допустимых значений и проверьте, находится ли заданное вами значение в пределах этого набора, используя .includes(). Например:

var count = 0;

function cc(card) {
  // Only change code below this line

  const up = [2,3,4,5,6];
  const no = [7,8,9];
  const down = [10, "J", "Q", "K", "A"];

  if (up.includes(card))count++;
  if (down.includes(card))count--;

  const str = count > 0 ? "Bet" : "Hold";

  return `${count} ${str}`;

  // Only change code above this line
}

// Add/remove calls to test your function.
// Note: Only the last will display
cc(2); cc(3); cc(7); cc('K'); cc('A');

Имейте в виду, что это зависит от типа.

Другая возможность - это что-то вроде следующего, в котором явно перечислены изменения для каждой карты:

const counter = () => {
  let count = 0
  let values = {2: 1,  3:  1,  4:  1,  5:  1,  6:  1,  7: 0,  8: 0, 
                9: 0, 10: -1,  J: -1,  Q: -1,  K: -1,  A: -1}
  
  return (card) => {
    const change = values[card] || 0 // no change if card is, say, 'XYZ' or 'Joker'
    count += change
    return count <= 0 ? 'Hold' : 'Bet'
  }
}

const cc = counter();

console.info(cc(2));
console.info(cc(3));
console.info(cc(7));
console.info(cc('K'));
console.info(cc('A'));

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

Это также инкапсулирует переменную count в закрытие. Я считаю это чище, чем глобальная переменная.

Там, где в комментарии говорится о джокерах, вам может потребоваться более надежная обработка ошибок:

if (!(card in values)) {throw 'Bad card'}
const change = values[card]

Мое решение для базового JavaScript: подсчет карт

function cc(card) {
// Only change code below this line
if (card >= 2 && card <= 6) {
 count++;
} else if (card === 10 ||card === 'J' || card === 'Q' || card === 'K' || card === 'A') {
 count = count - 1;
}

if (count > 0) {
 return count + ' Bet';
}
return count + ' Hold';
// Only change code above this line
}

Мое решение, основанное на том, что мы узнали до сих пор. Возможно, это не лучший вариант, но он тоже работает.

var count = 0;

function cc(card) {
  // Only change code below this line
switch(card){
  case 2:
  case 3:
  case 4:
  case 5:
  case 6:
    count++;
    break
  case 7:
  case 8:
  case 9:
    count = count;
    break
  case 10:
  case 'J':
  case 'Q':
  case 'K':
  case 'A':
    count--;
    break;
}
   if (count <=0) {
    return count + ' Hold';
  }
  else {
    return count + ' Bet'
  }
  // Only change code above this line
}

console.info(cc(2)); 
console.info(cc(3)); 
console.info(cc(7)); 
console.info(cc('K'));
console.info(cc('A'));

Другие вопросы по теме