Я пытаюсь вызвать объект в методе в другом объекте - PullRequest
0 голосов
/ 02 мая 2019

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

Программа работает так, у меня есть класс Deck (), которыйэто, конечно, колода, класс с именем player и класс с именем table.В классе игрока у меня есть пара методов, но я только назову то, что необходимо, чтобы сделать это как можно короче.У меня есть следующие методы (в классе игрока) bet (), call () fold (), all_in () и player_choice ().Первые четыре названных мною метода вызываются методом player_choice ().Однако проблема заключается в bet (), all_in () и методе call.следующие методы выглядят так:

        def all_in(self):
    table.table_money += self.money
    self.money = 0
    print('{} went all in!').format(self.name)

def cal(self, last_bet):
    if last_bet > self.money:
        while True:
            res = input('You dont have enough money to call.\tyou have=> {}\nDo you want to go all in?\ty/n\n>>> ').format(str(self.money))
            if res.lower() == 'y':
                self.all_in()
                break
            elif res.lower() == 'n':
                self.fold()
                break
            else:
                print('Invalid input. Try again...')
    else:
        table.table_money += self.money - last_bet
        self.money -= last_bet
        print('{} called.').format(self.name)


def bet(self, last_bet):
    res = int(input('Enter bet below.\t must be over {}\n>>> '.format(str(last_bet))))
    table.latest_bet += res
    table.table_money += res
    self.money -= res
    print('{} has bet {}$').format(self.name, str(res))

Проблема в том, что когда я вызываю один из этих методов, а метод находится в процессе вычитания денег игроков и добавления их в table.table_money () (какпоказано в приведенном выше коде), вот когда я получаю NameError, говоря, что «таблица» не определена.

вот класс Table ():

    class Table():
def __init__(self):
    self.table_money = 0
    self.latest_bet = 0

    if players == '':
        print('Table is empty!')
    else:
        print(str(len(players)) + ' players on the table.')

def list_table(self):
    for i in players:
        print(i.__str__())

Я знаю, о чем вы думаетечто я набрал таблицу вместо таблицы.но это он, когда я запускаю код в функции main (), я инициализирую объект Table в переменную с именем table, которая должна быть той же самой переменной, которая вызывается методами класса Player ().

Вот краткий обзор функции main ():

    def main():
while welcome():
    rond = 1
    while rond <= 5:
        table = Table()
        deck = Deck()
        deck.deal()
        user = players[0]
        user.list_hand()
        user.player_choice(table.latest_bet)
        break
    break

структура задачи выглядит следующим образом:

  1. сначала я определяю класс игрока.
  2. 2-й я определяю таблицу.
  3. 3-ий я определяю main ().

Это вывод ошибки:

    Traceback (most recent call last):
    File "C:/Users/Alex/PycharmProjects/GUI_prject/venv/Lib/site- 
    packages/resors2.py", line 161, in <module>
    main()
    File "C:/Users/Alex/PycharmProjects/GUI_prject/venv/Lib/site- 
    packages/resors2.py", line 157, in main
    user.player_choice(table.latest_bet)
    File "C:/Users/Alex/PycharmProjects/GUI_prject/venv/Lib/site- 
    packages/resors2.py", line 38, in player_choice
    self.cal(last_bet)
    File "C:/Users/Alex/PycharmProjects/GUI_prject/venv/Lib/site- 
    packages/resors2.py", line 71, in cal
    table.table_money += self.money - last_bet
    NameError: name 'table' is not defined

Если я не включил достаточно информации о программе, дайте мне знать, что я поделюсь больше, если это необходимо.Я прошу прощения, если я не объяснил все это лучшим образом и если сообщение слишком длинное.Я более чем благодарен за любой комментарий.Спасибо за чтение.

