正确使用super()to.pop()关闭父类中每个子实例的列表中的名称

2024-10-03 02:34:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个游戏,其中我创建了一个ComputerPlayer()类,它是Players()类的子类。我在Players()类中为子类中的构造函数使用一个名称列表,以便在每次实例化时随机为每个计算机播放器获取一个名称,并且pop()将其关闭,这样名称就不能被分配两次。代码位如下所示:

class Players(object):

    names = ['Carl', 'James', 'Bob', 'Jamal', 'Kris', 'Andy', 'Rupert', 'Gerald', 'Pat',
             'Gloria', 'Hannah', 'Priscilla', 'Sarah', 'Silvia']

class ComputerPlayer(Players):

    def ___init___(self):
        self.name = super(ComputerPlayer, self).names.pop(randint(0, len(super(ComputerPlayer, self).names) - 1))

所以我要做的是为Game()类中的每个计算机化播放器实例化一个新的ComputerPlayer()对象,如果我总是想要相同数量的播放器,我可以很容易地使用它:

class Game(object):

    def ___init___(self):
        self.player1 = ComputerPlayer()
        self.player2 = ComputerPlayer()
        self.player3 = ComputerPlayer()

或者,如果我想让人类玩家能够选择他们想与多少计算机对手对抗,我可以将一个参数传递给Game(),然后执行以下操作:

def __init___(self, num):
    self.players = []
    for x in range(0,num):
        self.players.append(ComputerPlayer())

当我第一次开始这个问题的时候,我想知道是否有一种方法可以通过引用ComputerPlayer()的随机分配的名称来访问每个实例,但是当我写的时候,我意识到这样做并没有真正的好处,它可能会使事情变得不必要的复杂;这些名字其实只是展示给人类玩家,让游戏感觉更“人性化”

然而,尽管我知道我在super()类中正确地使用了ComputerPlayer(),但这是否一定是首选的方法呢?使用对Players().names的直接引用也可以很好地工作,而且它会大大缩短那行难看的代码

Game()类将拥有控制游戏逻辑的主要方法,因此它是创建我的个人电脑播放器的正确类吗

如有任何其他意见、问题或建议,将不胜感激。游戏将是“街头垃圾”顺便说一句。谢谢


Tags: 实例方法self名称game游戏namesinit
1条回答
网友
1楼 · 发布于 2024-10-03 02:34:45

你让它听起来像名字只是用于电脑播放器。 既然如此,为什么不把它放在ComputerPlayer类中,跳过使用super呢

另外,如果您创建的计算机播放器超过len(name)个,那么您的代码将出错

相关问题 更多 >