Fork me on GitHub

飞机大战游戏设计

本项目基于 Python3 进行开发,使用了 pygame 模块。

开发这个项目的目的不是为了做游戏,而是熟悉 设计模式

源代码

源码已经托管在Github,戳我 查看源码。你也可以通过使用命令 git clone git@github.com:CongLinDev/AirplaneWarGame.git 直接下载源码查看。

类图

类图如下:

uml.png

设计模式

该项目用到了多种设计模式,但由于Python是动态语言,所以一些可以用到的设计模式没有涉及。

静态工厂方法

对于 PlaneBullet 的创建均是使用了静态工厂创建。

生成器

游戏中的 Level 实质上是一个生成器,根据 Level 的不同,生成的 EnemyPlane 数量不同,其组装的 EnemyPlaneGroup 也不同。

桥接

游戏中的 Listener 起到了桥接的作用,监听按下不同 Button 对象。

享元工厂

这里设计的享元的作用是一次加载所需的资源如图片、音乐等。不同常规的是,这里的享元工厂并没有工厂,笔者把它设计成 单件模式 的效果。

单件模式

这里的享元使用Python的type方法进行创建其元类,只需要使用一个语句 __metaclass__ = metaflyweight 即可将类变成单件。函数 metaflyweight 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#纯函数式使用元类
#type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))
metaflyweight = lambda name, parents, attrs: type(
name,
parents,
dict(attrs.items() + [
('__instances', dict()),
('__new__', classmethod(
lambda cls, *args, **kargs: cls.__instances.setdefault(#setdefault() 键如果不在字典中,会更新字典
tuple(args),
super(type(cls), cls).__new__(*args, **kargs))
)
)
])
)

命令模式

游戏中玩家飞机的子弹由玩家飞机通过一个 Command 的子类进行通知发射,其作用是为了使发射子弹与飞机移动进行 时间 上的解耦,有利于以后的扩展。

Demo

demo

扫描二维码,拯救贫困山区大学生!
-------------本文结束感谢您的阅读-------------