2013-01-11 25 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

大卫击败了我,我会重申他的观点,你应该尝试消除所有的全球“玩家”列表 –