學了java,一直想找一個項目實戰,俄羅斯方塊就是一個不錯的實戰項目,它原理實現比較簡單。話雖如此,我一開始仍是毫無頭緒,直到去油管上看一個俄羅斯方塊的視頻和在GitHub上看他實現的源碼,纔有了思路。我基於他的程序作了一些加工,作出了下面的半成品。俄羅斯方塊仍是比較適合新手練習的,我將在下面分享一些我在作這個項目的一些技巧和體會,歡迎討論!java
我使用的不是swing而是比較新的javafx,但事實上,javafx我也只是學我須要用到的地方,因此若是你用過swing,上手javafx製做一個俄羅斯方塊仍是比較快的,畢竟咱們只須要javafx不多的比較經常使用的API。git
俄羅斯方塊有以下七種形狀:github
它們的名稱爲:O, J, L, Z, S, T, I(把字母和圖形對比一下你就知道爲何這麼叫了)。其次,每一個方塊最多有4種變換形態。下面是我在一篇博客看到的因此變換:數組
首先,是設計類來表示這七種形狀,這裏我一開始是想用七個類繼承一個基類來實現,後來發現不如一個類寫一塊兒比較簡單,具體思路是設計出一個形狀類,它具備name等屬性,而當程序在new的時候,name會隨機選擇七個name中的一個,而後後續的方法和操做則以這個name爲依據。形狀類初始化和翻轉方法會由於其name的不一樣而不一樣。部分代碼以下:設計
以後,咱們生成一個二維數組做爲零一矩陣來表示形狀當前的位置,形狀移動時,除了檢查不要越過邊界以外,還須要檢查移動是否會碰到其它形狀,這就是咱們這個二維數組的做用了,應該很容易理解。cdn
形狀的移動方法有三種:右移,左移,和下移。前面兩個實現起來比較簡單,最後一個由於須要考慮到比較多的因素而比較複雜。在這裏,我須要對下一個形狀進行預測,這就意味着我必須在當前控制的形狀沒法移動是,交換控制權給下一個形狀。因此實際上每一個時刻最上方有兩個形狀生成,只不過其中一個是靜止而且不可見的。當切換控制權以後,就必須檢查是否需消行了,部分代碼以下:視頻
後面就是我以爲比較難的消行操做了,若是處理很差會出現不少奇怪的bug,我實現現整體思路以下: 先檢查整個二維數組,找到能夠消的「行」,而後將全部須要消除的行記錄並消除,消除以後,將沒有消除的方塊下移對應的距離,最後再更新二維數組。blog
以上,就是整體的設計和實現思路了,剩下的界面其它元素設計和其它細節設計都比較簡單,就再也不累述,最後分享一下我看的油管視頻的連接以供參考,以及個人項目源碼。繼承
www.youtube.com/watch?v=boA…get