• 使用WPF开发的扫雷游戏,双系统主题复刻版


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

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

  • 相关阅读:
    单片机学习01__跑起你的流水灯
    python2与python3共存
    rpi-kali 搭建网络靶场
    P3388 【模板】割点(割顶)
    P3387 【模板】缩点
    P1069 细胞分裂
    The Unique MST[不严格的次小生成树]
    P3369 【模板】普通平衡树
    Netty的线程模型可不是Reactor这么简单
    SpringBoot+Mybatis+MySQL实现读写分离
  • 原文地址:https://www.cnblogs.com/nankezhishi/p/clearmine.html
Copyright © 2020-2023  润新知