用Python和Pygame寫遊戲-從入門到精通(實戰二:惡搞俄羅斯方塊1)

發表於2015-12-27

遊戲是為了什麼而存在的?Bingo,是為了娛樂~ 在這個最高主題之前,技術啥的什麼都無所謂!

前一段時間,有位姓劉的網友用Pygame寫了個俄羅斯方塊,在用py2exe打包的時候遇到一些問題,和我交流了一下。有興趣的可以在這裡下載,除了程式碼,打包後的exe檔案也一併提供了。

受他啟發,這次我們就以俄羅斯方塊為主題做一個遊戲吧,但是,我們不能走尋常路啊,得把它整的非常有趣才行。記得曾經在網上看到一個搞笑俄羅斯方塊(視訊地址),當時看了笑到肚子疼啊,時隔很久現在翻出來,一樣笑到脫力:

我們就來做一個這樣的俄羅斯方塊吧:)做好了以後,給朋友玩玩,好好看看他(她,它?)的囧表情!

構架原理

構架這個詞太大了,其實就是草稿了~ 看過這個視訊,我們可以看到這個蛋疼的遊戲有幾種模式,把幾個可能用到我們遊戲中的模式分別整理一下:

  • 落下立刻消失
  • 一螢幕長的長條
  • 掉各種房間的方塊,掛了以後算房錢
  • 長條的寬度稍稍寬於一般尺寸
  • 落下奇怪的東西(豆莢,氣泡等)
  • 長條會從底部消失
  • 方塊非常非常小
  • 同時快速落下三個方塊
  • 落下超級瑪麗,碰到蘑菇長大掛掉
  • 當然我們至少得有一個正常的模式

非常的多,不過這個介面還是都一樣的,不同的是我們掉下的東西和消除判斷。我們先把UI考慮一下,就用普通的俄羅斯方塊的介面就可以了,像這樣:

雖說相當不酷,不過各個部分一目瞭然,應該也可以了。分別是遊戲顯示區,右邊則是下一個方塊的顯示,得分顯示區域,和一些功能按鈕。

接下來我們考慮這個程式的執行機理,我們先從最基本的情況開始。在經典俄羅斯方塊執行的時候,不停的有隨機的方塊落下,使用者控制它們的轉向和位置落下,落下以後,如果穩固的方塊堆有哪一行是完全填充的,就消除得分。

俄羅斯方塊的思想其實非常的簡單,人們熱衷於它,不得不說簡單又有有足夠變化的規則是主因,還有就是使用者受眾很大的關係……

右半部分的都很簡單,分別是下一個方塊,分數和一些功能按鈕,左半部分是和諧,這裡得不停的重新整理,因為方塊不管有沒有操作都會緩慢落下直至完全落地。而一旦落地,就需要看是否消除並重新整理分數,同時落下接著的方塊,並顯示下一個方塊。

原理的進一步思考

俄羅斯方塊誕生於1985年,那時候還沒有什麼成熟的“物件導向”的程式設計方法,所以俄羅斯方塊從一開始,介面就是以古樸的陣列的方式執行的。

如果你有用其他語言編寫俄羅斯方塊的經驗的話,就會知道大多數的實現方法都是維護一個二維陣列(長度對應區域中的格子數,比如20×10。當然也可以是一維的,因為知道寬度,所以轉換很容易),當陣列某一位是1的時候,說明對應的位置有方塊,這個陣列不停的更新,程式就把這個陣列實時的畫到螢幕上,如此而已。

我們再考慮的仔細一點,因為是使用pygame編寫,有沒有什麼更好的方法呢?如果我們把每一個方塊(這裡指四個小方塊組成的整體)當做一個Sprite,那麼就可以很方便的繪製,但是Sprite總是方形的,做碰撞判斷就無效了,所以這樣不行。那如果把每一個小方塊作為一個Sprie,再把四個小方塊組成的放開做一個Group呢?聽起來不錯,但是再想想也非常麻煩,我們就得判斷碰撞的方向,要多做很多事情……考慮良久,感覺還是使用陣列最靠譜啊,真可惜!所以我們也還是用陣列來做這事情吧。

實現初期的一些優化思考

儘管我們仍然使用陣列這種“古老”的方式,我們還是應該要利用一下pygame的繪圖優勢,否則就太失敗了。舉個例子,一般的俄羅斯方塊,在重繪的時候把陣列從頭到尾掃描一遍,碰到一個1就畫一個方塊,俄羅斯方塊的重新整理率就算很低,一秒鐘也要畫了好多次吧(否則後期速度快的時候畫面就“頓”了)。算它是15次,這樣一來,每秒鐘要掃描15次,需要畫幾百甚至上千次方塊,呼叫這麼多次繪圖函式,還是相當浪費資源的。

我們可以這麼考慮,除了陣列之外,我們還維護一個已經落下的方塊的圖形的Surface,這樣每次只需要把這個Surface貼到螢幕上就可以了,非常的輕量級。而這個Surface的更新也只需要在新的方塊著地以後進行,完全可以在判斷消除的程式碼裡一起做,平均幾秒鐘才會執行一次,大大減少了計算機的工作了。當然,這個簡單的程式裡,我們這麼做也許並不能看到效能的提升,不過一直有這麼的思想,當我們把工程越做越大的時候,和別人的差距也許就會體現出來了。

同時,出於人性化的思考,我們是不是可以提供使用者點選其他視窗的時候就把遊戲暫停了?實現起來並不困難,但是好感度的提升可是相當的大。

實現中的一些細節

按左向左,按右向右,這一點事毫無疑問的,不過當我們按著向左向右不放的時候,就會持續移動,這一點也是要注意的,上面那位朋友實現的俄羅斯方塊就沒有考慮這一點,當然可能還是中途的版本的關係,我們這裡要考慮到。

因為我們要實現幾種不同模式的俄羅斯方塊,那麼比較一般的考慮方法就是先實現一個通用的、標準的而定製能力又很強的遊戲類。當我們以後去做其他模式的時候,可以很方便的從這個類擴充套件出來,所以一開始設計的時候,就要儘可能多的考慮各種變種。

另外,考慮這次就完全使用鍵盤來控制吧,滑鼠就不要了,上面的概念圖,旁邊幾個按鈕請無視……

下一次開始,我們就從基本的框架開始,慢慢地搭一個不同尋常的俄羅斯方塊出來。

相關文章