使用面向对象概念优化条件判断语句的一个小应用
2011-04-12 21:45
330 查看
以前就知道可以通过面向对象来优化条件语句,甚至看到过说面向对象概念可以完全替代条件语句,新想那得弄多少类啊,觉得太累了就没细研究,而且那时是在用C语言,没有面向对象的语法支持。
今天写代码时候,写出了这样的代码:
if isinstance(b,Iron):#铁
if self._size == Bullet.BIG:
b.health -= 1
elif self._size == Bullet.LARGE:
b.health -= 3
elif self._size == Bullet.HUGE:
b.health -= 5
if isinstance(b,Soil):#土
if self._size == Bullet.SMALL:
b.health -= 1
elif self._size == Bullet.BIG:
b.health -= 5
又臭又长又丑,看了下,也没什么好办法改,条件总是要判断的呀,铁和转块受到攻击时效果不一样,受到不同大小子弹的攻击,效果不一样。
突然灵光一闪,想起了还有继承这么回事。三下五除二,写下了这样的代码:
class Floor(pygame.sprite.Sprite): """ Stage的组成部分。Stage向Game对象传递进来的pygame.sprite.Group对象引用进行填充。 这是个基类,不同种类的格子通过这个来继承。 """ image = None def _on_small_bullet(self): """收到小子弹攻击""" raise TypeError,"not implement" def _on_big_bullet(self): """收到大子弹攻击""" raise TypeError,"not implement" def _on_large_bullet(self): """收到巨大子弹攻击""" raise TypeError,"not implement" def _on_huge_bullet(self): """收到炮弹攻击""" raise TypeError,"not implement" class Soil(Floor): """土""" def __init__(self,pos): Floor.__init__(self) self.pos = pos self.health = 5 self.image = Soil.image self.rect = self.image.get_rect(topleft = pos)# self.rect = Rect(self.rect) pass def _on_small_bullet(self): """收到小子弹攻击""" self.health -= 1 def _on_big_bullet(self): """收到大子弹攻击""" self.health -= 2 def _on_large_bullet(self): """收到巨大子弹攻击""" self.health -= 3 def _on_huge_bullet(self): """收到炮弹攻击""" self.health -= 5
啊哈,搞定了,而且代码好看很多。
所有砖块元素都继承自Floor,这样就不需要判断类型了。
if self._size == Bullet.SMALL: b._on_small_bullet() elif self._size == Bullet.BIG: b._on_big_bullet() elif self._size == Bullet.LARGE: b._on_large_bullet() elif self._size == Bullet.HUGE: b._on_huge_bullet() 代码好看了很多。
还是得多写代码啊。。
今天写代码时候,写出了这样的代码:
if isinstance(b,Iron):#铁
if self._size == Bullet.BIG:
b.health -= 1
elif self._size == Bullet.LARGE:
b.health -= 3
elif self._size == Bullet.HUGE:
b.health -= 5
if isinstance(b,Soil):#土
if self._size == Bullet.SMALL:
b.health -= 1
elif self._size == Bullet.BIG:
b.health -= 5
又臭又长又丑,看了下,也没什么好办法改,条件总是要判断的呀,铁和转块受到攻击时效果不一样,受到不同大小子弹的攻击,效果不一样。
突然灵光一闪,想起了还有继承这么回事。三下五除二,写下了这样的代码:
class Floor(pygame.sprite.Sprite): """ Stage的组成部分。Stage向Game对象传递进来的pygame.sprite.Group对象引用进行填充。 这是个基类,不同种类的格子通过这个来继承。 """ image = None def _on_small_bullet(self): """收到小子弹攻击""" raise TypeError,"not implement" def _on_big_bullet(self): """收到大子弹攻击""" raise TypeError,"not implement" def _on_large_bullet(self): """收到巨大子弹攻击""" raise TypeError,"not implement" def _on_huge_bullet(self): """收到炮弹攻击""" raise TypeError,"not implement" class Soil(Floor): """土""" def __init__(self,pos): Floor.__init__(self) self.pos = pos self.health = 5 self.image = Soil.image self.rect = self.image.get_rect(topleft = pos)# self.rect = Rect(self.rect) pass def _on_small_bullet(self): """收到小子弹攻击""" self.health -= 1 def _on_big_bullet(self): """收到大子弹攻击""" self.health -= 2 def _on_large_bullet(self): """收到巨大子弹攻击""" self.health -= 3 def _on_huge_bullet(self): """收到炮弹攻击""" self.health -= 5
啊哈,搞定了,而且代码好看很多。
所有砖块元素都继承自Floor,这样就不需要判断类型了。
if self._size == Bullet.SMALL: b._on_small_bullet() elif self._size == Bullet.BIG: b._on_big_bullet() elif self._size == Bullet.LARGE: b._on_large_bullet() elif self._size == Bullet.HUGE: b._on_huge_bullet() 代码好看了很多。
还是得多写代码啊。。
相关文章推荐
- 输入任意大小的三个整数,判断其中是否有两个奇数一个偶数。若是,则输出“YES”,不是则输出“NOT” (要求用条件表达式进行判断,不使用if语句)
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
- MSSQL语句的性能调试(三)使用JOIN,ON条件的优化。
- javascript中对条件判断语句的优化
- 9-13 循环语句、条件判断的使用方法及其相关示例
- java小练习(输入一个数字,使用if语句判断匹配的数字)
- SQL语句Where中使用别名作为判断条件
- C语言奇思妙想:求1+2+…+n,要求不能使用乘除法、for、while、if、else、s witch、case 等关键字以及条件判断语句(A?B:C)
- Java得到一个整数的绝对值,不使用任何判断和比较语句,包括API
- 求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
- 求1+2+…+n 要求不能使用 乘 除 法、for、while、if、else、switch、case等关键字以及条件判断语句
- 代码简洁优化的一点思考:函数参数的判断与return 语句的使用
- javascript中对条件判断语句的优化
- Java基础应用之条件语句(判断用户输入月份的季节)
- 求 1+2+3+..n不能使用乘除法、 for 、 while 、 if 、 else 、 switch 、 case 等关键字以及条件判断语句
- 求1+2+3+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字以及条件判断语句
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
- 在水晶报表中写一个条件判断语句
- 练习2-2 在不使用运算符&&或|| 的条件下编写一个与上面的for循环语句等价的循环语句
- 【九度1506】求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。