网络五子棋的架构设计(三)--业务逻辑

最后,就是实际的业务逻辑,下棋,仔细考虑下棋的关键步骤:

1、  作为本地,需要捕获鼠标的点击事件,然后在对应点描绘棋子,然后发送给对方自己下了哪里,最后交换下棋方

2、  作为网络端,需要捕获对方告诉自己的下棋信息,然后再对应点描绘棋子。

3、  下棋后判断胜负

4、  重新开始

 

主要动作有:鼠标事件捕获,创建棋子,描绘棋子,发送指令,交换下棋方,判断胜负,重新开始

 

隶属于窗体的应该有鼠标事件捕获、创建棋子、负责创建描绘棋子的Graphics、交换下棋方、重新开始、发送指令

而判断胜负、判断落子规则、描绘棋子作为业务逻辑层。

省略用例图……

主要首先考虑的是两点:

1、  棋子采用什么数据结构保存,网络棋牌游戏典型的做法是创建1Piece棋子,然后仅保存二维坐标点,需要的时候重绘下就可以了,而本例中,棋子对象完全保存在客户端,资源消耗(无视)小,因此决定采用Dictionary的方式来保存棋子

2、  五子棋的扩展,为了将来也许某天心血来潮做网络象棋、围棋、跳棋之类的,决定统一一个PieceManager作为对界面的接口,在PieceManager内封装抽象的BasePieceProvider算法,五子棋的算法规则则继承出一个FivePieceProvider

 

基于以上考虑,业务逻辑部分的类作如下设计:

 

 

 

 

 

 

PieceManager类中的主要成员是一个BasePieceProvider作为实现算法的主要抽象,还提供了GetLogicPositionGetPhysicalPosition两个方法,负责在第二行第三列(1,2)点和其实际位置(100,60)之间相互转换,描绘棋子的任务也交给了Paint方法。

BasePieceProvider作为所有棋类游戏的统一算法抽象类,要求实现的有:IsOk(Piece piece)判断落子是否合法、IsVictory(Piece piece)判断本次落子是否导致胜利、ALLPiece所有棋子保存的对象、PieceRange棋子可落的具体范围、PieceSize棋子大小、XStepX方向上棋子之间的间隔、YStepY方向上棋子之间的间隔。

通过继承BasePieceProvider类,我们可以派生出五子棋算法规则类、象棋算法规则类等等。

对于扩展上可能还会有两个不足:

1、  棋子类Piece如果是象棋或是国际象棋还会多一个描述棋子的值(马或是相)的属性,不过暂时不管了,学习Control类的Tag,先弄个virtualobject类型的Data放着,进可重写,退可装箱,偷个懒。

2、 PieceType如果遇到四国军旗,两个枚举就不够用了,不过如果真的考虑四国军旗,网络通信层的服务端à客户端机制也不够用了,需要服务端(1à客户端(N)或者最好使用UDP,那要改的就不止一点了,而是整个网络通信层,因此也先偷懒。

 

 

总结一下:

这个例子为了有较清晰的架构和扩展能力,分成了界面、网络通信、业务逻辑三个层次,界面层负责调用网络通信和业务逻辑层,捕获鼠标事件;网络通信负责服务端和客户端的通信;业务逻辑层负责棋子业务逻辑创建和判断,提供对外统一的接口。

用到的知识点有Socket通信、使用接口编程、策略模式、事件驱动、继承、多台

重点还是在业务逻辑,PieceManager和BasePieceProvider单向依赖关系,策略模式的使用,个人写完觉得还是很爽的。

 

网络五子棋完整源码下载

你可能感兴趣的:(.net入门)