• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            攀升·Uranus


            Something Different,Something New
            數(shù)據(jù)加載中……

            模式應(yīng)用(二) 俄羅斯方塊設(shè)計的思考:用OO的思想

                     大學(xué)的時候看同學(xué)用C寫的俄羅斯方塊,今天心血來潮,突然想設(shè)計下用OO的思想來設(shè)計下。俄羅斯方塊是一以前俄羅斯的計算機科學(xué)家自己開發(fā)娛樂的小游戲,沒想到后來這么流行。

                    像俄羅斯(Tetris)方塊,迷宮,推箱子這種小游戲,其實建模都差不多,這里我選擇一個2維數(shù)組10×20的來代表整個游戲區(qū)域的顯示點,0代表該位置空,1代表有方塊。 每一個數(shù)組值(a[2][4])代表屏幕上的一個像素,數(shù)組類似于:
                    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, 就是每行是不是數(shù)組值都是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);   //把數(shù)組第i行全置0
                       }
                       3......其它的判斷類似

                        好,具體的設(shè)計思想?yún)⒖紙D1-1
                         

                                                                                                   圖1-1      

                     
                     在游戲操作中,有六個鍵, 上下左右+左右旋轉(zhuǎn), 該圖中Form是邊界類與UI和用戶控制打交道,Handler業(yè)務(wù)控制類, ManageArray操作singleton數(shù)組和控制一些比較復(fù)雜算法的類。

                     首先該設(shè)計把整個業(yè)務(wù)算法等等從界面分離開,不管你用什么Iphone的UI的SDK還是android的, 都沒問題。 他們只與我們的UIForm打交道。
                     再次這邊的Singleton模式把數(shù)組暴露給想要他的程序。
                     最后用策略模式把旋轉(zhuǎn)的算法分開,每個算法只關(guān)心自己怎么變化,想擴展就加一個類,如果一個算法要修改,那么只修改某一個方法。開閉原則。
                       
                     望各位博友指點
               
                  

            posted on 2008-12-28 23:36 攀升 閱讀(4302) 評論(16)  編輯 收藏 引用 所屬分類: Design patternOO&UML

            評論

            # re: 俄羅斯方塊設(shè)計的思考  回復(fù)  更多評論   

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

            # re: 俄羅斯方塊設(shè)計的思考  回復(fù)  更多評論   

            我覺得設(shè)計中加上觀察者模式是最合理的,UI觀察Array的變化,Array被Handle更新后,通知UI刷新,這樣就更靈活了。
            2008-12-29 08:58 | jfish

            # re: 俄羅斯方塊設(shè)計的思考  回復(fù)  更多評論   

            厲害餓
            2008-12-29 09:38 | 沈臻豪(foxtail)

            # re: 俄羅斯方塊設(shè)計的思考  回復(fù)  更多評論   

            @jfish
            謝謝提醒,其實我這有個觀察者模式,在UIForm里面,但沒有表達清楚。
            2008-12-29 09:39 | 攀升

            # re: 俄羅斯方塊設(shè)計的思考:用OO的思想  回復(fù)  更多評論   

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

            # re: 俄羅斯方塊設(shè)計的思考:用OO的思想  回復(fù)  更多評論   

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

            # re: 俄羅斯方塊設(shè)計的思考:用OO的思想  回復(fù)  更多評論   

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

            # re: 俄羅斯方塊設(shè)計的思考:用OO的思想  回復(fù)  更多評論   

            @代李
            open source的starUML




            2008-12-29 22:19 | 攀升

            # re: 俄羅斯方塊設(shè)計的思考:用OO的思想  回復(fù)  更多評論   

            不同的Whirl的區(qū)別是形狀而不是行為,因此這里使用多態(tài)是錯誤的。

            應(yīng)當(dāng)使用builder,可以考慮從文件讀取形狀,這樣能夠需要的時候外部添加Whirl。
            2008-12-30 03:00 | 陳梓瀚(vczh)

            # re: 俄羅斯方塊設(shè)計的思考:用OO的思想  回復(fù)  更多評論   

            @陳梓瀚(vczh)
            呵呵,我可能沒表達清楚

            這邊的iwhirlstrategy及其繼承類其實是指當(dāng)用戶點擊旋轉(zhuǎn)按鈕后,每一個不同形狀的要怎樣去變化的算法集。

            在這里我并沒有創(chuàng)建每一個形狀。

            2008-12-30 09:45 | 攀升

            # re: 俄羅斯方塊設(shè)計的思考:用OO的思想  回復(fù)  更多評論   

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

            # re: 俄羅斯方塊設(shè)計的思考:用OO的思想  回復(fù)  更多評論   

            恩。好。
            ps:UML 圖是用啥畫的呢?
            ~~~~~~~~~~~~~~~~~

            是用windows自帶的畫板畫的啊,花了1個多小時才畫好
            2008-12-30 17:41 | 山寨攀升·Uranus

            # re: 俄羅斯方塊設(shè)計的思考:用OO的思想  回復(fù)  更多評論   

            @山寨攀升&#183;Uranus

            看來有人在這惡搞呀
            2008-12-30 17:46 | 攀升

            # re: 俄羅斯方塊設(shè)計的思考:用OO的思想  回復(fù)  更多評論   

            @攀升

            難道他們旋轉(zhuǎn)的行為不是一樣的么,給定一個bool矩陣,立刻就定義出來了。不存在行為上的區(qū)別。

            當(dāng)然我的意思是說,每一個物體的旋轉(zhuǎn)是可以自動完成的,需要一個一個自己來的話是非常麻煩的。既然可以自動完成,那么就一致了,然后多態(tài)的好處立刻就不見了。
            2008-12-30 22:42 | 陳梓瀚(vczh)

            # re: 俄羅斯方塊設(shè)計的思考:用OO的思想  回復(fù)  更多評論   

            @陳梓瀚(vczh)
            哦,我明白你的意思了
            不過這邊每個物體的旋轉(zhuǎn)是要根據(jù)他所在的位置來算的,能不能轉(zhuǎn),轉(zhuǎn)后是怎樣的等等。需要一個一個算得
            2008-12-30 23:30 | 攀升

            # re: 俄羅斯方塊設(shè)計的思考:用OO的思想  回復(fù)  更多評論   

            @陳梓瀚(vczh)

            呵呵,你的腳本寫的俄羅斯就是從文件載入然后旋轉(zhuǎn)也是通過相同的變換矩陣實現(xiàn)的。可是人家用自己的能實現(xiàn)也沒什么不好哈
            2008-12-31 22:12 | 沈臻豪(foxtail)
            国产精品九九久久免费视频| 99久久精品影院老鸭窝| 久久国产成人午夜aⅴ影院| 久久最近最新中文字幕大全 | 亚洲国产成人久久一区久久 | 亚洲国产一成久久精品国产成人综合| 色狠狠久久综合网| 久久精品国产精品亚洲精品 | 久久国语露脸国产精品电影 | 国产AV影片久久久久久| 国产精品久久久久一区二区三区| 精品久久人人妻人人做精品| 99久久精品国产综合一区| 久久久国产99久久国产一| 国产精品18久久久久久vr| 精品久久久久久无码人妻蜜桃 | 亚洲av伊人久久综合密臀性色| 精品久久久噜噜噜久久久| 91精品国产91久久| 久久婷婷五月综合色高清| 伊人久久大香线蕉精品| 国产成人精品综合久久久久| 久久久久AV综合网成人| 人人狠狠综合久久亚洲高清| 综合久久精品色| 婷婷久久综合九色综合绿巨人| 久久av无码专区亚洲av桃花岛| 国内精品久久久久久久久电影网| 久久久久亚洲AV成人网人人网站 | 精品人妻久久久久久888| 亚洲国产精品狼友中文久久久| 狠色狠色狠狠色综合久久| 久久男人Av资源网站无码软件| 久久影视综合亚洲| 亚洲美日韩Av中文字幕无码久久久妻妇 | 狠狠综合久久综合中文88 | 久久久久国产精品嫩草影院| 久久精品人人槡人妻人人玩AV | 久久精品国产一区二区三区不卡| 97久久超碰国产精品旧版| 久久精品人成免费|