基本JavaScript:计数卡-带字符串的计数卡功能

时间:2018-07-02 19:52:49

标签: javascript conditional

卡功能已被多次解释,据我了解。对于那些不知道的人:我的函数收到一个card参数,该参数可以是数字或字符串。然后,我根据卡的值2、3、4、5、6的增量来递增或递减全局计数变量,而7,8,9则将其保持为0,而10,J,Q,K,A则将其递减。然后,我的函数将返回一个包含当前计数的字符串,如果计数为正,则返回字符串“ Bet”,如果计数为负,则返回“保持”。

因此,我了解该功能是如何完成的,并且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'));

正如我所看到的,第一个条件相当简单且易于定义,其他条件也是如此。在第三种情况下,涉及数字和字符串。这是否意味着当我将任何字符串放入cc时,它会减少吗?如果不是2到6或7到9之间的任何值,会自动减少吗?即使用户输入了不是卡或列表中没有值的东西?

我知道这里有一张预定义的卡值和名称的列表,但是,还有什么更好的方法来限制我的声明,以确保仅当卡为10,J,Q,K时我的条件才会运行或A,没有其他任何值?

7 个答案:

答案 0 :(得分:2)

您可以更改当前的else,以返回并返回错误消息,或者在输入的卡无效时立即返回,并添加另一个else-if(通过Ace检查10):

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
  }

答案 1 :(得分:0)

如果传入的参数与有效的卡不匹配,则可以在函数的顶部使用正则表达式来跳过所有条件并返回方便的消息:

// 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));

答案 2 :(得分: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');

此外,您需要确保处理图片卡的大小写。

答案 3 :(得分:0)

使用.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');

请记住,这是类型敏感的。

答案 4 :(得分:0)

另一种可能性如下所示,它明确列出了每张卡的更改:

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]

答案 5 :(得分:0)

我的基本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
}

答案 6 :(得分:0)

根据我们到目前为止所学到的知识,我的解决方案。 也许这不是最好的,但也可以。

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'));