2016-04-13 32 views
0

您好,我正在處理一個簡單的德州撲克模擬器。我是python的新手,希望能夠在這裏獲得關於我使用類的建議。我覺得我沒有儘可能有效地使用它們,特別是在處理玩家卡時。具體來說,我覺得def deal(self, n_players)可以簡化,而不是使用playercard1和playercard2,並從「deck」中刪除項目?下面是代碼:Python類示例德州撲克效率

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 
+3

我想你想http://codereview.stackexchange.com/代替。這似乎是Stack Overflow的主題。 – LawfulEvil

+0

謝謝,我會在那裏發帖! – jason

回答

1

一些快速評論:

  • flopturnriver都做得差不多了。您可以使用一種方法,從卡組頂部返回一張卡片列表
  • 對於該方法,您可以先取出卡片然後將其取出,然後再撥打list.pop。那麼你永遠不會犯錯誤刪除錯誤的數額
  • 爲了更安全,你可以有不同的類代表遊戲中的不同狀態。這可以確保誰調用你的方法不會以錯誤的順序調用它們。然後你會有一個ShuffledDeckDealtDeck等,每個方法將返回下一個類的一個實例。利用多個返回值,代碼將如下所示。

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