2014-02-07 2 views
1

Я следую за довольно хорошей книгой python, и она учит вас, как создать симуляцию для некоторых карточных игр. Как вы можете видеть ниже, я создал класс «Карточка», для индексации всех возможных комбинаций карт в колоде. Затем я создал класс «Палуба», который делает колоду из комбинаций карт в «Карте». Мой вопрос в том, что я пытаюсь напечатать колоду, и каждый раз она дает мне «Король пик». Если я изменю диапазоны в петлях, чтобы создать колоду, это даст мне что-то еще. Я что-то делаю с диапазонами или что-то не так с функциями класса? Во всяком случае, я надеюсь, что код вам интересен. Любая помощь будет оценена по достоинству. Благодарю.Карточка игры на палубе

class Card: 
def __init__(self, suit = 0, rank = 2): 
    Card.suit = suit 
    Card.rank = rank 
#Two class attributes that are helpful in determining suit/rank 
ranklist = ['narf', 'Ace', 'One', 'Two', 'Three', 'Four', 'Five' \ 
'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Jack', 'Queen', 'King'] 
suitlist = ['Clubs', 'Diamonds', 'Hearts', 'Spades'] 
def __repr__(self): 
    return (self.ranklist[self.rank] + " of " + self.suitlist[self.suit]) 

class Deck: 
def __init__(self): 
    self.cards = [] 
    for suit in range(4): 
     for rank in range(1,14): 
      self.cards.append(Card(suit,rank)) 
def printDeck(self): 
    for card in self.cards: 
     print(card) 
def __repr__(self): 
    s = "" 
    for i in range(len(self.cards)): 
     s = s + " " + str(self.cards[i]) + "\n" 
     return s 
deck = Deck() 
print(deck) 

ответ

0

Я довольно уверен, что ответ лежит на линии:

self.cards.append(Card(suit,rank))

Это не случайно, что король дама последняя карта, которая добавляется к палубе, я думаю, что его проблема с передаваемыми объектами. Ill обновление это с правильным ответом, когда я могу, но это может дать вам лучшее представление о том, что происходит неправильно

EDIT: это должно работать

class Card: 
    def __init__(self): 
     Card.suit = 0 
     Card.rank = 2 
    #Two class attributes that are helpful in determining suit/rank 
    ranklist = ['narf', 'Ace', 'One', 'Two', 'Three', 'Four', 'Five' \ 
    'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Jack', 'Queen', 'King'] 
    suitlist = ['Clubs', 'Diamonds', 'Hearts', 'Spades'] 
    def __repr__(self): 
     return (self.ranklist[self.rank] + " of " + self.suitlist[self.suit]) 

class Deck: 
    def __init__(self): 
     self.cards = [] 
     for suit in range(4): 
      for rank in range(1,14): 
       x = Card() 
       x.suit = suit 
       x.rank = rank 
       self.cards.append(x) 
    def printDeck(self): 
     for card in self.cards: 
      print(card) 
    def __repr__(self): 
     s = "" 
     for i in range(len(self.cards)): 
      s = s + " " + str(self.cards[i]) + "\n" 
     return s 
deck = Deck() 
deck.printDeck() 
+0

Это работает очень хорошо, очень ценится. – srhoades28

1

Это вопрос с тем, как вы инициализации Card класса

class Card: 
    def __init__(self, suit = 0, rank = 2): 
     self.suit = suit 
     self.rank = rank 

Параметр self необходим для инициализации класса.

Кроме того, существует проблема с реализацией __repr__, которую вы используете в классе Deck. Я не думаю, что он делает то, что вы хотите. Когда вы вызываете print(deck), он ищет метод __str__ для deck, а затем, если он его не найдет, он будет искать __repr__. Проблема в вашем коде заключается в том, что возвращаемое значение просто выгружает вас из цикла преждевременно.

def __repr__(self): 
    s = "" 
    for i in range(len(self.cards)): 
     s = s + " " + str(self.cards[i]) + "\n" 
     return s #oops leaves your loop on the first iteration 

Вместо этого:

def __repr__(self): 
    s = "" 
    for i in range(len(self.cards)): 
     s = s + " " + str(self.cards[i]) + "\n" 

    return s #now it gets the whole string in s before returning 

Но еще лучше, чтобы удалить эту range(len()), потому что это совершенно ненужным и труднее читать:

def __repr__(self): 
    s = "" 
    for card in self.cards: 
     s = s + " " + str(card) + "\n" 

    return s 

Также вы используете __repr__ в месте где вы действительно должны использовать __str__, __repr__ предназначен для полного воссоздания класса с использованием вывода. В основном __repr__ предназначен для действительного кода python, который может создавать и воссоздавать класс. Если вам требуется неформальное строковое представление класса, как вы здесь делаете, то использование __str__ - это питоновское соглашение.

+0

Я как бы новичок в программировании, вы можете объяснить, что вы имеете в виду? Вы имеете в виду в самом начале кода, когда я инициализирую класс Card или в функции __init__ deck? Спасибо за разъяснения! – srhoades28

+0

@ srhoades28, что конкретно здесь не имеет смысла? – shuttle87

+0

Ничего, я понял. Спасибо за помощь! – srhoades28

Смежные вопросы