在Python中按等级和花色排序一手牌

4 投票
1 回答
5449 浏览
提问于 2025-04-17 08:23

我正在制作一款卡牌游戏,现在正处于开发初期。我对如何按照牌的等级和花色来排序手中的牌感到困惑,同时也想减少一些重复的代码。目前我可能需要写一个循环来整理这些牌,然后为每一种可能性写52个不同的条件判断,但我在想有没有更简单的方法来处理这些重复的任务。谢谢大家 :D 下面是我的代码:

from random import shuffle

class deckOfCards:
  def __init__(self):
    self.rank = ['2','3','4','5','6','7','8','9','T','J','Q','K','A']
    self.suit = ['C', 'S', 'H', 'D']
    self.deck = [r+s for r in self.rank for s in self.suit]
    shuffle(self.deck)

  def setValue(self, deck):
    cnt = 1
    self.value = {}
    for i in self.deck:
      self.value[i] = cnt
      cnt += 1

class Deal:
     def __init__(self, deck, position):
         self.hand = deck[position::4]  #divides the deck into 4 hands
         hand = self.hand
     def value(self, key):  # Gives each card that the player has a value
       newHand = {}
       for i in self.hand:
         if i in key:
           newHand[i] = key[i]
       return newHand

deck = deckOfCards()

player1 = Deal(deck.deck, 0)  #######################################
player2 = Deal(deck.deck, 1)  # Example of repetition that I wanted #
player3 = Deal(deck.deck, 2)  # to get rid of if possible           #
player4 = Deal(deck.deck, 3)  #######################################

编辑:我觉得这个方法在排序牌方面效果不错,但我还是不太明白怎么能减少一些重复的代码。感谢大家的帮助 :D

def sortHand(player):
hand = player.hand
for i in hand:
  for i in hand:
    index = player1.hand.index(i)
    if index != 12:
      if deck.value[i] > deck.value[hand[index+1]]:
        hand.insert(index+1, hand.pop(index))

1 个回答

5

我可能会把这个简化一下:

from random import shuffle

class Hand(list):
  pass

class Deck(object):

  rank = '23456789TJQKA'
  suit = 'CSHD'

  def deal(self, n):
    deck = [r+s for r in Deck.rank for s in Deck.suit]
    shuffle(deck)
    return [Hand(sorted(deck[i::n], key=Deck.cmpkey)) for i in xrange(n)]

  @staticmethod
  def cmpkey(card):
    return Deck.rank.index(card[0]), Deck.suit.index(card[1])

print Deck().deal(4)

这样安排后,deal() 的结果就是四个手牌的列表。每一手牌都是先按牌面大小排序,再按花色排序。

(我没有完全理解“值”的逻辑,所以在我的例子中没有包含这部分。)

撰写回答