2016-04-02 2 views
1

Это мой первый язык программирования, отличного от MATLAB, поэтому у меня возникают проблемы с объектно-ориентированным программированием. В частности, я работаю над программой, которая имитирует игру в блэкджек. Он работал, но я попытался добавить некоторые новые функции, позволяющие игрокам делать ставки.Объектно-ориентированное программирование с ошибкой атрибута

Чтобы предположить, BJ Player - это объект, который был коллекцией объектов карты. Def_init использовал только имя и имена в качестве параметров, но я добавил startmonies (начальные деньги, которые игрок ставит). Суперкласс BJ-плеера в конечном счете является BJ-рукой. Теперь я получаю сообщение об ошибке при вызове метода для добавления карты в эту руку. Ниже, где ошибка о

class BJ_Game(object): 
""" A Blackjack Game. """ 
def __init__(self, names, startingmonies):  
    self.players = [] 
    for name in names: 
     player = BJ_Player(name) 
     spot = names.index(name) 
     startingscratch = startingmonies[spot] 
     player_with_money = (name, startingscratch,0) 
     self.players.append(player_with_money) 

Это место, где берет начало ошибок (карты модуля, который импортируется в модуль BJ используется выше):

class Hand(object): 
""" A hand of playing cards. """ 
def __init__(self): 
    self.cards = [] 

def __str__(self): 
    if self.cards: 
     rep = "" 
     for card in self.cards: 
      rep += str(card) + "\t" 
    else: 
     rep = "<empty>" 
    return rep 

def clear(self): 
    self.cards = [] 

def add(self, card): 
    self.cards.append(card) 

def give(self, card, other_hand): 
    self.cards.remove(card) 
    other_hand.add(card) 

Это ошибка, я получаю .: строка 47, в отдавания other_hand.add (карта)

AttributeError: 'кортеж' объект не имеет атрибута 'добавить'

я получаю эту ошибку при попытке разобраться с картами. Все остальное работало до этого, поэтому единственным реальным изменением, которое я сделал, является добавление параметра ставки. Я исследовал этот вопрос и не смог получить сильное понимание. Будем очень благодарны любой помощи. Спасибо!

Вот еще информация. Я думаю, что ошибка происходит, потому что я изменил self.players как список кортежей. Я не уверен, как это исправить.

for index, player in enumerate(self.players): 
     flag = 1 
     while flag: 
      try: 
       (name, players_cache,bet) = player 
       print(players_cache) 
       print("Current player:",name) 
       bet = int(input("Please select how much this player would like to wager: ")) 
       if bet <= 0: 
        print("Bet must be greater than 0") 
       elif bet <= players_cache: 
        flag = 0 
        players_cache-=bet 
        player = (name,players_cache,bet) 
        self.players[index] = player 
       else: 
        print("Insufficient funds. PLayer only has",players_cache,"dollars available") 
      except ValueError: 
       print("Input must be a number\n") 


    # deal initial 2 cards to everyone 
    self.deck.deal(self.players + [self.dealer], per_hand = 2) 

Здесь я получаю другую часть ошибки. линия 169, в игре self.deck.deal (self.players + [self.dealer], per_hand = 2)

Вот полный блок ошибок. К сожалению, чтобы не показывать все это раньше:

линии 262, в основной() линии 258, в главном game.play (max_Cards) линии 169, в пьесе self.deck.deal (self.players + [self.dealer], per_hand = 2) строки 65, в сделке self.give (top_card, рука) линии 47, в отдаваниях other_hand.add (карта) AttributeError: 'кортеж' объект не имеет атрибута ' add '

ответ

0

Вы передаете объект tuple на номер give, а не на экземпляр руки, объясняющий почему add метод не определен. Поскольку вы не упомянули вызов метода get в своем коде, я не мог указать указатель на точную строку.

+0

строка 65, в сделке self.give (top_card, hand) –

0

Как видно на рисунке, other_hand должен быть кортежем, поэтому вы не можете использовать add() в этом дело. Коды не могут быть изменены кодом, они должны быть напрямую изменены человеком, создающим код. Кортеж, как это:

tuple = (var1, var2, ..., varx) 

В основном списке, но с круглыми скобками и не может быть изменен с помощью кода. Поэтому вы должны убедиться, что вместо этого other_hand.

+0

Я думаю, что я понимаю разницу между кортежами и списками, но я не понимаю, почему это сработало раньше и не сейчас –

0

Спасибо за помощь людям!Изменены ставки на атрибуты, и она исправила мою проблему.

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