上一次我们完成了面向过程的飞机大战编程,接下来我们来重新编写一个面对对象的飞机大战。
我自己的飞机大战(面向对象)源码:(http://note.youdao.com/noteshare?id=833c2cca5acf5bd81772d293d17279bd)
由于实现的功能和(上)是一样的,就不放动图展示效果了。
一、普通封装
1、首先还是先创建窗口、图标、背景和标题
2、接下来我们创建我方飞机
这时候就可以通过一个类来定义我方飞机。
然后创建我方飞机实例,调用显示在窗口中的方法
3、让飞机移动
(1)先设置一个函数,放在飞机类和建立窗口之间。
(2)然后给飞机类添加移动方法:
Move里的if 是为了限制飞机别飞出窗口了。
(3)添加长按移动,并调用移动函数
上下移动自己添加就行,方法都是一样的。
4、创建敌机
和创建我方飞机完全一样的方法,因为敌方飞机时自动移动的,需要重写move方法。
然后创建敌方飞机实例,调用显示在窗口中的方法和移动的方法
5、接下来是建立子弹类
(1)我方子弹:
先创建子弹类:
然后在我方飞机的类中添加射击和子弹发射代码
最后在控制函数里加入空格射击:
(2)敌方子弹
其实和我方的完全一样,只不过是自动发射,先调用随机函数import random,然后建立敌方子弹类。
然后在敌方飞机的类中进行修改:
这样就实现敌方飞机随机射击了。
6、飞机动态效果
先学一个牛逼的方法。循环列表。
有一个列表a=【1,2,3,4】,我现在想要循环取出123412341234应该如何呢?
这时候需要用这样一个循环条件:i = (i+1)%len(a) ,大家好好思考一下,如果i小于最后一个数的下标,那和平时一样,当i等于最后一个数的下标,i就会变为0。
现在我们把这个方法用在我们的动态效果中:
先要删除原先显示飞机的那句话,然后输入如下:
7、飞机爆炸效果:
还是需要用到上面的方法。
(1)我方飞机
先在我方飞机类中添加碰到子弹爆炸的方法:
然后在之前显示飞机喷火的那里加上爆炸的代码:
然后调用碰撞方法:
(2)敌方飞机
完全一样,子弹改为我方的,飞机改为敌方的就行
先在敌方飞机类中添加碰到子弹爆炸的方法:
然后在敌方飞机显示的那里加上爆炸的代码:
然后调用碰撞方法:
二、强封装
这样封装性比较差的程序就做好了,但是大家肯定发现个问题,不同类里好多的代码都是一模一样的,
1、这时候我们先把两个飞机类中共性的东西抽取出来,做一个公共飞机类,BasePlane()
黄色为两个飞机类一样的敌方:
(1)我们抽取出来,放在BasePlane()中,
(2)我方飞机继承父类BasePlane():删除父类中包含的变为:
(3)敌方飞机继承父类BasePlane():删除父类中包含的变为:
把在while True中的调用移动删除,在函数中调用(我之前的一个小错误,效果其实一样的)
2、这时候我们在看看我方和敌方射子弹
一模一样,只是子弹移动方向和子弹图片不一样,那我们创建一个子弹类,加上图片和子弹方向参数。
(1)创建子弹类Bullet() 加入path:图片地址和moveSize:子弹移动速度
(2)删除原先的两个类,修改我方飞机和敌方飞机里的射击方法
我方:-5就是往上射,调用类的名字也得改为Bullet
敌方:3就是往下射,调用类的名字也得改为Bullet
3、抽中抽
让我们观察之前抽出来的Bullet()和 BasePlane():
还是有一样的,继续抽,我们给这两个父类再建立一个父类Base():
然后修改Bullet(),让他继承Base()
同样的方法修改BasePlane():
这样,一个190行的代码就变成了150行。
我们在未来的开发中,也需要用到这种方法,精简自己的代码,让代码更具观赏性。当我把代码收起来后,你会发现,整个程序被分成了几个部分‘
这就是python的高度封装。抽丝剥茧,通过继承和多态的方式让代码更精简。
封装好一个已经能够实现功能的函数之后如果想要为其添加新功能,记住不要修改原函数的函数体内代码,使用闭包的思路添加功能更合适所以,维护的问题不是什么大问题,面向对象的问题在于代码逻辑和人的逻辑的脱离,理解成本上升了