如何使 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 = [{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; } 分支,因为如果手上有五张相邻的牌,如果它们之间有任何间隙,则不是顺子。