又一个python围棋工具库
既然已经有了pytools和其他成熟的python实现的围棋工具类库,为什么还要写?看起来是犯了重复发明轮子(reinventing the wheel)的大忌,但其实这里面存在软件工程(你看,又要婊软件工程这个概念了,有兴趣看此方面文章的请参考《软件工艺》一书)理解中的一个迷思:重新实现一个功能库就是重复发明轮子。在很多情况下,这两者的概念并不等同。另外,“重复发明轮子”在我看来本身就是好习惯,试想如果没有持续发明新的轮子,原始的木造车轮如何适应各种路面,我们也用不上成本持续降低但各方面性能都在提高的车轮。扩展开来说,正是由于不断有新车轮出现,人类社会才能一直进步不是吗。
“重复发明方形轮子”才是问题所在,杜绝无用的创造,不管它有多华丽。pongba老师的《锤子和钉子》一文中提到过埋头苦干,陶醉在自我世界中的框架设计者,看完后觉得浑身中枪。这便是方轮子的例子,“JOJO,我不重复发明方轮子了啊!”。
大牛vczh曾经提到过他心目中学习开发知识的一个最佳流程,深以为然:
- 明确需求后,不管最好做法是什么先用自己的想法实现一个能用的
- 学习相关理论,反思自己想法中的问题
- 参考别人成熟、高效的实现进行修改
- 重写/重构自己的版本
等等,这篇blog似乎跑题严重,继续说这个工具库,地址在https://github.com/arakuma/py_golibs。考虑中分为三部分:
- 棋谱文件(sgf)解析
- 围棋相关的模型、规则定义
- 网络对弈支持(gtp)
这个列表也是整个库自底向上的层次。目前进度为sgf部分搞定,支持所有SGF FF[4]的定义。围棋实体部分完成了基本模型定义、对于sgf信息到上层事件的转换(将所有sgf node转换成Action类)、写了一个基本的演示用棋盘类;待完成的则是规则定义和gtp实现。
另外事件转换部分还有些问题,我之前认为以“添加棋子(AB/AW)”、“走一手棋(B/W)”为基本单元比较合适,但写着写着发现很多重要属性实际上不在这几个属性内,而是作为单独的属性出现,例如盘面价值(V)、图示(FG)等等,在不想将Action直接返回给上层使用的情况下,这些信息应该怎么通知还得想想。
对了,演示用的棋盘,本来计划用extended ascii的字符,期待中是这样:
a b c d e f g h i a┌─┬─┬─┬─┬─┬─┬─┬─┐a b├─┼─┼─┼─┼─┼─┼─┼─┤b c├─┼─•─┼─┼─┼─☻─┼─┤c d├─┼─☺─┼─┼─☻─☺─☻─┤d e├─┼─┼─┼─☻─┼─☺─☺─┤e f├─┼─☻─┼─┼─┼─┼─┼─┤f g├─┼─•─┼─┼─☺─•─┼─┤g h├─┼─┼─┼─┼─┼─┼─┼─┤h i└─┴─┴─┴─┴─┴─┴─┴─┘i a b c d e f g h i
但这些字符在python中输出后基本都变成乱码了,不得已暂时改为下面这样。不过修改过程中顺手把之前懒得做的棋盘margin/padding/zooming都实现了。
SGF recorded with SGFC 1.16 by Arno Hollosi Event 21st Meijin @ Nihon Ki-in on 1996-10-18,19 Black: Takemiya Masaki (9 dan), White Cho Chikun (9 dan) a b c d e f g h i j k l m n o p q r s a +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ a b +-+-+-+-+-+-+-+-+-+-+-+-+-+-B-W-W-+-+ b c +-+-+-+-+-+-+-+-+-+-+-+-+-W-+-B-W-+-+ c d +-+-+-W-+-+-+-+-+-*-+-+-+-+-+-B-W-+-+ d e +-+-+-+-+-+-+-+-+-+-+-+-+-+-B-+-B-W-+ e f +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-B-W-+ f g +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-B-+-+ g h +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ h i +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ i j +-+-+-*-+-+-+-+-+-*-+-+-+-+-+-B-+-+-+ j k +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ k l +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ l m +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ m n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ n o +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ o p +-+-+-W-+-+-+-+-+-*-+-+-+-+-+-B-+-+-+ p q +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ q r +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ r s +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ s a b c d e f g h i j k l m n o p q r s