平时有人问我业余时间会做点儿什么?
我说:用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的方法,一步步来应该没有问题的。