Mediatorを使った衝突判定処理の分離

とりあえず、Pythonソースコードだけ。
解説は後日にて…。

class Task:
    """ タスク """
    def __init__(self, name, x=0, dx=0):
        """ コンストラクタ """
        self.name = name
        self.x    = x
        self.dx   = dx
    def update(self):
        """ 更新 """
        self.x += self.dx
        if(self.x < 0 or 10 < self.x):
            return False
        return True
    def getName(self):
        return self.name
    def __str__(self):
        """ 文字列表現を取得 """
        return "%s=%d"%(self.name, self.x)
class TaskManager:
    """ タスク管理 """
    def __init__(self, id, mediator):
        """ コンストラクタ """
        self.id       = id
        self.taskList = []
        self.mediator = mediator
    def update(self):
        """ 更新 """
        for task in self.taskList[:]:
            if task.update():
                print task
            else:
                self.remove(task)
        # 通知
        self.mediator.notify(self)
            
    def create(self, name, x, dx):
        """ タスクの生成 """
        task = Task(name, x, dx)
        self.taskList.append(task)
    def remove(self, task):
        """ タスクの削除 """
        self.taskList.remove(task)
    def getTaskList(self):
        return self.taskList[:]
    def size(self):
        return len(self.taskList)
    def getId(self):
        return self.id

class TaskMediator:
    """ タスク通信管理 """
    def __init__(self):
        """ コンストラクタ """
        self.managerDist = {}
    def registTaskManager(self, mgr):
        """ タスクマネージャの登録 """
        self.managerDist[mgr.getId()] = mgr
    def getTaskManager(self, id):
        """ タスクマネージャの取得 """
        return self.managerDist[id]
    def notify(self, mgr):
        """
        タスクマネージャ更新の通知
        衝突判定を行う
        """
        if mgr.getId() == 0:
            # プレイヤー(id:0) vs 敵(id:1)
            for player in mgr.getTaskList():
                # 敵
                enemyMgr = self.getTaskManager(1)
                for enemy in enemyMgr.getTaskList():
                    if self.isCollide(player, enemy):
                        # 衝突
                        print "%s and %s collided."%(player.getName(), enemy.getName())
                        mgr.remove(player)
                        enemyMgr.remove(enemy)
        else: # mgr.getId() == 1
            # 敵(id:1) vs プレイヤー(id:0)
            for enemy in mgr.getTaskList():
                # プレイヤー
                playerMgr = self.getTaskManager(0)
                for player in playerMgr.getTaskList():
                    if self.isCollide(enemy, player):
                        # 衝突
                        print "%s and %s collided."%(enemy.getName(), player.getName())
                        mgr.remove(enemy)
                        playerMgr.remove(player)
    def isCollide(self, task1, task2):
        """ 当たり判定 """
        return task1.x == task2.x

def main():
    # メディエター生成
    mediator = TaskMediator()
    # タスク管理生成
    players = TaskManager(0, mediator)
    enemys  = TaskManager(1, mediator)
    # メディエターに登録
    mediator.registTaskManager(players)
    mediator.registTaskManager(enemys)
    
    # タスク生成
    players.create("hoge", 0, 2)
    players.create("piyo", 3, 1)
    enemys.create("saba", 10, -2)
    enemys.create("iwasi", 5, -1)
    
    # 実行
    i = 0
    while True:
        print "%d---------------"%i
        players.update()
        enemys.update()
        if players.size() == 0 and enemys.size() == 0:
            print "end-------------"
            break
        i += 1

if __name__ == "__main__":
    main()