2013-01-11 23 views
0

我想寫一個基本的紙牌遊戲的樂趣,但試圖儘可能多地適用於未來的紙牌遊戲。這裏是我的代碼。Python:從功能中追加一個實例屬性

decks = [ ] 
players = [ ] 

class Player: 
global players 
def __init__(self, name): 
    self.hand = [ ] 
    self.name = '' 
    self.score = 0 
    self.name = 'playerX' 
    self.score = 0 
    players.append(name) 


class Deck: 
    global decks 
    global players 

def __init__(self, name): 
    self.SUITS = [ 'C', 'D', 'H', 'S' ] 
    self.RANKS = [ '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A' ] 
    self.deck = [ ] 
    for r in self.RANKS: 
     for s in self.SUITS: 
      self.deck.append((r, s)) 
    decks.append(name) 

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

def display(self): 
    for e in range(0, len(self.deck), 4): 
     for i in self.deck[e:e+4]: 
      print i, 
     print 

def dealXtoOne(number, deck, player): 
    ''' number of cards from a deck to named player''' 
    if len(deck.deck) >= number: 
     for n in range(0, number): 
      player.hand.append(deck.deck.pop()) 
      print 'Player1 hand: ', p1.hand 
    else: 
     return 'Insufficient cards in the deck.' 

def dealXtoEach(number, deck): 
    ''' number of cards from a deck to each player''' 
    global players 
    print 'debug 0' 
    if len(deck.deck) >= number*len(players): 
     print 'debug 1' 
     for cards in range(0, number*len(players)): 
      print 'debug 2' 
      for player in players: 
       print 'debug 3' 
       print player 
       print player.hand 
       player.hand.append(deck.deck.pop()) 
       print player.hand 
    else: 
     return 'Insufficient cards in the deck.' 



def value(card): 
    if card[ 0 ] == 'J': return 11 
     elif card[ 0 ] == 'Q': return 12 
     elif card[ 0 ] == 'K': return 13 
     elif card[ 0 ] == 'A': return 14 
     else: return card[ 0 ] 

def topCard(deck): 
    return deck.deck[ -1 ] 

def color(card): 
    if card[ 1 ] in [ 'Diamonds', 'Hearts' ]: 
     return 'Red' 
    else: 
     return 'Black' 


p1 = Player('p1') 
p2 = Player('p2') 
d = Deck('d') 

d.display() 
print p1.hand 
dealXtoOne(3, d, p1) 
d.display() 
print p1.hand 
dealXtoEach(3, d) 
d.display() 

我敢肯定它是垃圾,它顯然是一項正在進行的工作,但我自學編程。對不起,如果你的眼睛流血!

因此,將X卡交給一個玩家可以正常工作,但是將X卡交給N個玩家都行不通。這裏是我的輸出:

('2', 'C') ('2', 'D') ('2', 'H') ('2', 'S') 
('3', 'C') ('3', 'D') ('3', 'H') ('3', 'S') 
... 
('K', 'C') ('K', 'D') ('K', 'H') ('K', 'S') 
('A', 'C') ('A', 'D') ('A', 'H') ('A', 'S') 
[] 
Player1 hand: [('A', 'S')] 
Player1 hand: [('A', 'S'), ('A', 'H')] 
Player1 hand: [('A', 'S'), ('A', 'H'), ('A', 'D')] 
('2', 'C') ('2', 'D') ('2', 'H') ('2', 'S') 
... 
('K', 'C') ('K', 'D') ('K', 'H') ('K', 'S') 
('A', 'C') 
[('A', 'S'), ('A', 'H'), ('A', 'D')] 
debug 0 
debug 1 
debug 2 
debug 3 
p1 

Traceback (most recent call last): 
    File "C:\Users\11583\Desktop\Personal\cardgame.py", line 94, in <module> 
     dealXtoEach(3, d) 
    File "C:\Users\11583\Desktop\Personal\cardgame.py", line 60, in dealXtoEach 
     print player.hand 
AttributeError: 'str' object has no attribute 'hand' 

我可以告訴大家,它不喜歡,我想一個元組追加到由玩家全局變量的字符串表示的播放器實例的dealXtoEach函數內部參考。 Sheesh,我只是解釋它而感到困惑。

那麼我該如何解決這個問題?

感謝

回答

2

該錯誤無關,與附加到一個元組(順便說一句,players是一個列表不是tuple-這是不可能的追加到一個元組)。

相反,嘗試更換行:

players.append(self) 

players.append(name) 

這樣,全球players名單將不包含字符串列表(你不能多用),它將包含一個Player對象(其中包含hand屬性)的列表。


一個額外注:全球players名單是不是真的有必要(和全局變量,通常建議不要) - 你可以只通過各地的players列表。其次,dealXToOnedealOneToEach實際上應該是Deck類的方法。總之,這將使最後幾行看起來像:

players.append(name) 

替換爲:由於該行的

players = [p1, p2] 
d.dealXToOne(3, p1) 
d.dealXToEach(e, players) 
+0

你是什麼意思「傳球員列表」?我知道全球變數令人不悅。 – Clay

+0

@ user1515663:查看我的代碼示例「dealXToEach(e,players)' - 使'players'成爲函數的參數 –

+0

謝謝,我不明白你在做什麼。它的工作原理與我現在想要的非常相似。 – Clay

1

players列表中的每個player是一個字符串,而不是一個Player對象:

players.append(self) 
+0

大衛擊敗了我,我會重申他的觀點,你應該嘗試消除所有的全球「玩家」列表 –