【问题标题】:Determine if a function has two pairs判断一个函数是否有两对
【发布时间】:2023-01-28 02:24:37
【问题描述】:

尝试构建一个视频扑克应用程序,我已经完成了大部分的获胜逻辑,但我无法理解两对。

function isTwoPair() {
  const tempHand = [...playerHand];
  let reduceHand = tempHand.reduce((acc, curVal) => {
    if (curVal.rank in acc) {
      acc[curVal.rank]++;
    } else {
      acc[curVal.rank] = 1;
    }
    return acc;
  }, {});
  const sortedHand = Object.fromEntries(Object.entries(reduceHand).sort());
  for (const [key, value] of Object.entries(reduceHand)) {
    let pairs = 0;
    if (value === 2) {
      pairs++;
      if (pairs === 2) {
        return true;
      }
    }
  }
}

我的想法是使用 reduce 来确定每个键具有的值的数量,然后对其进行排序(升序)并循环遍历它。如果任何值等于 2,那么它会将 pairs 变量更新为 1。一旦 pairs 达到 2,它就会返回 true。

什么是更好的方法,或者我应该说的正确方法,因为这不起作用,在给定的对象数组中找到两对。

甲板是一组对象,如下所示:

[
 {
    card: "Ah",
    rank: 14,
    suit: "hearts",
    img: "./images/hearts/hearts-A.svg",
    isHold: false,
 },
]

【问题讨论】:

  • 你的函数应该接受手的争论,而不是在函数外部引用,除非你可以为你实现的特定类公开更多。

标签: javascript javascript-objects poker


【解决方案1】:
function isTwoPair() {
  const reduceHand = reduceHandRank();
  let pair = 0;
  for (const [key, value] of Object.entries(reduceHand)) {
    if (value === 2) {
      pair++;
    }
  }
  if (pair === 2) {
    return true;
  }
}

决心会让你到达那里!热狗!

【讨论】:

  • 不回false
  • true 被传递到一个更大的函数 getWinner();
【解决方案2】:

我会计算每张卡的等级。如果计数大于 2,则返回 false。计数后过滤出为2的值,如果长度等于2则返回

function isTwoPair() {
  let count={}
  for(let i=0;i<playerHand.length;i++){
    let card=playerHand[i]
    if(card.rank in count){
      count[card.rank]+=1
      if(count[card.rank]>2){
        return false
      }
    }else{
      count[card.rank]=1
    }
  }
  return Object.values(count).filter(c=>c==2).length == 2
}

完整示例:

let playerHand = [{
    rank: 14,
    suit: "spades",
    img: "./images/hearts/hearts-A.svg",
    isHold: false,
  },
  {
    rank: 14,
    suit: "hearts",
    img: "./images/hearts/hearts-A.svg",
    isHold: false,
  },
  {
    rank: 14,
    suit: "diamonds",
    img: "./images/hearts/diamonds-A.svg",
    isHold: false,
  },
  {
    rank: 14,
    suit: "clubs",
    img: "./images/hearts/diamonds-A.svg",
    isHold: false,
  },
  {
    rank: 8,
    suit: "hearts",
    img: "./images/hearts/hearts-8.svg",
    isHold: false,
  },
]

function isTwoPair() {
  let count={}
  for(let i=0;i<playerHand.length;i++){
    let card=playerHand[i]
    if(card.rank in count){
      count[card.rank]+=1
      if(count[card.rank]>2){
        return false
      }
    }else{
      count[card.rank]=1
    }
  }
  return Object.values(count).filter(c=>c==2).length == 2
}

console.log(isTwoPair())
playerHand = [{
    rank: 14,
    suit: "hearts",
    img: "./images/hearts/hearts-A.svg",
    isHold: false,
  },
  {
    rank: 14,
    suit: "spades",
    img: "./images/hearts/hearts-A.svg",
    isHold: false,
  },
  {
    rank: 13,
    suit: "clubs",
    img: "./images/hearts/diamonds-A.svg",
    isHold: false,
  },
  {
    rank: 13,
    suit: "diamonds",
    img: "./images/hearts/diamonds-A.svg",
    isHold: false,
  },
  {
    rank: 8,
    suit: "hearts",
    img: "./images/hearts/hearts-8.svg",
    isHold: false,
  },
]
console.log(isTwoPair())

【讨论】:

    【解决方案3】:

    我建议传入playerHand,这样你的函数就可以用于多只手。如果您不熟悉,~~ 具有将非真值变为 0 并保持整数不变的副作用。

    function isTwoPair(playerHand) {
      let counts={};
      playerHand.forEach(hand => counts[hand.rank] = ~~counts[hand.rank]+1);
      let sorted=Object.values(counts).sort();
      return sorted[sorted.length-1]==2 && sorted[sorted.length-2]==2
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 2013-09-09
      相关资源
      最近更新 更多