如何使 ACE 等于序列中的 14 和 1?
How to make an ACE be equivalent to 14 and to 1 in a sequence?
我正在制作一个扑克游戏,我需要将 5 张牌的序列放入一个包含 7 张牌的数组中。由于有些牌是 Queen、King 或 Ace 之类的数字,因此我将这些值映射到一个单独的数组中,用于比较。在相关案例中,它找到了正确答案。但是如果我按照扑克规则尝试用 A, 2, 3, 4, 5 顺子,我做不到。
const CARD_VALUE_MAP = {
"2": 2,
"3": 3,
"4": 4,
"5": 5,
"6": 6,
"7": 7,
"8": 8,
"9": 9,
"10": 10,
J: 11,
Q: 12,
K: 13,
A: 14,
}
然后我使用此映射通过此代码浏览卡片
for(let i=0; i<6; i++){
if(CARD_VALUE_MAP[finalhand[i].value] === CARD_VALUE_MAP[finalhand[i+1].value]-1){
count++;
if(count === 5){
console.log("straight");
return 500;
}
}
}
- finalhand 看起来像这样:
finalhand = [{suit: '♥', value: '3'},
{suit: '♥', value: 'J'},
{suit: '♥', value: 'Q'},
{suit: '♥', value: 'K'},
{suit: '♥', value: 'A'}
{suit: '♥', value: '10'},
{suit: '♦', value: '4'}]
这是一个 Proof-Of-Concept (POC) 卡值解决方案,可帮助您入门。它有效,但它不是最好的代码。
const CARD_VALUE_MAP = {
"2": 2,
"3": 3,
"4": 4,
"5": 5,
"6": 6,
"7": 7,
"8": 8,
"9": 9,
"10": 10,
J: 11,
Q: 12,
K: 13,
}
const aceValues = function() {
return Object.assign(
Object.assign({}, CARD_VALUE_MAP),
{
AL: CARD_VALUE_MAP[2] - 1, // Ace Low
AH: CARD_VALUE_MAP["K"] + 1, // Ace High
},
);
}();
function rankStraight(hand) {
if (hand.length < 5) {
return [];
}
let cards = [];
for (let card of hand) {
if (card === "A") {
cards.push("AL");
card = "AH";
}
cards.push(card);
}
cards.sort(function(a, b) {
return aceValues[b] - aceValues[a];
});
let straight = [cards[0]];
for (let [i, card] of cards.entries()) {
let last = straight[straight.length - 1];
if (card === last) {
continue;
}
if ((aceValues[last] - aceValues[card]) !== 1) {
straight = [card];
continue
}
if (straight.push(card) >= 5) {
break;
}
if ((straight.length + (cards.length - (i + 1))) < 5) {
break;
}
}
if (straight.length != 5) {
return [];
}
if (straight[0] === "AH") {
straight[0] = "A";
}
if (straight[straight.length - 1] === "AL") {
straight[straight.length - 1] = "A";
}
return straight;
}
let hand = [];
hand = ["A", "K", "Q","J",10];
console.log(rankStraight(hand));
hand = [5, 4, 3, 2, "A"];
console.log(rankStraight(hand));
hand = ["A", 5, 4, 3, 2];
console.log(rankStraight(hand));
hand = ["A", 5, 7, 4, 3, "K", 2, "A"];
console.log(rankStraight(hand));
$ node poker.js
[ 'A', 'K', 'Q', 'J', 10 ]
[ 5, 4, 3, 2, 'A' ]
[ 5, 4, 3, 2, 'A' ]
[ 5, 4, 3, 2, 'A' ]
$
有很多不同的方法可以做到这一点,但根据您已有的,这里是最简单的更改:首先,设置 A: 14
然后对最后一手进行排序(看起来您已经在做).
然后像这样更改代码:
count = 0;
if (CARD_VALUE_MAP[finalhand[0].value] = "2" && CARD_VALUE_MAP[finalhand[6].value] = A) {
count++;
}
for(let i=0; i<6; i++){
if(CARD_VALUE_MAP[finalhand[i].value] === CARD_VALUE_MAP[finalhand[i+1].value]-1){
count++;
if(count === 4){
console.log("straight");
return 500;
}
else{
count = 0;
}
}
}
这会对 low-end 处的 A 进行初始检查,如果存在,则在循环开始之前增加计数。
我还添加了 else { count = 0; }
分支,因为如果手上有五张相邻的牌,如果它们之间有任何间隙,则不是顺子。
我正在制作一个扑克游戏,我需要将 5 张牌的序列放入一个包含 7 张牌的数组中。由于有些牌是 Queen、King 或 Ace 之类的数字,因此我将这些值映射到一个单独的数组中,用于比较。在相关案例中,它找到了正确答案。但是如果我按照扑克规则尝试用 A, 2, 3, 4, 5 顺子,我做不到。
const CARD_VALUE_MAP = {
"2": 2,
"3": 3,
"4": 4,
"5": 5,
"6": 6,
"7": 7,
"8": 8,
"9": 9,
"10": 10,
J: 11,
Q: 12,
K: 13,
A: 14,
}
然后我使用此映射通过此代码浏览卡片
for(let i=0; i<6; i++){
if(CARD_VALUE_MAP[finalhand[i].value] === CARD_VALUE_MAP[finalhand[i+1].value]-1){
count++;
if(count === 5){
console.log("straight");
return 500;
}
}
}
- finalhand 看起来像这样:
finalhand = [{suit: '♥', value: '3'},
{suit: '♥', value: 'J'},
{suit: '♥', value: 'Q'},
{suit: '♥', value: 'K'},
{suit: '♥', value: 'A'}
{suit: '♥', value: '10'},
{suit: '♦', value: '4'}]
这是一个 Proof-Of-Concept (POC) 卡值解决方案,可帮助您入门。它有效,但它不是最好的代码。
const CARD_VALUE_MAP = {
"2": 2,
"3": 3,
"4": 4,
"5": 5,
"6": 6,
"7": 7,
"8": 8,
"9": 9,
"10": 10,
J: 11,
Q: 12,
K: 13,
}
const aceValues = function() {
return Object.assign(
Object.assign({}, CARD_VALUE_MAP),
{
AL: CARD_VALUE_MAP[2] - 1, // Ace Low
AH: CARD_VALUE_MAP["K"] + 1, // Ace High
},
);
}();
function rankStraight(hand) {
if (hand.length < 5) {
return [];
}
let cards = [];
for (let card of hand) {
if (card === "A") {
cards.push("AL");
card = "AH";
}
cards.push(card);
}
cards.sort(function(a, b) {
return aceValues[b] - aceValues[a];
});
let straight = [cards[0]];
for (let [i, card] of cards.entries()) {
let last = straight[straight.length - 1];
if (card === last) {
continue;
}
if ((aceValues[last] - aceValues[card]) !== 1) {
straight = [card];
continue
}
if (straight.push(card) >= 5) {
break;
}
if ((straight.length + (cards.length - (i + 1))) < 5) {
break;
}
}
if (straight.length != 5) {
return [];
}
if (straight[0] === "AH") {
straight[0] = "A";
}
if (straight[straight.length - 1] === "AL") {
straight[straight.length - 1] = "A";
}
return straight;
}
let hand = [];
hand = ["A", "K", "Q","J",10];
console.log(rankStraight(hand));
hand = [5, 4, 3, 2, "A"];
console.log(rankStraight(hand));
hand = ["A", 5, 4, 3, 2];
console.log(rankStraight(hand));
hand = ["A", 5, 7, 4, 3, "K", 2, "A"];
console.log(rankStraight(hand));
$ node poker.js
[ 'A', 'K', 'Q', 'J', 10 ]
[ 5, 4, 3, 2, 'A' ]
[ 5, 4, 3, 2, 'A' ]
[ 5, 4, 3, 2, 'A' ]
$
有很多不同的方法可以做到这一点,但根据您已有的,这里是最简单的更改:首先,设置 A: 14
然后对最后一手进行排序(看起来您已经在做).
然后像这样更改代码:
count = 0;
if (CARD_VALUE_MAP[finalhand[0].value] = "2" && CARD_VALUE_MAP[finalhand[6].value] = A) {
count++;
}
for(let i=0; i<6; i++){
if(CARD_VALUE_MAP[finalhand[i].value] === CARD_VALUE_MAP[finalhand[i+1].value]-1){
count++;
if(count === 4){
console.log("straight");
return 500;
}
else{
count = 0;
}
}
}
这会对 low-end 处的 A 进行初始检查,如果存在,则在循环开始之前增加计数。
我还添加了 else { count = 0; }
分支,因为如果手上有五张相邻的牌,如果它们之间有任何间隙,则不是顺子。