操作类实例

时间:2018-07-21 01:54:07

标签: python class instance instance-methods

我想在第一个实例获得其中一个之后,为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 个答案:

答案 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_playersplayer1.num_of_players的访问可以返回总共2个玩家)。我还创建了另一个变量number,因此每个玩家都可以跟踪自己的号码。这是一个实例变量,每个实例分别进行跟踪。