Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中调用列表中下一个/上一个对象的函数_Python_Python 2.7 - Fatal编程技术网

如何在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
对象保存一个类
游戏
或类似的引用,并在需要更多“全局”状态时将其委托给该类。