Манипулировать экземпляром класса

Я хочу дать второму экземпляру моего класса Player оставшийся маркер после того, как первый экземпляр получит один из них.

class Player():

    available_markers = ['X', 'O']

    num_of_players = 0

    player2_marker = ' '

    def __init__(self):

        self.name = input('Please enter your name : ')

        self.marker = ' '

        Player.num_of_players += 1

    def choose_marker(self):

        while Player.num_of_players != 2:

            self.marker = input('Choose X or O')
            if self.marker == Player.available_markers[0]:
                Player.player2_marker == Player.available_markers[-1]
            else:
                Player.player2_marker == Player.available_markers[0]
        else:
            self.marker = Player.player2_marke

Я хотел бы добиться этого в методе экземпляра, но прошел через большой код, который не совсем работает.

1 ответ

Решение

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

Все, что игрок должен знать, это его имя, маркер и номер игрока:

class Player():
    num_of_players = 0

    def __init__(self, name, marker):
        Player.num_of_players += 1
        self.name = name
        self.marker = marker
        self.number = Player.num_of_players
        print(self.number, self.marker)

Отдельно от того, как вы хотите начать игру и инициализировать игроков. Вы можете создать другой класс с именем Game но сейчас я просто сделаю функцию:

def start_game():
    available_markers = ['X', 'O']
    print("Player 1")
    name = input('Please enter your name : ')

Давайте не будем верить, что пользователь программы введет правильную вещь:

    while True:
        marker = input('Choose X or O: ')

Мы будем зацикливаться вечно и просто выйдем из него, если будет выбран правильный вариант:

        if marker in available_markers:
            break
        else:
            print("Invalid choice. Please pick again")

    player1 = Player(name, marker)

Мы удалим этот маркер из списка, так что теперь в списке только один элемент:

    available_markers.remove(marker)
    print("Player 2")
    name = input('Please enter your name : ')
    player2 = Player(name, available_markers[0])

start_game()

# Player 1
# Please enter your name : Adam
# Choose X or O: X
# 1 X
# Player 2
# Please enter your name : Joe
# 2 O

Обратите внимание, что я создаю два отдельных экземпляра Player,

Давайте кратко поговорим о переменных класса против мгновенных переменных. Я продолжал num_of_players в качестве переменной класса для отслеживания общего количества игроков (доступно при Player.num_of_players или же player1.num_of_players оба вернутся, что есть 2 полных игрока). Я также создал другую переменную number так что каждый игрок может отследить, каков их номер. Это переменная экземпляра и отслеживается отдельно для каждого экземпляра.

Другие вопросы по тегам