基本 JavaScript:数牌 - 带字符串的数牌函数

Basic JavaScript: Counting Cards - Card Counting Function with Strings

卡片功能已经解释了很多遍了,明白了。对于那些不知道的人:我的函数接收一个卡片参数,它可以是数字或字符串。然后,我根据卡的值 2、3、4、5、6 递增或递减全局计数变量,7、8、9 将其保持为 0,而 10、J、Q、K、A 将其递减。然后我的函数 returns 一个带有当前计数的字符串,如果计数为正则为 "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'));

正如我所见,第一个条件相当简单且易于定义,else if 也是如此。第三种情况,既有数字也有字符串。这是否意味着当我将任何字符串放入 cc 时,它都会递减?因为任何不在 2 和 6 或 7 和 9 之间的东西都会自动递减?即使用户输入的不是卡片或不是列表中的值?

我知道有一个预定义卡值和名称的列表,但是,有没有更好的方法来调整我的陈述以确保我的条件只有 运行 如果卡是 10 、J、Q、K 或 A,而不是任何其他值?

您可以将当前的 else 更改为 return 和错误消息,或者在输入为无效卡的情况下立即更改为 return,并添加另一个 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
  }

您可以在函数的最顶部使用正则表达式来跳过所有条件,如果传入的参数与有效卡片不匹配,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.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));

有多种方法可以处理这种情况。您最初可以解析输入,然后说将 'J' 分配给 11、'Q' 分配给 12、'K' 分配给 13 和 'A' 分配给 1(如果您需要区分),或者只是该类别的一个普通号码。其他所有内容都是无效输入,您 return immediately/post 一条错误消息。类似于:

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

对于短至 13 个值的列表,我认为这种显式列表更清晰。

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