又一个python围棋工具库

既然已经有了pytools和其他成熟的python实现的围棋工具类库,为什么还要写?看起来是犯了重复发明轮子(reinventing the wheel)的大忌,但其实这里面存在软件工程(你看,又要婊软件工程这个概念了,有兴趣看此方面文章的请参考《软件工艺》一书)理解中的一个迷思:重新实现一个功能库就是重复发明轮子。在很多情况下,这两者的概念并不等同。另外,“重复发明轮子”在我看来本身就是好习惯,试想如果没有持续发明新的轮子,原始的木造车轮如何适应各种路面,我们也用不上成本持续降低但各方面性能都在提高的车轮。扩展开来说,正是由于不断有新车轮出现,人类社会才能一直进步不是吗。

“重复发明方形轮子”才是问题所在,杜绝无用的创造,不管它有多华丽。pongba老师的《锤子和钉子》一文中提到过埋头苦干,陶醉在自我世界中的框架设计者,看完后觉得浑身中枪。这便是方轮子的例子,“JOJO,我不重复发明方轮子了啊!”

大牛vczh曾经提到过他心目中学习开发知识的一个最佳流程,深以为然:

  1. 明确需求后,不管最好做法是什么先用自己的想法实现一个能用的
  2. 学习相关理论,反思自己想法中的问题
  3. 参考别人成熟、高效的实现进行修改
  4. 重写/重构自己的版本

等等,这篇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