1981年,我参加工作的第3年,在一所电信科学技术研究所工作。由于从1980年就开始接触了小型计算机和通讯方面的知识以及从小下棋的缘故,就琢磨些外国人下中国象棋如何识别棋子和书写棋谱的问题,还有异地卫星传输棋谱数据压缩等问题,故有了“中国象棋数字编码方案”的构思。
中国象棋棋盘有10行(从下向上数0~9)9列(双方各从右向左数1~9,这是古人从右向左书写的习惯)。
中国象棋棋子双方各有16个,7个兵种:车(車)马(馬)相(象)士(仕)帅(将)兵(卒)炮(砲)。
中国象棋行棋规则:进、退、平。
中国象棋棋子重叠:有前子或后子之别。
现在我们来设计这个编码:
1.以棋子名按顺序编码(不佳)
1车(車)2马(馬)3相(象)4士(仕)5帅(将)6兵(卒)7炮(砲)
那么数字就剩下890,其中9的“小尖尖”向下非常有方向感,故可以编码为后(退),0什么都不是没有方向感,有原地转圈的感觉,故可以编码为平。最后的8没有方向感,有点翻跟头的感觉,难道可以编码为前(进)吗?显示不如9的“小尖尖”有方向感好。
故此方案不是最佳编码。
2.以棋子位置行数编码(最佳)
1车(車)2马(馬)3相(象)4士(仕)5帅(将)7兵(卒)8炮(砲)
那么数字就剩下690,雷同方案1中的设计。
其中:
6的“小尖尖”向上,方向感十足,故可以编码为前(进)
9的“小尖尖”向下,方向感十足,故可以编码为后(退)
0什么都不是,故可以编码为平。
故此方案是最佳编码,非常完美,没有重码和冗余。
例如棋谱:
1.炮二平五,马8进7。表示为:1.8205,8867
2.马二进三,車9平8。表示为:2.8263,1908
…前车退五,后炮平9。表示为:…6195,9809
在1983年,我在一台黑白屏幕的计算机上,用BASIC编程语言编写了两人对局(走棋)的中国象棋程序,内部编码就是用的这个“中国象棋数字编码方案”,这是我人生走入编程世界的第一步,虽然我1981年就可以编写TP801单板机的机器语言,但这个象棋程序却是我编写的第一个完整的应用程序,它直接关系到我后来思维发展的进程。
当时没有鼠标而且是黑白色,走棋时两人各用大小键盘互不干扰。刚走过的棋反显(黑白交替闪烁),我们上班时没有象棋盘就用它下棋,非常爽。
我是在44岁即2003年开始上网的,当时在网上传播技术知识,并且撰写了《从“中国象棋数字编码方案”谈思维》的网文。数年后在网上看到有严重的剽窃者,几乎只改了几个字就称“王聪设计的中国象棋数字编码”并被百度收录。
在此特别谴责技术上的剽窃者!!!
本文回忆了菜农当时设计“中国象棋数字编码方案”的全过程,让我怀念37年前年轻有活力的思维。
下面几张图是我原创的手稿和我棋力的证明(个人赛进前8名后因故放弃比赛)