用物件導向方法進行俄羅斯方塊遊戲設計(持續更新中)

2021-04-15 23:00:17 字數 2595 閱讀 2914

遊戲介紹:

顧名思義,俄羅斯方塊自然是俄羅斯人發明的。這位偉人叫做阿列克謝·帕基特諾夫(alexey pazhitnov)。這款遊戲操作簡單,老少皆宜,也是乙個不錯的練手專案。

首先給幾個經典的遊戲介面先(當然,我們的目的是做出類似的效果)

遊戲介面1:

遊戲介面2:

遊戲介面3:

遊戲介面4:

遊戲的基本操作很簡單:

←:左移

→:右移

↑:旋轉

↓:加速下降

當然,最好是可以自行設定快捷鍵,比方說用wsad來代替。

遊戲場景:

開啟遊戲,選擇遊戲難度,按開始鍵進行遊戲。在遊戲正上方會隨機生成乙個種類的方塊,同時還會顯示下乙個方塊的樣子。用左右方向鍵控制方塊的方向,用向上方向鍵旋轉方塊,用向下方向鍵加速下降。方塊遇到牆壁或者撞到靜止的方塊不能穿透。底下方塊如果填滿一行,則進行消除。一次消除得越多,則得分越多。當方塊到底後,會將之前已經預顯示的方塊放置到窗體正上方再下落。這樣迴圈往復,直到靜止的方塊堆到頂,遊戲結束。

思考:

首先,需要找出可以抽象出的類。從遊戲的場景先找出一些物件:

物件:

行為:

俄羅斯方塊的另乙個名稱是「砌牆」,我覺得這樣更加形象生動。因此可以將上面的物件轉換成:

因此,初步的類圖就出來了,如下:

哈哈,現在我們終於有了一些基本的類了:

現在我們就看看這些物件之間的關係。磚頭和牆的唯一關係就是當磚頭觸底的時候,就會成為牆的一部分。因此wall需要有乙個接收磚頭brick的操作,我們稱之為砌牆buildwall(brick). 而wall和brick都是依附於房子house的,因此這兩個類(wall,brick)是house的乙個部分,並且牆的寬度不能超過房子的寬度,而磚頭只能在房子裡左、右、下,旋轉的移動。

首先來看一下這些移動方法(moveleft,moveright,movedown,rotate)應該加入到哪個類中。

最直接的是放到brick類中,因為我們是移動磚頭,看看有什麼問題呢?對了,brick在左移和右移時,需要知道是否碰壁了。因此,在這些方法中需要知道房子的寬度,同時要知道是不是到底碰到牆了。這樣wall要包含brick,而brick也要包含wall和house。嘿嘿,似乎有點問題~~~~~~

直覺,放到wall方法中是相當沒有道理的,那就放到house中。由house來控制brick的移動和旋轉,似乎不錯,比較完美了。

再接下想想,有好多種不同樣子的磚頭,除了樣子不同以外,操作都是類似的。那brick就變成抽象類了,其他種類的磚頭從brick中繼承。

(寫累了,先到這裡...)

繼續....

問題來了......磚頭有很多種,每一種都可以旋轉成其他樣式的磚頭(除了四四方方那個大方塊怎麼轉都是一樣外)。那具體的磚頭類有多少種呢?

第一種做法:

把每次旋轉後的不同樣式的磚頭當成另乙個class,這樣的好處是,可以在class中標記下次旋轉後變成那種型別的class。不足之處是需要擴充套件4倍的class(汗~~~~~~)。愛偷懶的就用這種:)

第二種做法:

只生成基本的旋轉型別,其他型別的位置通過旋轉方法獲得,這種方法的好處是class會比較少,推薦這種做法。

接下來開始找行為了,之前已經確定了一些行為,如下 (可能還有些不合理,之後會再重構):

回到之前移動磚頭的問題,磚頭在左移和右移的過程中,可能會撞到牆壁,因此需要有是否撞牆的行為判斷:isagainstwall。為了更好的表達出撞的是哪邊的牆,我們再把這個行為拆分:isagainstleftwall(), isagianstrightwall()。同時,在movedown的過程中,我們還需要檢測是否碰到牆了。因此也要增加乙個行為:isagainstdownwall()。到底後,如果某一行已經填滿,還要有乙個消去一行牆的行為:removewall()。同時,到底後,原來的磚頭就變成牆了,需要再生成新的磚頭:createnewbrick()。

當然,如果越堆越高,到頂了,砌牆就結束了,所以還要有乙個是否到頂的行為:isagainsthead().至於建築工人,當然是有開始/結束砌牆的行為了。

好事情,行為(方法)越來越多了.....我們先將這些行為堆積到class中(還是以自覺為主,隨便放^_^).

這下子我們的類圖又豐富了:

用C 實現俄羅斯方塊

include using namespace std 構造完成標誌 bool sign false 建立數獨矩陣 int num 9 9 函式宣告 void input void output bool check int n,int key int dfs int n 主函式 int main ...

用c實現俄羅斯方塊遊戲過程

include include include include include define row ar 28 define col ar 14 define block x 4 define block y 2 define originallocationx 7 define original...

canvas實現俄羅斯方塊的方法示例

好久沒使用canvas了,於是通過寫小遊戲 俄羅斯方塊 再次熟悉下canvas,如果有一定的canvas基礎,要實現還是不難的。原理詳解 看遊戲最終介面,可知需要實現以下關鍵功能 介面的實現 整個面板就是以左上角 0,0 為原點的座標系,右上角 12,0 左下角 0,20 右下角 12,20 每個點...