在Python中按等级和花色排序一手牌
我正在制作一款卡牌游戏,现在正处于开发初期。我对如何按照牌的等级和花色来排序手中的牌感到困惑,同时也想减少一些重复的代码。目前我可能需要写一个循环来整理这些牌,然后为每一种可能性写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()
的结果就是四个手牌的列表。每一手牌都是先按牌面大小排序,再按花色排序。
(我没有完全理解“值”的逻辑,所以在我的例子中没有包含这部分。)