惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
量子位
宝玉的分享
宝玉的分享
爱范儿
爱范儿
云风的 BLOG
云风的 BLOG
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recent Announcements
Recent Announcements
Apple Machine Learning Research
Apple Machine Learning Research
N
News and Events Feed by Topic
TaoSecurity Blog
TaoSecurity Blog
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
Simon Willison's Weblog
Simon Willison's Weblog
Google DeepMind News
Google DeepMind News
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
aimingoo的专栏
aimingoo的专栏
Cloudbric
Cloudbric
Blog — PlanetScale
Blog — PlanetScale
Latest news
Latest news
S
Security @ Cisco Blogs
Last Week in AI
Last Week in AI
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Vercel News
Vercel News
W
WeLiveSecurity
M
MIT News - Artificial intelligence
P
Proofpoint News Feed
P
Proofpoint News Feed
P
Palo Alto Networks Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
The Blog of Author Tim Ferriss
腾讯CDC
大猫的无限游戏
大猫的无限游戏
Martin Fowler
Martin Fowler
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Stack Overflow Blog
Stack Overflow Blog
IT之家
IT之家
有赞技术团队
有赞技术团队
Microsoft Security Blog
Microsoft Security Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
美团技术团队
博客园 - 【当耐特】
D
DataBreaches.Net
I
InfoQ
G
GRAHAM CLULEY
S
SegmentFault 最新的问题
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
B
Blog

博客园 - 南柯之石

用户中心 - 博客园 自引用泛型模式分析 一定间隔时间下重复执行一个函数的几个方法 为什么.NET Framework就没有个专门的P/Invoke Library? Which would you perfer? "easy and fast and works well" or "hard and time consuming and error prone" 在ListView的GroupItem头中显示每列的Summary 小例子背后的大道理——用户需求+设计原则+正确应用 =设计方案 GET和POST有什么区别?及为什么网上的多数答案都是错的。 小例子背后的大道理——Adapter模式详解 小例子背后的大道理——从DIP中“倒置”的含义说接口的正确使用 XmlSerializer, DataContractSerializer 和 BinaryFormatter区别与用法分析 技术误用带来的技术偏见及所谓的“经验” 从一个UI交互设计师的讲座说开去 NoSQL和MemeryCache的出现意味着传统数据库使用方式的变革吗? 不使用反射进行C#属性的运行时动态访问 一次模块划分的争论及其结局 电子书籍质量保证事件分析 在SQL Server中调用.NET程序集 T-SQL 操作XML示例
使用WPF开发的扫雷游戏,双系统主题复刻版
南柯之石 · 2012-03-18 · via 博客园 - 南柯之石

平时有人问我业余时间会做点儿什么?

我说:用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的方法,一步步来应该没有问题的。