我正在试图弄清楚对象列表中的对象如何引用列表中其他对象的方法。
该场景是基于多玩家回合制的游戏,其中每个玩家都是class Player(object)
的对象,并且它们存在于列表players = [p1, p2, p3, etc.]
中。 Player
类已经具有执行gainPoints()
和losePoints()
等功能的功能,但是我希望玩家能够对其中的玩家,玩家之后或其他所有玩家做到这一点。玩家。
我假设第一步是创建函数来确定这些玩家在Player
类中的位置,然后p1
可以执行类似p1.losePoints(nextPlayer())
或p1.nextPlayer().losePoints()
的操作让p2
失分,但我不知道如何编写nextPlayer()
函数,或者一旦完成,我将如何用losePoints()
调用它。我试过的任何搜索字词都会将我带到itertools
文档中,我已阅读但未看到如何应用。
由于玩家的上限只有4,我相信我能找到一些解决这个问题的复杂方法,但我想知道解决这个问题的正确方法是什么。
答案 0 :(得分:1)
nextPlayer()方法可以索引 self 的列表以找到自己的位置。
这里有一些代码可以帮助您入门:
class Player:
def __init__(self, name, points=0):
self.name = name
self.points = points
def gain_points(self, n):
self.points += n
def next_player(self):
i = players.index(self)
return players[i+1]
def __repr__(self):
return '%s(%r, %r)' % (self.__class__.__name__, self.name, self.points)
if __name__ == '__main__':
players = [Player('Manny'), Player('Mo'), Player('Jack')]
players[1].next_player().gain_points(5)
print players
如果您需要播放器列表“环绕”,请在 next_player 计算中使用模数:
def next_player(self):
i = players.index(self)
return players[(i+1) % len(players)]
答案 1 :(得分:0)
一种非常简单的方法是只跟踪列表中当前玩家的索引。然后你可以这样做:
prevIndex = currentIndex - 1
nextIndex = (currentIndex + 1) % len(players)
players[prevIndex].losePoints(params)
players[nextIndex].gainPoints(params)
这将无需扫描列表即可运行,无论播放器列表中有多少条目,它都同样快速。它还可以保持播放器列表和其他复杂功能。