Python类示例德州holdem效率

时间:2016-04-13 17:21:49

标签: python class poker

你好我正在研究一个简单的德州扑克模拟器。我是python的新手,希望能在这里得到一些关于我使用类的建议。我觉得我没有尽可能高效地使用它们,特别是在处理玩家卡时。具体来说,我觉得可以简化def deal(self, n_players)而不是使用playercard1和playercard2,并删除" deck&#34 ;?中的项目。这是代码:

from random import shuffle

class TexasHoldem:
    #create deck
    def __init__(self):
    values = ['Ace', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King']
    suites = ['Heart', 'Spade', 'Club', 'Diamond']
    self.deck = [j + " " + i for j in values for i in suites]

    #shuffle deck
    def shuffle(self):
        shuffle(self.deck)

    #deal for players
    def deal(self, n_players):
        count = 0
        #card 1 list (will be shuffled, delt 'around the table' as if a real stack)
        playercard1 = list()
        while count < n_players:
            card1 = self.deck[count]
            playercard1.append(card1)
            count += 1

        #remove cards from deck that were delt 
        for i in playercard1:
            self.deck.remove(i)

         count = 0
         #card 2 list 
         playercard2 = list() 
         while count < n_players:
             card2 = self.deck[count]
             playercard2.append(card2)
             count += 1

         #remove cards from deck delt for 2nd card
         for i in playercard2:
             self.deck.remove(i)

        #merge cards of playercard1 and playercard2 into set     
        self.playerhand = zip(playercard1, playercard2)

    #define the flop    
    def flop(self):
        #burn a card
        del self.deck[0]
        #lay down three
        self.flopcards = self.deck[0:3]
        #delete flop from deck
        for i in self.flopcards:
            self.deck.remove(i)

    #same as flop for turn and river        
    def turn(self):
        del self.deck[0]
        self.turncard = self.deck[0:1]

        for i in self.turncard:   
            self.deck.remove(i)

    def river(self):
        del self.deck[0]
        self.rivercard = self.deck[0:1]

        for i in self.rivercard:
            self.deck.remove(i)

#create instance of Cards class            
c = TexasHoldem()
#shuffle for this instance
c.shuffle()

#deal for n players
c.deal(9)

print 'Player Hands:'
for i in c.playerhand:
    print i

#flop
c.flop()
print 'Flop:'
print c.flopcards

#turn
c.turn()
print 'Turn:'
print c.turncard

#river
print 'River:'
c.river()
print c.rivercard

1 个答案:

答案 0 :(得分:1)

一些快速评论:

  • flopturnriver几乎都在做同样的事情。你可以有一个方法,从你的牌组顶部返回一张牌列表
  • 对于该方法,您可以在调用list.pop的同时执行此操作,而不是首先提取卡然后将其删除。那么你永远不会错误地删除错误的金额
  • 为了更安全,您可以使用不同的类来表示游戏中的不同状态。这样可以确保调用方法的人不会以错误的顺序调用它们。然后,您将拥有ShuffledDeck DealtDeck等,每个方法都将返回下一个类的实例。利用多个返回值,代码如下所示。

    deck = new Deck() # fresh deck
    deck = deck.shuffle() # a shuffled deck
    deck, hand = deck.deal() # a deck without dealt cards