操纵 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_playersplayer1.num_of_players 两者都将 return 共有 2 个玩家).我还创建了另一个变量 number 以便每个玩家都可以跟踪他们的号码。这是一个实例变量,并为每个实例单独跟踪。