Базовый JavaScript: Подсчет карт - Функция подсчета карт со строками - PullRequest
0 голосов
/ 02 июля 2018

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

Так что я понимаю, как выполняется эта функция, и 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.log(cc(2));
console.log(cc(3));
console.log(cc(7));
console.log(cc('K'));
console.log(cc('A'));

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

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

Ответы [ 6 ]

0 голосов
/ 13 августа 2018

Мое решение для базового 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
}
0 голосов
/ 02 июля 2018

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

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.log(cc(2));
console.log(cc(3));
console.log(cc(7));
console.log(cc('K'));
console.log(cc('A'));

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

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

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

if (!(card in values)) {throw 'Bad card'}
const change = values[card]
0 голосов
/ 02 июля 2018

Определите набор допустимых значений и проверьте, находится ли заданное вами значение в пределах этого набора, используя .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');

Имейте в виду, это чувствительно к типу.

0 голосов
/ 02 июля 2018

Есть несколько способов справиться с этой ситуацией. Сначала вы можете проанализировать ввод и сказать «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');

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

0 голосов
/ 02 июля 2018

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

// 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.log(cc(2));
console.log(cc(3));
console.log(cc(7));
console.log(cc('K'));
console.log(cc('a'));

// Invalid inputs
console.log(cc('e'));
console.log(cc('L'));
console.log(cc(0));
0 голосов
/ 02 июля 2018

Вы можете изменить текущее значение 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
  }
...