Полный код:

    import random as r

    suits = ['H','C','S','D']
    values = ['A','2','3','4','5','6','7','8','9','10','J','Q','K']
    players = []

    class Card():
        def __init__(self, suit, value):
            self.suit = suit
            self.value = value

        def valu(self):
            return self.value + self.suit

    class Player():
        def __init__(self, name, money):
            global players
            self.name = name
            self.money = money
            print(self.name+ ' joined the table!')
            players.append(self)
            self.hand = []

        def __str__(self):
            return '{}: {}'.format(self.name, str(self.money))

        def add_to_hand(self, cards):
            self.hand.append(cards)

        def list_hand(self):
            for i in self.hand:
                print(i)

        def player_choice(self, last_bet):
            while True:
                resu = input('c - Call | b - bet | a - all in | f - fold\n>>> 
    ').lower()
            if resu == 'c':
                self.cal(last_bet)
                break
            elif resu == 'b':
                self.bet(last_bet)
                break
            elif resu == 'a':
                self.all_in()
                break
            elif resu == 'f':
                self.fold()
                break
            else:
                print('Invalid input. Try again...')


        def all_in(self):
            table.table_money += self.money
            self.money = 0
            print('{} went all in!').format(self.name)

        def cal(self, last_bet):
            if last_bet > self.money:
                while True:
                    res = input('You dont have enough money to call.\tyou have=> {}\nDo you want to go all in?\ty/n\n>>> ').format(str(self.money))
                    if res.lower() == 'y':
                    self.all_in()
                    break
                    elif res.lower() == 'n':
                    self.fold()
                    break
            else:
                print('Invalid input. Try again...')
        else:
            table.table_money += self.money - last_bet
            self.money -= last_bet
            print('{} called.').format(self.name)


    def bet(self, last_bet):
        res = int(input('Enter bet below.\t must be over {}\n>>> '.format(str(last_bet))))
        table.latest_bet += res
        table.table_money += res
        self.money -= res
        print('{} has bet {}$').format(self.name, str(res))

    def fold(self):
        players.remove(self)
        print('{} has folded.').format(self.name)


    class Table():
        def __init__(self):
            self.table_money = 0
            self.latest_bet = 0

            if players == '':
                print('Table is empty!')
            else:
                print(str(len(players)) + ' players on the table.')

        def list_table(self):
            for i in players:
            print(i.__str__())




    class Deck():
        def __init__(self):
            self.cards = []

            for suit in suits:
                for value in values:
                   self.cards.append(Card(suit, value).valu())

            r.shuffle(self.cards)

        def show_deck(self):
            return self.cards

        def shuffle_d(self):
            r.shuffle(self.cards)

        def deal(self):
            for p in players:
                for c in range(0, 1):
                    p.add_to_hand((self.cards.pop(), self.cards.pop()))

    #The welcome function is not a method for any of the classes above 

    def welcome():
        global players
print('''
        Welcome to the poker table. 
        q - Quit
        s - Take a seat
''')
res = ''
while res != 'q' or 's':
    res = input('>>> ')
    if res == 'q':
        return False
    elif res == 's':
        name = input('Enter your name: ')
        money = int(input('Enter how much money you wish to have(max 500$): '))
        Player(name, money)
        return True
    else:
        print('Invalid input. q - Quit\ts - Take a seat')



    def main():
        while welcome():
        rond = 1
            while rond <= 5:
                table = Table()
                deck = Deck()
                deck.deal()
                user = players[0]
                user.list_hand()
                user.player_choice(table.latest_bet)
                break
            break

    main()

Попробуйте игнорировать промах

Ответы [ 2 ]

1 голос
/ 02 мая 2019

tables является локальной переменной в функции main().Вы должны добавить его как атрибут класса player.

def go_to_table(self, table):
    self.table = table

Тогда все методы должны использовать self.table вместо просто table.В основном вы делаете:

def main():
    while welcome():
        rond = 1
        while rond <= 5:
            table = Table()
            deck = Deck()
            deck.deal()
            user = players[0]
            user.go_to_table(table)
            user.list_hand()
            user.player_choice(table.latest_bet)
            break
        break
0 голосов
/ 02 мая 2019

Вы путаете тип (например, Table) с одним экземпляром объекта этого типа, например table после table = Table().

Строка table = Table() создает новый объектвведите Table и присвойте ее переменной table, чтобы вы могли обратиться к ней позже.Однако эта переменная определена внутри функции main и доступна только там.Внутри метода cal (который, как я предполагаю, написано с ошибкой call), нет table, поскольку у вас может быть много игр, и он не знает, к какому столу он принадлежит.

Поскольку игрок сидит за конкретным столом, имеет смысл сохранить ссылку на этот Table внутри Player и присвоить его в своем конструкторе что-то вроде self.table = table.Затем вы можете ссылаться на него из метода call, используя self.table.

class Player:
    def __init__(self, table):
        self.table = table

    def call(self):
        self.table.money += 1


class Table:
    def __init__(self):
        self.money = 0


table = Table()
player = Player(table)
player.call()
print(table.money)
...