Манипулировать экземпляром класса
Я хочу дать второму экземпляру моего класса 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
так что каждый игрок может отследить, каков их номер. Это переменная экземпляра и отслеживается отдельно для каждого экземпляра.