如何在Python中调用列表中下一个/上一个对象的函数
我试图找出对象列表中的对象如何引用列表中其他对象的方法 该场景是一个基于多玩家回合的游戏,其中每个玩家都是如何在Python中调用列表中下一个/上一个对象的函数,python,python-2.7,Python,Python 2.7,我试图找出对象列表中的对象如何引用列表中其他对象的方法 该场景是一个基于多玩家回合的游戏,其中每个玩家都是类玩家(对象)的对象,并且他们存在于玩家=[p1、p2、p3等]列表中。Player类已经有了一些函数来做一些事情,比如gainPoints()和losePoints(),但是我希望玩家能够对他们前面的玩家、后面的玩家或者所有其他玩家都这样做 我假设第一步是创建函数来确定Player类中的玩家,然后p1可以执行类似于p1.losePoints(nextPlayer())或p1.nextPla
类玩家(对象)
的对象,并且他们存在于玩家=[p1、p2、p3等]
列表中。Player
类已经有了一些函数来做一些事情,比如gainPoints()
和losePoints()
,但是我希望玩家能够对他们前面的玩家、后面的玩家或者所有其他玩家都这样做
我假设第一步是创建函数来确定Player
类中的玩家,然后p1
可以执行类似于p1.losePoints(nextPlayer())
或p1.nextPlayer().losePoints()
的操作来获得p2
的丢分,但是我不知道如何编写nextPlayer()
函数,或者一旦编写完成,如何使用losePoints()调用它。我尝试的任何搜索词都会带我进入itertools
文档,我已经阅读了这些文档,但不知道如何应用它们
因为玩家的上限只有4,我相信我可以找到一些复杂的方法来解决这个问题,但我想知道解决这个问题的正确方法是什么 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
如果需要玩家列表“环绕”,请在下一次玩家计算中使用模:
def next_player(self):
i = players.index(self)
return players[(i+1) % len(players)]
一个非常简单的方法就是跟踪列表中当前玩家的索引。然后你可以做:
prevIndex = currentIndex - 1
nextIndex = (currentIndex + 1) % len(players)
players[prevIndex].losePoints(params)
players[nextIndex].gainPoints(params)
这将在不扫描列表的情况下工作,并且无论玩家列表中有多少条目,速度都一样快。它还可以将玩家列表和其他复杂内容排除在玩家类之外 您在示例之前的初始帖子足以让它工作,但我的函数是def next\u player(player):
I=players.index(player)+1
返回players[I]
使用player
作为参数,而不是self
。它们相等吗?如果是这样的话,使用哪一个更好?它们是等价的。使用“self”的是首选的python风格。这是可行的,尽管值得考虑它是否代表了一个合理的设计-现在,玩家类,而不是持有本地玩家状态,必须知道全局游戏状态的实现细节,并且还获得了实现一些游戏规则的责任。描述全局游戏状态(玩家对象列表是其中的一部分)、玩家操作的处理程序、游戏规则对全局游戏状态的应用以响应操作等通常是很有帮助的。将这些在运球中分散到许多地方会让人非常困惑quickly@pvg,我同意。最好是Player
对象保存一个类游戏
或类似的引用,并在需要更多“全局”状态时将其委托给该类。