使用面向对象概念优化条件判断语句的一个小应用

发布于 2022-10-15 10:12:05 字数 5845 浏览 19 评论 0

转:飘啊飘  

使用面向对象概念优化条件判断语句的一个小应用

以前就知道可以通过面向对象来优化条件语句,甚至看到过说面向对象概念可以完全替代条件语句,新想那得弄多少类啊,觉得太累了就没细研究,而且那时是在用C语言,没有面向对象的语法支持。

今天写代码时候,写出了这样的代码:

  1.                 if isinstance(b,Iron):#铁
  2.                     if self._size == Bullet.BIG:
  3.                         b.health -= 1
  4.                     elif self._size == Bullet.LARGE:
  5.                         b.health -= 3
  6.                     elif self._size == Bullet.HUGE:
  7.                         b.health -= 5
  8.                 if isinstance(b,Soil):#土
  9.                     if self._size == Bullet.SMALL:
  10.                         b.health -= 1
  11.                     elif self._size == Bullet.BIG:
  12.                         b.health -= 5

复制代码又臭又长又丑,看了下,也没什么好办法改,条件总是要判断的呀,铁和转块受到攻击时效果不一样,受到不同大小子弹的攻击,效果不一样。
突然灵光一闪,想起了还有继承这么回事。三下五除二,写下了这样的代码:

  1. class Floor(pygame.sprite.Sprite):
  2.     """
  3.     Stage的组成部分。Stage向Game对象传递进来的pygame.sprite.Group对象引用进行填充。
  4.     这是个基类,不同种类的格子通过这个来继承。
  5.     """
  6.     image = None
  7.    
  8.     def _on_small_bullet(self):
  9.         """收到小子弹攻击"""
  10.         raise TypeError,"not implement"
  11.    
  12.     def _on_big_bullet(self):
  13.         """收到大子弹攻击"""
  14.         raise TypeError,"not implement"
  15.    
  16.     def _on_large_bullet(self):
  17.         """收到巨大子弹攻击"""
  18.         raise TypeError,"not implement"
  19.     def _on_huge_bullet(self):
  20.         """收到炮弹攻击"""
  21.         raise TypeError,"not implement"
  22. class Soil(Floor):
  23.     """土"""
  24.     def __init__(self,pos):
  25.         Floor.__init__(self)
  26.         self.pos = pos
  27.         self.health = 5
  28.         self.image = Soil.image
  29.         self.rect = self.image.get_rect(topleft = pos)
  30. #        self.rect = Rect(self.rect)
  31.         pass
  32.         
  33.     def _on_small_bullet(self):
  34.         """收到小子弹攻击"""
  35.         self.health -= 1
  36.    
  37.     def _on_big_bullet(self):
  38.         """收到大子弹攻击"""
  39.         self.health -= 2
  40.    
  41.     def _on_large_bullet(self):
  42.         """收到巨大子弹攻击"""
  43.         self.health -= 3
  44.     def _on_huge_bullet(self):
  45.         """收到炮弹攻击"""
  46.         self.health -= 5

复制代码啊哈,搞定了,而且代码好看很多。
所有砖块元素都继承自Floor,这样就不需要判断类型了。

  1. if self._size == Bullet.SMALL:
  2.                     b._on_small_bullet()
  3.                 elif self._size == Bullet.BIG:
  4.                     b._on_big_bullet()
  5.                 elif self._size == Bullet.LARGE:
  6.                     b._on_large_bullet()
  7.                 elif self._size == Bullet.HUGE:
  8.                     b._on_huge_bullet()

复制代码代码好看了很多。
还是得多写代码啊。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文