我想在第一个实例获得其中一个之后,为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
我想在实例方法中完成此操作,但是经历了很多代码,但效果不佳。
答案 0 :(得分:3)
您的代码中对面向对象的编码有一些误解,因此我将在回答中尝试解决它们。面向对象编程的目标之一是关注点分离。如果您对游戏的运作方式有某种逻辑,而对于玩家的运作方式也有某种逻辑,那么您就不希望在同一地点将两者混为一谈。
玩家真正需要知道的是他们的名字,标记和玩家编号:
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
,因此每个玩家都可以跟踪自己的号码。这是一个实例变量,每个实例分别进行跟踪。