トークン管理クラス

たぶんPython以外では実装が難しいですが、
トークン(ゲームオブジェクト)管理クラスの実装について。
 

クラス図


AbstractFactoryっぽい設計です。
 

ソースコード

#!/usr/bin/env python
# -*- coding: utf-8 -*-

class IToken:
	""" トークン基底クラス """
	g = None # 描画デバイス
	i = None # 入力デバイス
	m = None # サウンドデバイス

class ITokenManager:
	""" トークン管理クラス """
	@classmethod
	def init(cls):
		""" リスト初期化 """
		cls.List = []
	@classmethod
	def append(cls, token):
		""" トークンの追加 """
		cls.List.append(token)
	@classmethod
	def remove(cls, token):
		""" トークンの削除 """
		cls.List.remove(token)
	@classmethod
	def removeAll(cls):
		""" トークンをすべて削除 """
		del cls.List
		cls.init()
	@classmethod
	def getList(cls):
		""" リストのコピー取得 """
		return cls.List[:]
	@classmethod
	def size(cls):
		""" リストのサイズ取得 """
		return len(cls.List)

class Enemy(IToken):
	""" 敵クラス """
	def __init__(self, id, x, dx):
		self.id    = id   # 敵の種類
		self.x     = x    # X座標
		self.dx    = dx   # X移動量
		self.exist = True # 生存フラグ
	def update(self):
		""" 更新 """
		self.x += self.dx # 移動量更新とか
		if self.x >= 10:
			self.exist = False # ゴールに到達
	def draw(self):
		""" 描画 """
		print "Enemy[%d] (x,dx)=(%d,%d)"%(self.id, self.x, self.dx)

class EnemyManager(ITokenManager):
	""" 敵管理クラス """
	@classmethod
	def createEnemy(cls, id, x, dx):
		""" 敵の生成 """
		enemy = Enemy(id, x, dx)
		cls.append(enemy)

def main():
	# 1次元移動ゲーム?
	EnemyManager.init()
	EnemyManager.createEnemy(0, 0, 2)
	EnemyManager.createEnemy(1, 3, 1)

	for i in range(8):
		print u"ゲームループ:%d回目"%i
		# 更新してー
		for enemy in EnemyManager.getList():
			enemy.update()
			if not enemy.exist:
				# 敵消滅。爆発エフェクトなんかを生成してやりましょう。
				# たとえば、
				# >>>for i in range(5):
				# >>>    EffectManager.createEffect(0, enemy.x, random.randint(-2, 2))
				# とか。
				EnemyManager.remove(enemy)
		# 描画ー
		for enemy in EnemyManager.getList():
			enemy.draw()

if __name__ == "__main__":
	main()

クラスメソッドという機能を使っています。
 
これを使うと、
クラスのスタティックメソッドのように、
どこからでもアクセスできるのがメリットです。
 

@classmethod

というのがPython2.4で追加されたもので、
それに続くメソッドをクラスメソッドにする命令です。
 
ただ、Python2.3とかで実装する場合は、「@classmethod」は使えないので、

class Obj:
	def method(cls):
		pass
	method = classmethod(method)

などとする必要があります。

あと、ITokenの派生クラスでは、デバイスオブジェクトをスタティックに共有していたりします。
(この例では使ってませんがー
 
実行結果はこんな感じです。

ゲームループ:0回目
Enemy[0] (x,dx)=(2,2)
Enemy[1] (x,dx)=(4,1)
ゲームループ:1回目
Enemy[0] (x,dx)=(4,2)
Enemy[1] (x,dx)=(5,1)
ゲームループ:2回目
Enemy[0] (x,dx)=(6,2)
Enemy[1] (x,dx)=(6,1)
ゲームループ:3回目
Enemy[0] (x,dx)=(8,2)
Enemy[1] (x,dx)=(7,1)
ゲームループ:4回目
Enemy[1] (x,dx)=(8,1)
ゲームループ:5回目
Enemy[1] (x,dx)=(9,1)
ゲームループ:6回目
ゲームループ:7回目