C/C++中国象棋程序入门与提高
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.1 简单的表示方法

再简单的表示也必须包含局面的三要素:棋盘、棋子、走棋方。

棋盘表示

中国象棋棋盘是一个10行9列的共90个交叉点的网状结构,要表示这样一个结构,最简单的方法就是矩阵,在程序语言里面就是一个二维数组chess[10][9],如图3-1所示。

图3-1 棋盘二维数组示意图

棋子表示

棋子种类为7种:将(帅)、仕(士)、象(相)、马、车、炮、卒(兵),可以用1,2,3,4,5,6,7共七个整数来分别表示这7种不同棋子。

一个开局的局面就可以用如下数组来表示

          int chess[10][9]= {
                5, 4, 3, 2, 1, 2, 3, 4, 5,
                0, 0, 0, 0, 0, 0, 0, 0, 0,
                0, 6, 0, 0, 0, 0, 0, 6, 0,
                7, 0, 7, 0, 7, 0, 7, 0, 7,
                0, 0, 0, 0, 0, 0, 0, 0, 0,
                0, 0, 0, 0, 0, 0, 0, 0, 0,
                7, 0, 7, 0, 7, 0, 7, 0, 7,
                0, 6, 0, 0, 0, 0, 0, 6, 0,
                0, 0, 0, 0, 0, 0, 0, 0, 0,
                5, 4, 3, 2, 1, 2, 3, 4, 5,};

0表示没有棋子。很明显红方棋子在数组的下半部,黑方棋子在数组的上半部。一旦比赛开始,双方棋子就会越过河界,这时就根本无法分清双方棋子:如7究竟代表红兵还是黑卒。

这时候我们可以用一个辅助数组来表示棋子的颜色,即棋子究竟是红方棋子还是黑方棋子。

          int color[10][9]= {
              1, 1, 1, 1, 1, 1, 1, 1, 1,
              7, 7, 7, 7, 7, 7, 7, 7, 7,
              7, 1, 7, 7, 7, 7, 7, 1, 7,
              1, 7, 1, 7, 1, 7, 1, 7, 1,
              7, 7, 7, 7, 7, 7, 7, 7, 7,
              7, 7, 7, 7, 7, 7, 7, 7, 7,
              0, 7, 0, 7, 0, 7, 0, 7, 0,
              7, 0, 7, 7, 7, 7, 7, 0, 7,
              7, 7, 7, 7, 7, 7, 7, 7, 7,
              0, 0, 0, 0, 0, 0, 0, 0, 0,};

红方为0,黑方为1,没有棋子的地方为7。

如chess[3][0]=7表示该位置有一个兵,然后color[3][0]=1,表示兵是黑卒。

当红方走棋马二进三时,要对chess数组和color数组分别修改:

          chess[7][6] = 4
          chess[9][7] = 0
          color[7][6] = 0
          color[9][7] = 7

前面讲过,局面表示要修改方便,用两个数组来表示,是比较复杂的。如果我们把黑方的棋子用11,12,13,14,15,16,17来表示,则一个chess数组就可以了。

          int chess[10][9]= {
              5, 4, 3, 2, 1, 2, 3, 4, 5,
              0, 0, 0, 0, 0, 0, 0, 0, 0,
              0, 6, 0, 0, 0, 0, 0, 6, 0,
              7, 0, 7, 0, 7, 0, 7, 0, 7,
              0, 0, 0, 0, 0, 0, 0, 0, 0,
              0, 0, 0, 0, 0, 0, 0, 0, 0,
              17, 0, 17, 0, 17, 0, 17, 0, 17,
              0, 16, 0, 0, 0, 0, 0, 16, 0,
              0, 0, 0, 0, 0, 0, 0, 0, 0,
              15, 14, 13, 12, 11, 12,13, 14, 15,};

1,2,3,4,5,6,7分别表示黑方将,士,象,马,车,炮,卒

11,12,13,14,15,16,17分别表示红方帅,仕,相,马,车,炮,兵

双方棋子都用唯一的整数表示,不会产生歧意。

走棋方表示

走棋方可以用一个全局变量side来表示,红方走棋side=0,黑方走棋side=1。变换走棋方可以用side = 1-side来实现。