2013-01-11 4 views
0

나는 재미를 위해서 기본적인 카드 게임을 작성하려고하지만 가능한 한 많은 것을 미래의 카드 게임에 적용하려고합니다. 여기에는 제 코드가 있습니다.파이썬 : 함수 내부에서 인스턴스 속성에 추가하기

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 카드를 사용하면 문제가 없지만 N 명에게 X 카드를 사용하면 문제가 없습니다. 여기 내 출력 :

('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

David는 저를 때려 눕혔습니다. 나는 모든 글로벌'플레이어 '목록을 제거하려고 노력해야한다는 그의 감정을 다시 반복 할 것입니다. –

관련 문제