第一次纯OO感受

       首先我得先说明:我这里所谓的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!我让所有的"配件"与"配件"之间的联系消失了!这个"配件"要与另一块"配件"通信,好,拜托,请先通知"主板","主板"会帮你转述你的请求!

      这真的是太美妙了!

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,以下是一个使用OO模式的Python代码案例: 场景:设计一个系统来管理学生的课程成绩信息。 1. 分析阶段: Student(学生):属性包括学号,姓名,性别,年龄,班级等。 Course(课程):属性包括课程编号,课程名称,学分等。 Score(成绩):属性包括学号,课程编号,成绩等。 2. 设计阶段: 在设计阶段,我们需要根据分析阶段得出的实体和属性,设计对应的类。 class Student: def __init__(self, stu_id, name, gender, age, clazz): self.stu_id = stu_id self.name = name self.gender = gender self.age = age self.clazz = clazz class Course: def __init__(self, course_id, name, credit): self.course_id = course_id self.name = name self.credit = credit class Score: def __init__(self, stu_id, course_id, score): self.stu_id = stu_id self.course_id = course_id self.score = score 3. 实现阶段: 在实现阶段,我们需要将类实例化并实现对应的功能。 # 实例化学生、课程和成绩 s1 = Student('001', '张三', '男', 20, '计算机科学与技术1班') s2 = Student('002', '李四', '女', 19, '计算机科学与技术2班') c1 = Course('001', 'Python编程', 3) c2 = Course('002', '算法设计', 4) sc1 = Score('001', '001', 90) sc2 = Score('001', '002', 85) sc3 = Score('002', '001', 92) sc4 = Score('002', '002', 88) # 实现学生、课程和成绩的管理类 class Manager: def __init__(self): self.students = [] self.courses = [] self.scores = [] def add_student(self, student): self.students.append(student) def remove_student(self, student): self.students.remove(student) def find_student(self, stu_id): for student in self.students: if student.stu_id == stu_id: return student return None def add_course(self, course): self.courses.append(course) def remove_course(self, course): self.courses.remove(course) def find_course(self, course_id): for course in self.courses: if course.course_id == course_id: return course return None def add_score(self, score): self.scores.append(score) def remove_score(self, score): self.scores.remove(score) def find_score(self, stu_id, course_id): for score in self.scores: if score.stu_id == stu_id and score.course_id == course_id: return score return None # 实例化学生、课程和成绩管理器 manager = Manager() # 添加学生、课程和成绩信息 manager.add_student(s1) manager.add_student(s2) manager.add_course(c1) manager.add_course(c2) manager.add_score(sc1) manager.add_score(sc2) manager.add_score(sc3) manager.add_score(sc4) # 查找学生、课程和成绩信息 student = manager.find_student('001') print(student.name) course = manager.find_course('002') print(course.name) score = manager.find_score('002', '002') print(score.score) 以上就是一个使用OO模式的Python代码案例,实现了学生、课程和成绩信息的管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值