Функция карты объяснялась несколько раз, и я это понимаю. Для тех, кто этого не знает: моя функция получает параметр карты, который может быть числом или строкой. Затем я увеличиваю или уменьшаю глобальную переменную счетчика в соответствии со значением карты 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, а не какое другое значение?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете изменить свой текущий 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'));
Вы можете изменить else на else-if и проверить наличие 10, J, Q, K или A, а затем в своем else сразу же вернуться или показать какое-то сообщение об ошибке, чтобы предупредить пользователя о том, что введенные им данные не являются действительными. карта. Добавляем ответ ниже.