将函数映射到对象字典

时间:2014-09-14 02:58:31

标签: python python-3.x pygame

我有一个网络游戏,我不断循环游戏对象字典,在它们上面调用一个函数,例如draw或send_location或获取位置。我正在寻找一种方法来改善它。我希望能够调用一个函数,它接受一个函数作为参数,然后在每个游戏对象上调用该函数。有时函数是每个对象的类方法,这使得它有点困难。这是我到目前为止所拥有的。游戏对象字典的结构类似于game_objects = {'players':[player1,player2],'other_objects':[object1,object2]}

def loop_over_game_dict(self, func, *args):
  """looop over the game dictionary and apply function with the arguments to
  all objects"""
  for obj_type, obj_list in self.game_objects.items():
    for game_obj in obj_list:
        # apply some function with the current game object as the first parameter
        func(game_object, *args)

例如,如果我想要一个构建游戏数据包的函数

def send_location(self, game_obj, packet ):
  packet[game_obj.id] = packet.serialize(game_obj.rect.x, game_obj.rect.y)

# somewhere in the code
loop_over_game_dict(send_location, packet_object)

我的问题是,如果有的话,在其他游戏中如何完成这样的事情?我觉得我经常在游戏中循环对象做一件事(碰撞检测,渲染),这会使它变得更简单。是否一直在循环它们代表了我设计中的一个缺陷?

1 个答案:

答案 0 :(得分:1)

我不确定这个问题与您的游戏代码有什么关系,但是...

一组对象的显式循环通常不是设计缺陷(尽管在某些情况下,例如CPU绑定数学可能不是最快的解决方案):

results = []
for obj in input:
    results.append( func(obj) )

但是,如果您发现这一点不必要,那么Python还提供至少两个其他方式来以单行形式执行上述操作。

列表理解:

results = [ func(obj) for obj in input ]

map函数,它是由函数式编程语言借用/启发的:

results = map(func, obj)
相关问题