基本 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'));
卡片功能已经解释了很多遍了,明白了。对于那些不知道的人:我的函数接收一个卡片参数,它可以是数字或字符串。然后,我根据卡的值 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'));