【PS:插个广告】 下面的链接是本系列帖子在CSDN学院的视频课程,有兴趣的同学可以移步观看:
http://edu.csdn.net/course/detail/5351
要让你从零实现中国象棋游戏,你会有哪些实现思路呢?
有人会说,网上中国象棋程序一抓一大把,干嘛还要自己从零实现呢?好吧,你要这样说,我表示无语;还有人会说,网上有很多现成的游戏引擎,拿过来直接用就行了,只能说你很懂得拿来主义。我们的这个“麻雀系列”项目的目的,就是希望朋友们能够从零实现一些小而精的项目,锻炼自己的动手能力和设计思想,通过提高自己的抽象能力,来锤炼自身的总体架构能力。
好了,回到本项目中来。用什么方法来把棋盘、棋子绘制到电脑屏幕上呢?有人会提到DirectX、WPF、Unity3D等等高大上的技术,还是那句话,我们会忽略掉任何会是我们分心走神的枝节,在本项目中,我们还是采用最最简单、最古老的GDI+绘图技术。有人肯定会表示不屑了,不可否认,DirectX、WPF、Unity3D等确实可以做到更炫的效果、更高的开发及运行效率,但别忘了我们的项目是“麻雀系列”,我们只关注于我们关心的部分。
既然我们采用的面向对象的程序设计思想,我们就用对象的抽象思维来构建我们的程序世界。大家想想,实现中国象棋,大致需要哪些对象来相互协作呢?中国象棋由一张棋盘、32个棋子组成,很简单吧,我们只需要一个棋盘类,一个棋子类。怎么?难以置信?一个程序只有两个类?对的,你没有看错,我们这个项目在业务逻辑上只有这两个类。也许有人在说,你在忽悠我们吧?一个采用面向对象思想开发的项目,只有两个类,开玩笑呢吧!大家别急,待我慢慢道来。
先让大家看一下本项目的基本类图(图3),大家可以看到,程序整体上只有棋盘类(ChessBoard)和棋子类(ChessPiece)两个类,只不过棋子类又有7个子类,从图3中的英文名称可以看出,这7个子类其实就是中国象棋中的7类棋子,即:车、马、象、士、帅、炮、卒。图3的下部还有几个零散的小类,我们在这里先行略过。
本项目基本构架的大致思路是这样的:
棋盘类负责绘制棋盘、初始化棋子等基本操作,并提供交换红黑双方位置、悔棋、维护玩家走棋顺序、索引坐标和像素坐标的转换、根据坐标查询棋子、检测将军及明将、分析下步可走招法、保存历史走棋记录等功能。
棋子类负责绘制自身到棋盘、移动到目标位置、吃子、删除自身、悔棋等职责,同时提供绘制自己下一步可走位置、判断鼠标是否在自己范围内、维护自己的历史移动轨迹、保存自己吃掉的对方棋子的集合等功能。
程序界面采用传统的WinForm,他的职责很简单,就是负责GDI+绘图,以及鼠标、键盘事件的处理。在这里又会有人表示对WinForm不服,说WinForm十分古老、传统、死板,不如WPF等其他更为先进的界面框架。其实,只要我们想,我们可以轻易的把界面框架改为WPF或其他。还是那句话,我们不会被这些枝节所困扰,我们需要的是专注。
经过上面的分析梳理,整个程序的结构是不是很清晰了?好的架构是好的程序的一大部分,如果你的程序架构没有设计好,在以后的具体编码过程中便会遇到各种逻辑陷阱和代码Bug的纠缠,软件将变得难以维护、难以扩展,一旦需求有变动,那你更是会受到非人的折磨。好了,程序的大概骨架已经搭建完毕,接下来我们就可以着手具体实现了。