2014-10-27 5 views
-3

Это упражнение должно создать класс, делающий игровые карты.Проблемы с программой для создания игровых карт

Через 45 минут по телефону с моим (немного scoldy) CS профессор, я не могу сделать две вещи остановить здесь происходит 1) Имена из списка (ранги) рисует эту ошибку NameError: ранги глобальное имя» 'не определено

2) Предполагается, что имя карты должно быть прописано (например, card1 = (1 из «h» предполагается стать «Тузом сердец»), но я продолжаю получать (1 из «h»)

Я не хочу отбрасывать класс. Мне нужна более непосредственная помощь. Она пытается стать соцратикой, которую я ценю, но я слишком много начинаю. Мне нужно узнать правила, я не могу угадать их Спасибо заранее.

Нэнси

class Card(object): 
    """ creates a playing card 
    first: lists and dictionaries for program""" 

    RANKS = ["0", "Ace", "2", "3", "4", "5", "6", "7", 
      "8", "9", "10", "Jack", "Queen", "King"] 
    SUITS = {"c":"Clubs", "d":"Diamonds", "h":"Hearts", "s":"Spades"} 

    def __init__(self, rank, suit): # initializes the process 
     self.rank = rank 
     self.suit = suit 

    def getRank(self): # gets rank of card 
     if self.rank in RANKS: 
      RANKS[self.rank] = self.rank 
      return self.rank 

    def getSuit(self, SUITS=None): # gets suit of card in a full word 
     if self.suit in SUITS: 
      SUITS[self.suit] = self.suit 
      return self.suit 


    def __str__(self): # to make the strings to answer the problems 
     return "Card is %r of %s" % (RANKS[self.rank], SUITS[self.suit]) 

card1 = Card(1, "h") 
print (card1) 
card2 = Card(3, "c") 
print (card2) 
+2

на самом деле? вы не получаете сообщение об отсутствии глобальных RANKS и SUITES? –

ответ

0
def getRank(self): # gets rank of card 
    if self.rank in self.RANKS: #note self.RANKS 
     return self.RANKS[self.rank] 


def getSuit(self, SUITS=None): # gets suit of card in a full word 
    if self.suit in self.SUITS: #note use of self.SUITS 
     return self.SUITS[self.suit] 



def __str__(self): # to make the strings to answer the problems 
    #just call the helper methods we defined earlier 
    return "Card is %s of %s" % (self.getRank(),self.getSuit()) 
+0

Также причиной второй проблемы является то, что значения в словарях «RANK» и «SUIT» переназначаются на соответствующие ключи в 'getRank()' и 'getSuit()' – stonesam92

+0

stonesam92, следует ли мне помещать getRank() и getSuit() в строковый формат? Благодарю. – user3527876

1

куча проблем здесь. Самая непосредственная причина, вызывающая вашу ошибку , заключается в том, что, поскольку вы определили список RANKS и словарь SUITS внутри класса вашей карты, они должны называться Card.RANKS и Card.SUITS, соответственно, даже изнутри класс.

Идея использования простого номера для ранжирования, использование для индексации списка имен ранга как текста, в порядке. Аналогично, использование символа для костюма и использование этого для поиска словаря в порядке. Но путь , который вы пытаетесь сделать в своих функциях getRank() и getSuit(), неверен.

getRank() должна принимать значение self.rank и возвращает элемент из списка по этому индексу - так, чтобы увидеть, если это действительно, вам нужно проверить значение против допустимых значений индекса, а не против списка значения. Во-вторых, значения RANKS и SUITS следует рассматривать как константы, , так почему вы пытаетесь изменить их здесь? И наконец, поскольку у вас есть no else, если значение ранга плохо, getRank() возвращает None.

getSuit() имеет все эти проблемы, плюс у вас есть бесполезный аргумент , чтобы пройти без причины. Кроме того, вы хотите проверить значение костюма против доступных ключей в словаре, поэтому «in» является правильным способом сделать это.

Ваша функция ул должен вызывать getRank() и getSuit() поэтому он получает выгоду от их обработки ошибок, и, возможно, так что вы можете позже реализации изменений, и следует использовать% s для обоих.

Вот лучший подход:

class Card(object): 

    RANKS = ["0", "Ace", "2", "3", "4", "5", "6", 
      "7", "8", "9", "10", "Jack", "Queen", "King"] 
    SUITS = {"c":"Clubs", "d":"Diamonds", "h":"Hearts", "s":"Spades"} 

    def __init__(self, rank, suit): 
     self.rank = rank 
     self.suit = suit 

    def getRank(self): # gets rank of card as text 
     if self.rank >= 1 and self.rank <= 13: 
      return Card.RANKS[self.rank] 
     else: 
      return "ERROR" 

    def getSuit(self): # gets suit of card in a full word 
     if self.suit in Card.SUITS: 
      return Card.SUITS[self.suit] 
     else: 
      return "ERROR" 

    def __str__(self): # to make the strings to answer the problems 
     return "Card is %s of %s" % (self.getRank(), self.getSuit()) 

card1 = Card(1, "h") 
print (card1) 
card2 = Card(3, "c") 
print (card2) 
Смежные вопросы