攀升·Uranus


Something Different,Something New
数据加载中……

模式应用(二) 俄罗斯方块设计的思考:用OO的思想

         大学的时候看同学用C写的俄罗斯方块,今天心血来潮,突然想设计下用OO的思想来设计下。俄罗斯方块是一以前俄罗斯的计算机科学家自己开发娱乐的小游戏,没想到后来这么流行。

        像俄罗斯(Tetris)方块,迷宫,推箱子这种小游戏,其实建模都差不多,这里我选择一个2维数组10×20的来代表整个游戏区域的显示点,0代表该位置空,1代表有方块。 每一个数组值(a[2][4])代表屏幕上的一个像素,数组类似于:
        a[20][10] = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                              {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                              {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                              {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                              {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                              {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                              {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                              .........................................
                           }      
         这里有几个简单的判断:
         1. 判断是不是方块撞到墙上,就是看a[i-1]中i-1是不是<0或i+1是不是>10;
         2. 判断一层能不能clear, 就是每行是不是数组值都是1
            int k = 0; 
            for(int i=0; i<20; i++){
                for(int j = 0; j<10; j++){
                     if(a[i][j] == 1)
                            k++;
               }
               if(k==10)
                   ClearRow(i);   //把数组第i行全置0
           }
           3......其它的判断类似

            好,具体的设计思想参考图1-1
             

                                                                                       图1-1      

         
         在游戏操作中,有六个键, 上下左右+左右旋转, 该图中Form是边界类与UI和用户控制打交道,Handler业务控制类, ManageArray操作singleton数组和控制一些比较复杂算法的类。

         首先该设计把整个业务算法等等从界面分离开,不管你用什么Iphone的UI的SDK还是android的, 都没问题。 他们只与我们的UIForm打交道。
         再次这边的Singleton模式把数组暴露给想要他的程序。
         最后用策略模式把旋转的算法分开,每个算法只关心自己怎么变化,想扩展就加一个类,如果一个算法要修改,那么只修改某一个方法。开闭原则。
           
         望各位博友指点
   
      

posted on 2008-12-28 23:36 攀升 阅读(4266) 评论(16)  编辑 收藏 引用 所属分类: Design patternOO&UML

评论

# re: 俄罗斯方块设计的思考  回复  更多评论   

UML图挺好
2008-12-29 08:35 | LOGOS

# re: 俄罗斯方块设计的思考  回复  更多评论   

我觉得设计中加上观察者模式是最合理的,UI观察Array的变化,Array被Handle更新后,通知UI刷新,这样就更灵活了。
2008-12-29 08:58 | jfish

# re: 俄罗斯方块设计的思考  回复  更多评论   

厉害饿
2008-12-29 09:38 | 沈臻豪(foxtail)

# re: 俄罗斯方块设计的思考  回复  更多评论   

@jfish
谢谢提醒,其实我这有个观察者模式,在UIForm里面,但没有表达清楚。
2008-12-29 09:39 | 攀升

# re: 俄罗斯方块设计的思考:用OO的思想  回复  更多评论   

有没有代码? 共享一下? ^_^
2008-12-29 12:31 | li_young

# re: 俄罗斯方块设计的思考:用OO的思想  回复  更多评论   

思路很好,受教了。。
2008-12-29 17:50 | bneliao

# re: 俄罗斯方块设计的思考:用OO的思想  回复  更多评论   

恩。好。
ps:UML 图是用啥画的呢?
2008-12-29 21:00 | 代李

# re: 俄罗斯方块设计的思考:用OO的思想  回复  更多评论   

@代李
open source的starUML




2008-12-29 22:19 | 攀升

# re: 俄罗斯方块设计的思考:用OO的思想  回复  更多评论   

不同的Whirl的区别是形状而不是行为,因此这里使用多态是错误的。

应当使用builder,可以考虑从文件读取形状,这样能够需要的时候外部添加Whirl。
2008-12-30 03:00 | 陈梓瀚(vczh)

# re: 俄罗斯方块设计的思考:用OO的思想  回复  更多评论   

@陈梓瀚(vczh)
呵呵,我可能没表达清楚

这边的iwhirlstrategy及其继承类其实是指当用户点击旋转按钮后,每一个不同形状的要怎样去变化的算法集。

在这里我并没有创建每一个形状。

2008-12-30 09:45 | 攀升

# re: 俄罗斯方块设计的思考:用OO的思想  回复  更多评论   

@代李
是用windows自带的画板画的啊,花了1个多小时才画好。
2008-12-30 17:40 | 山寨攀升·Uranus

# re: 俄罗斯方块设计的思考:用OO的思想  回复  更多评论   

恩。好。
ps:UML 图是用啥画的呢?
~~~~~~~~~~~~~~~~~

是用windows自带的画板画的啊,花了1个多小时才画好
2008-12-30 17:41 | 山寨攀升·Uranus

# re: 俄罗斯方块设计的思考:用OO的思想  回复  更多评论   

@山寨攀升&#183;Uranus

看来有人在这恶搞呀
2008-12-30 17:46 | 攀升

# re: 俄罗斯方块设计的思考:用OO的思想  回复  更多评论   

@攀升

难道他们旋转的行为不是一样的么,给定一个bool矩阵,立刻就定义出来了。不存在行为上的区别。

当然我的意思是说,每一个物体的旋转是可以自动完成的,需要一个一个自己来的话是非常麻烦的。既然可以自动完成,那么就一致了,然后多态的好处立刻就不见了。
2008-12-30 22:42 | 陈梓瀚(vczh)

# re: 俄罗斯方块设计的思考:用OO的思想  回复  更多评论   

@陈梓瀚(vczh)
哦,我明白你的意思了
不过这边每个物体的旋转是要根据他所在的位置来算的,能不能转,转后是怎样的等等。需要一个一个算得
2008-12-30 23:30 | 攀升

# re: 俄罗斯方块设计的思考:用OO的思想  回复  更多评论   

@陈梓瀚(vczh)

呵呵,你的脚本写的俄罗斯就是从文件载入然后旋转也是通过相同的变换矩阵实现的。可是人家用自己的能实现也没什么不好哈
2008-12-31 22:12 | 沈臻豪(foxtail)

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理