首页 > 解决方案 > 根据给定手牌确定所有合法牌手(Big 2)

问题描述

所以,我一直在尝试编写一个函数来对纸牌游戏Big 2中的所有纸牌组合进行排名。

在这个游戏中,花色顺序是:Diamonds --> Clubs --> Hearts --> Spades

一只手通常看起来像这样:

hand = ['3D', '4D', '4H', '7D', '8D', '8H', '0D', '0C', 'JH', 'QC', 'QS', 'KH', 'AS']

在做出所有可能的配对、三倍和单打之后,我使用这个函数对它们进行排名:

rank = {}
suits = {}
count = 3 
suit = 0

for i in "34567890JQKA2":
  rank[i] = count
  count += 1

for i in "DCHS":
  suits[i] = suit
  suit += 2


def percentileCalc(card_input, pair):
  n = 0
  if pair:
    for card in card_input:
      if "S" in card:
        n = 4    
    card = card_input[0]
  else:
    n = suits[card_input[1]]
    card = card_input
  percentile = math.floor(8 * (rank[card[0]] - 3) +  n)
  return percentile


def all_pairs(hand):
  pairs = []
  for i in itertools.combinations(hand, 2):
    result = is_pair(i[0], i[1])
    if result:
      pairs.append(list(i))
  return pairs

def all_triples(hand):
  triples = []
  for i in itertools.combinations(hand, 3):
    result = is_triple(i[0], i[1], i[2])
    if result:
      triples.append(list(i))
  return triples


def buildHand(hand):
  tempList = []
  pairs = ES.all_pairs(hand)
  triples = ES.all_triples(hand)
  final = []
  for select in triples:
      percentile = percentileCalc(select, True)
      tempList.append([3, percentile, select])
  for selection in pairs:
      percentile = percentileCalc(selection, True)
      tempList.append([2, percentile, selection])
  for card in hand:
      percentile = percentileCalc(card, False)
      tempList.append([1, percentile, [card]])
  tempList.sort(key=lambda x : x[1], reverse=True)
  return tempList

如您所见, buildHand 返回我的手牌可能拥有的所有可能卡片组合的列表,并相应地对它们进行排名。

但是,当我尝试构建一个进一步的函数来构建所有可能的合法手牌(没有重复的牌/组合)并将它们的百分位数比较在一起时,我最终会得到一个无法返回正确数量的牌的合并,也没有任何合法的牌手。

我知道这个功能很糟糕,但我不知道该怎么做(假设它是可能的)。

目前的功能是:

def constructor(combinations):
  allHands = []
  for comb in itertools.combination(combinations, 13):
    comb = list(comb)
    for i in comb:
      card = i[1]
      for permutes in comb:
        if card in permutes:
          comb.delete(permutes)
    allHands.append(comb) 
  return allHands

此功能的几个问题:

  1. 它不计算牌的数量(即手牌大小,可以表示为hand_sizes,),导致牌太多
  2. 它不会准确删除所有重复的卡片组合,例如:

    [["AS", "AH"], ["AS", "AC"]]
    

任何帮助,将不胜感激!:)

标签: pythonpython-3.xplaying-cards

解决方案


推荐阅读