操纵 class 个实例
manipulate class instance
我想在第一个实例获得其中一个标记后,为我的播放器 class 的第二个实例提供剩余标记。
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
我想在实例方法中完成此操作,但经历了很多不太有效的代码。
您的代码中存在一些对面向对象编码的误解,所以我会在回答中尝试解决这些问题。面向对象编程的目标之一是关注点分离。如果您对游戏的运作方式和玩家的运作方式都有一定的逻辑,那么您不希望将两者的逻辑混合在同一个地方。
玩家真正需要知道的是他们的名字、标记和玩家号码:
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
的 class,但现在,我将只执行一个函数:
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
实例。
让我们简单谈谈class变量与即时变量。我将 num_of_players
作为 class 变量来跟踪玩家总数(通过 Player.num_of_players
或 player1.num_of_players
两者都将 return 共有 2 个玩家).我还创建了另一个变量 number
以便每个玩家都可以跟踪他们的号码。这是一个实例变量,并为每个实例单独跟踪。
我想在第一个实例获得其中一个标记后,为我的播放器 class 的第二个实例提供剩余标记。
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
我想在实例方法中完成此操作,但经历了很多不太有效的代码。
您的代码中存在一些对面向对象编码的误解,所以我会在回答中尝试解决这些问题。面向对象编程的目标之一是关注点分离。如果您对游戏的运作方式和玩家的运作方式都有一定的逻辑,那么您不希望将两者的逻辑混合在同一个地方。
玩家真正需要知道的是他们的名字、标记和玩家号码:
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
的 class,但现在,我将只执行一个函数:
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
实例。
让我们简单谈谈class变量与即时变量。我将 num_of_players
作为 class 变量来跟踪玩家总数(通过 Player.num_of_players
或 player1.num_of_players
两者都将 return 共有 2 个玩家).我还创建了另一个变量 number
以便每个玩家都可以跟踪他们的号码。这是一个实例变量,并为每个实例单独跟踪。