平時有人問我業余時間會做點兒什么?
我說:用WPF寫個游戲玩玩。
:寫的什么?
我:掃雷。
:……
我:想想都寫了快兩年了。
:orz
單純地講掃雷游戲都會覺得很簡單,都不好意思當個事兒,我一開始也是這樣覺得。寫着寫着才發現,事情其實沒有想象中的那么簡單。先給大家上個圖看看效果吧。
寫這個掃雷程序的主要目的,並不是練習WPF,也不是用WPF復刻Windows自帶的這個游戲。這兩件事兒其實都不至於做兩年。(當然不是持續的兩年,連續講的話,是三個月的晚上吧。)
寫這個掃雷程序,是想探究桌面應用程序開發的最佳實踐和模式,也能成為自己這幾年WPF工作的一個沉淀。而掃雷,只因為其功能相對簡單卻比較齊全而被我選為一個載體。
想通過這個程序達到的目標
- 設計方案成長歷程的記錄
回想起自己剛剛學習WPF第一個年頭,單是日歷控件就先后做了三遍。從第一遍的拿Button當日期,翻月都卡;到最后考慮使用者的便利度、主題的支持、模板的使用。真的是一個很明顯的成長的過程。這個掃雷程序,雖然是我工作的沉淀,但是我並不追求一開始的完美,反而我會希望他一開始並不完美,從而能展現出越變越好的一個過程。而這個過程,才是最寶貴的。如果有時間,也許我會寫個系統博客,講述自己開發這個游戲的心路歷程。
- 自行發現、創造、實踐設計模式的游樂場
雖然從大學開始就開始看設計模式這樣的書,但是我不得不承認,那個時候看了也是白看。沒有直面過嚴峻的問題的考驗,沒有自己摸索着真正使用模式,是不可能真正理解模式的。也許能認識這個模式,但是不知道這個模式應該在什么時候用,用在什么地方,用的合適不合適。而開始開發掃雷這個程序的時候,我排空了自己所有的模式、設計上的知識,基本靠感覺寫。希望可以再次體驗那種,發現問題、解決問題、抽象成模式的美妙感覺。所以在這個項目里,你看不到任何第三方的庫,第三方庫在幫我們解決問題同時,也帶走了我們自己學習、發現的機會。這個掃雷做到現在,已經先后兩年時間,都是在期間有了新的靈感,又重新開始了這個項目的開發。比如學習完Android開發之后,覺得里面的Intent和Broadcast都是不錯的設計,就引入了這個掃雷項目里。
- WPF程序開發技術特性的展示台
既然把這個掃雷當成是工作的沉淀,當然還要保留它應有的功能。在這個程序里,我盡可能多地引入一些WPF的特性或功能。比如自定義Effect什么的。希望自己在以后有機會再用到WPF的時候,在這個掃雷游戲的幫助下,能夠回憶起這些細節,並能把里面的代碼或是框架進行征用。
目前的現狀
這個游戲還沒有寫完,按這個進度,要完成我想象中的功能可能還要5年時間吧。目前已經實現的功能包括。
- 基本游戲邏輯和用戶交互。你可以理解為XP版的掃雷復刻。什么英雄榜啦,選項界面啦。 不過有改進。
- 主題支持。現在已經完成的主題是Ubuntu風格的掃雷,你可以通過一個XAML,完全自定義一個。
- 多語言支持。
- 模塊化。
- 插件框架。目前實現了一個簡單的插件系統,里面就一個配音插件。由於我目前並沒有去了解過別的插件系統是如何實現的,所以可能你會覺得這完全不是插件。而這就是我想要的,自己學習、發現的過程。
- 幫助文檔,還沒有寫完。
- 安裝包。使用NSIS腳本編寫,還很原始。
下面是插件對話框的截圖。
下面是改進的英雄榜。
在這個英雄榜上可以看到每次游戲的結果。
Roadmap
以后如果有時間,我是希望這個掃雷可以支持如下的幾個功能。
- AI SDK,我知道掃雷是個NP問題,所以這才比較有挑戰嘛。況且Codeplex上已經有人在做了。
- AI對戰模式。有了AI,就可以讓兩個AI一起解一個游戲。技術宅們的最愛。
- 錄制游戲視頻。掃雷可是正兒八經的國際賽事,從網上可以找到不少玩家錄制的游戲視頻,比如26秒中級什么的。有需求就要有功能。
- 聯網對戰。MSN就有掃雷游戲。
- ……
這個項目現在放在了codeplex上,大家有興趣可以玩玩看啊。不過編譯起來可能會比較麻煩,里面的自定義Effect可能會默認Build不過,除非你安裝了Shader Build Task。不過Effect里面有Readme,介紹了兩種Build的方法,一步步來應該沒有問題的。