遊戲介紹:
顧名思義,俄羅斯方塊自然是俄羅斯人發明的。這位偉人叫做阿列克謝·帕基特諾夫(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 每個點...