C語言寫的俄羅斯方塊

源:C語言寫的俄羅斯方塊git

 

2014年最後一天, 任天堂將風靡全球30年的經典遊戲<<俄羅斯方塊>>下架. 做爲全球最暢銷的遊戲, 其移植版本遍及各個平臺. 下面這個是我去年在51平臺上實現的, 使用12864液晶作爲顯示器, 用矩陣鍵盤操做. 你們都知道標準51只有幾百字節的RAM, 當時我用的那款單片機RAM只有512字節, 使用256字節作爲顯示緩存, 還剩下256字節, 最後竟然也夠用.github

前段時間兄弟很好奇這個遊戲是怎麼運做的(他有C語言基礎), 想讓我給他講一下, 而後我就整理了一下代碼, 將其移植到PC平臺, 後來又將其移植到MSP430 Launchpad上, 使用超級終端(PuTTy)做爲遊戲界面.數組

代碼使用模塊化編寫, 簡單且易於移植. Windows平臺的控制檯程序和MSP430 Launchpad上的絕大部分代碼都是相同的, 只有UI模塊根據平臺進行了重寫. 因此, 若是你想要移植它到其它平臺, 或者使用其它顯示設備, 只要簡單的重寫UI模塊便可實現.緩存

在遊戲模塊中會將消行的行數返回, 而計分和升級全是獨立於模塊以外的, 故可以使用本身的計分方法.模塊化

Windows控制檯版本中的dep文件夾中是依賴模塊, 用於改變控制檯字符顏色與其它一些屬性. 來本身第三方, 詳見文件開頭的聲明.ui

另外在Windos控制檯還實現了一個彩色版本, 接口與單色版本兼容. 在編譯參數中定義 TETRIS_USE_COLOR 宏便可編譯爲彩色版. Windows控制檯版本由GCC編譯, 詳細見對應目錄下的builder.bat批處理文件.接口

MSP430 Launchpad版本使用PuTTy作爲顯示終端, 用IAR For MSP430進行編譯, 對應目錄下有創建好的工程文件可直接使用.遊戲

代碼位於Github, 主分支爲單色版本, 彩色版本見 CTetris 分支.get

原理說明(以單色版本爲例, 彩色版略有區別):it

遊戲主要使用兩個表和一個緩存區來配合進行.

兩個表中一個爲方塊(包括各個變形)的點陣數據表, 另一個爲方塊旋轉時的掩碼錶.

在兩個表中每一個數據爲無符號16位整數, 每4個一組, 能夠排列爲一個4 * 4 的點陣, 方塊數據就記錄於此點陣中.  旋轉掩碼錶的結構相同, 是用於簡化方塊旋轉時衝突判斷, 裏面記錄的是方塊旋轉時通過的全部路徑. 能夠將某一類方塊數據和掩碼數據展開看一下就會很輕鬆明白了.

衝突檢測. 遊戲的運行過程就是根據輸入不改變方塊的座標, 判斷方塊移動狀況, 採起相應的措施. 爲了方便判斷方塊的旋轉, 故使用了旋轉掩碼錶. 旋轉掩碼錶中標爲1的地方就是方塊旋轉到下一個變形所通過的路徑, 其對應的位置不可位於地圖外, 且不可被佔用, 不然表示方塊不可旋轉, 詳見代碼.

消行. 經典的俄羅斯方塊地圖區是10 * 20大小的, 在單色模式下使用了一個uint16_t[20]的數組作爲地圖, 方塊的每一步動做都在地圖中表現出來. 其中每一位表示地圖中的一個小方格, 數組的每個元素實際上只用到10位(橫向), 因此當數據中某一個元素值大於2^10即1023時即代表此行已滿, 再進行消行處理便可.

另外其它一些相關信息可參考源代碼目錄下的readme.md.

查看位於Github的源代碼: https://github.com/ykaidong/Tetris

相關文章
相關標籤/搜索