第一次纯OO感受

时间:2021-08-18 21:01:32

       首先我得先说明:我这里所谓的OO感受是很肤浅的,我没有做过大的项目,更没有过软件维护的感受。事实上我比较期待我能有一次做大项目的经历,也许那对于面向对象思维方式的建立会更为有利!

       2月份底的时候我开始做一个自己认为比较完整的游戏,它是一个类似《雷电》的游戏,我会往里面加入尽可能多的元素。可是后来当游戏里的对象越来越多的时候,整个工程开始变的举步唯艰。我立刻意识到,越来越难的设计,代码架构开始期待更好的设计方法!

       以前我的游戏程序里会有那么一点点我所谓的面向对象的影子,游戏程序里面的类看上去似乎没有重用的价值-----除非你的另一个游戏里会有类似的对象!----呵呵,相同的题材会很乏味!-----我只设计类,一个单单的类,没有继承,没有多态,甚至没有重载。现在审视一下,类之间的耦合度也很高(甚至在一些早的东西里,图象处理部分和游戏逻辑部分都放在一起)!---可谓是一堆垃圾代码!

       当我意识到这一点时,我开始继续深入地学习C++,与此同时,我还开始了另一个学习科目---MFC。在学MFC的同时,你知道,那里面就是一大堆一大堆的虚拟函数,多态机制,然后我就总结了我的《对于多态性的学习总结---虚函数的有与没有》。

       看了越来越多的C++OO之后------我甚至接触到了UML-----我渐渐地有了那么点心得。“用看待世界的方法去编写程序,认识世界就是在编程”。那会是多么美妙!

       然后我大致看了《C++编程经典》中的一个电梯案例---那是一个绵延几章的例子,看的我郁闷不已。初步有了点具体的认识,然后就开始我的这个模拟程序:模拟飞机射击类游戏!

      我尽量改变自己的思维方式。我想,我获得了一些效果!

       看一下以下的文档:

    //

2006.3.14

  最近接触面向对象技术比较频繁,有了点心得,决定把这种心得或者说

  是一种思想运用一下.

 

  这是一个飞机射击游戏程序.我将尽可能地用对象来描绘这个游戏.

 

  (如果分析了<C++编程经典>的话,我想要我来构建这个程序会更容易更理论化.)

 

  1.攥写问题描述:

    这是一个飞机射击类游戏的模拟程序。游戏中有一个玩家飞机,和许多玩家飞机产生的子弹

       还有许多敌人飞机,和许多敌人飞机产生的子弹。玩家飞机接收玩家输入,从而使玩家飞机

       产生相应的动作,例如移动和发射子弹。敌人飞机又游戏本身随机产生。玩家飞机和敌人飞机

       都会产生很多子弹。玩家飞机的子弹攻击到敌人,则对应的敌人就消失;而当敌人飞机的子弹攻击

       到玩家飞机,或者敌人飞机撞到玩家飞机时,玩家飞机死亡。(为了简化问题,假设游戏中玩家只有一次生命--即玩家一被敌

       人子弹攻击游戏就结束---这也会是这个程序结束的时候)。

       由于是模拟程序,因此程序里会有个模拟器,它是用来模拟玩家输入的---当然结果就是随机的--

   2.标识系统中的类:

     一个玩家飞机类,敌人飞机类,玩家子弹类,敌人子弹类,模拟类,由这一切组成的游戏类.

 

  

   3.标识对象:

     一个玩家飞机对象,许多敌人飞机对象,许多玩家子弹对象,许多敌人子弹对象,

        一个模拟器对象,一个游戏对象.

   4.标识类属性:

     玩家飞机对象:坐标,当前运动状态(向哪个方向移动,是否发射子弹),当前生命状态,X速度,Y速度

                    

        敌人飞机:坐标,当前运动状态(向哪个方向移动,是否发射子弹),当前生命状态,X速度,Y速度

 

        (二者不同的地方在于,玩家飞机的运动状态是由玩家来决定的,而敌人飞机运动状态是

         其自己决定的)

 

         玩家子弹:坐标,生命状态(是否消失),Y速度

 

         敌人子弹:坐标,生命状态(是否消失),Y速度

        

         模拟类:随机产生的键值-----只用来模拟玩家输入

 

         游戏类:状态(开始,结束),拥有的各种对象

   

       5.标识类行为:

         玩家飞机:移动,接收玩家输入,画自己,发射子弹,

 

         敌人飞机:移动,画自己,发射子弹

 

         玩家子弹:移动,画自己,检测是否击中敌人

 

         敌人子弹:移动,画自己,检测是否击中玩家

 

         模拟类:产生键值

 

         游戏类:调度游戏各个对象的运作,

 

    6.类层次:

         一个基类CObject,二级派生类CPlane,CBullet,三级派生类CPlayerPlane,CEnemyPlane

         ,CPlayerBullet,CEnemyBullet

 

         模拟类

 

         游戏类,CPlayerPlane,CPlayerBullet,CEnemyPlane,CEnemyBullet,CModel类构成.

 

             

2006.3.16

     感觉上这次的模拟程序,难点在写代码前的设计上,一旦确定了设计,

        编码就不难了。

2006.3.16

  21:29

     已测试完成敌人飞机类和玩家类,不打算把子弹类做出来了!主要目的就是想利用这个

        模拟项目锻炼一下自己这几天的成果。

 

 

       基本上,我就觉得,困难的部分在于攥写文档,尤其是描述类与类之间的交互时,比较复杂。编码的时候只要对照着文档,就没有多大难度了。

     PS:2006.3.19

     基于自身的倔强,昨天我又把2月底的那个项目拣回来了.要做下去,要做完,要做出来,信念强烈!

     我按照我刚学到的OOD步骤,从攥写问题描述文档,到建模各个类,一一去做.当我在描述各个类的行为时,我竟然很自然地描述道:玩家飞机类:移动,接受玩家输入,能够通知游戏类对象创造玩家子弹对象,能够告诉游戏类对象怎样来画自己(然后游戏类对象告诉渲染器对象怎样画它.....

      这不就是一种OO思维吗?这些实体对象,他们在现实世界里就是这样做的----放到程序里面去,我依然用代码去描绘他们的这种特性!

      这真是棒极了!在接下来的攥写描述文档中,我变的越来越OO,我真的觉得自己仿佛不是在写程序,而是-----在讲一个故事,故事里的每个角色是怎样来和其他角色交互的!

       到现在为止,这个程序已经完成了大半了!所有零件已经制造出来,剩下的,就是用游戏类对象(程序里定义的对象)把这些零件连接在一起.------真的很象电脑里的主板,我把那些零件安装在上面,然后这个"主板"还要去让所有"配件"互相通信!各个"配件"就是靠这块"主板"来共同工作,从而构成一台性能强劲的PC!我让所有的"配件"与"配件"之间的联系消失了!这个"配件"要与另一块"配件"通信,好,拜托,请先通知"主板","主板"会帮你转述你的请求!

      这真的是太美妙了!

      现在我看到我的上一个游戏项目的代码,觉得粗糙无比,跟垃圾一般.哈哈,我真的是在进步!