hzthzthzt 发表于 2008-2-20 19:10:09

从红警到星际——编程思想的转变

最开始玩的是红警,那时候一般只造一个兵营和一个机械厂,然后疯狂点兵,等着1个1个慢慢造出来(我只打电脑)。后来接触星际了,开始非常的不习惯,因为它没有一个固定的界面,可以造各种单位,而是要先选取一个建筑,然后在屏幕右下角选兵来造。后来又发现,星际里,都是要先选一个东西,然后右下角出现这个东西可以进行的操作,习惯了之后,觉得星际这样的设计更加合理,更加符合世界的本来面貌。

恰好那时学了c++这门课,一直不太明白面向对象程序设计是什么意思,和面向过程有什么区别,突然我想到了星际,这不就是面向对象程序设计的经典案例吗?

让我们来看看c++和星际的共同点。

面向对象程序设计的核心概念就是类和对象,星际里,一种单位就是一个类,这个单位的实例就是对象,比如zealot是个类,而游戏中你造出的一个zealot就是一个对象。

类有数据成员和成员函数,星际里的一个单位,也有属性和它的方法,还是以zealot为例,他的属性有血量、攻击力、盔甲、是否被辐射等等很多很多,他的方法有移动,攻击,hold等等,就是右下角里显示的。
这些属性都是只读的,体现了类的封装性,你不可以直接修改zealot的血量,除非你通过方法,比如你A他,或者给他补血。

类的另一个重要特征是继承性,星际里,很多单位都有共同属性,比如血量,盔甲,是否中绿毒等等,还有很多共同方法,如move,stop等等。将这些特征抽象出来,组成一个基类,有这些特征的单位继承这个基类,当然这个基类在游戏中是不会出现实例的。
类还可以组合,如航母包括本体和小飞机,tank包括底座和炮台。
类还有多态性,比如对函数重载来说,同时点右键,却可以是移动,或攻击或修理,这取决于点中的单位是什么,好比调用相同名称的函数,具体是哪一个由参数决定。
还有运行时的多态,比如相同的方法,不同的对象执行他有不同的含义,好比同是A键,有些单位是attack,mm却是补血。

红警是不是用面向过程语言写的我不敢肯定,但是他的操作方式无疑很符合面向过程的思想,他不是先选一个单位,然后进行操作,而是直接先选操作,然后看操作什么单位。相当于这个操作是个全局函数,参数是各个单位。

显然,这是将操作与数据脱离了的,因为操作不属于任何一个类。

总结:星际这款游戏体现了面向对象思想的精髓,如果你打算学习c++等面向对象语言,
我建议你先学会打星际。

rivermen 发表于 2008-2-21 10:10:40

触类旁通~~~个人的机遇不同,却能殊途同归

puchonghui 发表于 2008-2-21 21:42:25

lz所提到的星际操作上的相对复杂性,以及操作不属于任何一个类
我觉得这个是目前面向对象所亟待解决的问题
在面向过程时代,程序被看成是算法+数据结构
而从目前的oo模式来看,仅仅停留在对于总体结构的对象化认识上
对象之间的关系和最终系统的实现依然靠过去的数据结构和算法
事实上我们所处的这个世界本身并非完全是面向对象的,很多问题非要用对象化的理念去解释会很痛苦
个人看法。。唔。。

zealzpc 发表于 2008-2-22 00:00:31

1事实上我们所处的这个世界本身并非完全是面向对象的,很多问题非要用对象化的理念去解释会很痛苦

2在面向过程时代,程序被看成是算法+数据结构

============
能具体说下嘛
很感兴趣

[ 本帖最后由 zealzpc 于 2008-2-22 00:01 编辑 ]

puchonghui 发表于 2008-2-23 20:23:51

原帖由 zealzpc 于 2008-2-22 00:00 发表 http://bbs.51testing.com/images/common/back.gif
1事实上我们所处的这个世界本身并非完全是面向对象的,很多问题非要用对象化的理念去解释会很痛苦

2在面向过程时代,程序被看成是算法+数据结构

============
能具体说下嘛
很感兴趣

程序=算法+数据结构这个理念是Niklaus Wirth提出的,76年的时候他出版了一本同名的书。 有兴趣可以去搜索一下。

面向对象的这个问题我觉得牵涉到人的认知过程。 唔。。。试着解释一下。。。:$
在现实世界里的所有一切都是对象实例,对象只是一个抽象的概念。 所以人的认知是从认识对象实例开始的,然后再逐渐抽象成对象,再从已有对象中继承出一些新的对象来。 但是有的时候,我们所关心的只是某个对象实例的特定行为,这个时候如果非要从对象本身入手来体现对象实例的行为可能就会很痛苦。

mydreams 发表于 2008-2-26 21:52:19

有意思的观点
页: [1]
查看完整版本: 从红警到星际——编程思想的转变