(续上文)
尽管横刀立马是经典的也是广为人知的一个华容道开局,这并不意味着,它是唯一的。笔者网搜了一下,发现其经典开局居然有很多。下面开局转自知乎。
48开局如下图所示:

布局输入
一开始笔者想采用类似VS界面输入控件的方法,发现这样做比较麻烦,就采用了由用户自己输入类型的方法进行布局的录入。录入时,只需要输入对应的类型的,系统自动完成棋子的其余属性的设定。棋子类型前文曾经提起过,为了方便描述再列举如下:
/// _type = 5 , the blank block on the board, size is (1,1) (width, height)
/// = 1, the soldier block , size is (1,1)
/// = 2, the vertical blcok, size is (2,1) 张飞,赵云,马超,黄忠
/// = 3, the horizaontal blcok , size is (1,2) 关羽
/// = 4 , the biggest block , size is (2,2) 曹操
/// = 0, null, this area is out of the board
为了保持一致性,布局时的底层输入控件也采用了一个5*4的控件数组,这样在映射实际的布局时,转换比较方便。
控件动态生成,并同时增加了按键的事件处理代码。设计器的界面如下:

区域1 中进行基本布局的录入,区域2 显示效果,并且可以录入每个棋子的名称。录入时,只需要录入棋子左上角的类型即可,其余部分,程序自动完成。输入部分棋子时的截图如下

布局保存
保存采用了现成的 三方库 Newtonsoft,它将对象的实例转化为Json格式的文件进行保存。我们仅需把一个对象的定义和实例交给它处理就可以了。
代码实现
包括两部分,文字版和头像版。头像版中,每个棋子将对应一个头像文件。
控件生成
为了便于后续的操作,控件是生成在容器里。为了支持各种容器,使用了模板。
private void InitDesignControls<T1,T2>(T2 containerCtrl, string preFix) where T1 : Control, new() where T2 :

本文介绍了如何通过用户输入控制华容道棋局布局的设计,使用Json存储布局,以及实现布局之间的转换检测。作者展示了从布局录入、控件生成、头像功能到布局变换的研究过程,最终目标是理解操作系统工作原理。
最低0.47元/天 解锁文章
503

被折叠的 条评论
为什么被折叠?



