對於棋盤的表示當前比較先進的思想是「位棋盤」。「位棋盤」用於國際象棋很是便捷,由於國際象棋的棋盤正好有64個格子,能夠將一個棋盤的信息用一個64位的變量來表示。其基本思想就是用位上的值是1或0來表示棋子在棋盤相應位置上的存在與否,這樣作的好處是能夠經過位操做運算來加快局面評估和着法生成的速度。當用於中國象棋時須要進行拼湊以表示中國象棋棋盤的90個格子……算法

因爲考慮到本人目前水平精力均着實有限。當前應以實現本程序爲首要目標,而不是致力於高質量算法研究,因此就偷懶採用了傳統的較爲簡單的「棋盤數組」——即用一個9*10的數組來存儲棋盤上的信息,數組的每一個元素存儲棋盤上相應位置是何種棋子。這種表示方法簡單易行。按此方法棋盤的初始情形以下所示:數組

 

BYTE CChessBoard[9][10] = {
  R,  0,  0,  P,  0,  0,  p,  0,  0,  r,
  H,  0,  C,  0,  0,  0,  0,  c,  0,  h,
  E,  0,  0,  P,  0,  0,  p,  0,  0,  e,
  A,  0,  0,  0,  0,  0,  0,  0,  0,  a,
  K,  0,  0,  P,  0,  0,  p,  0,  0,  k,
  A,  0,  0,  0,  0,  0,  0,  0,  0,  a,
  E,  0,  0,  P,  0,  0,  p,  0,  0,  e,
  H,  0,  C,  0,  0,  0,  0,  c,  0,  h,
  R,  0,  0,  P,  0,  0,  p,  0,  0,  r
};

其中」0」表示無棋子,」R」表示紅車,」r」表示黑車等等(詳見後面的代碼),也就是咱們給棋盤進行了以下圖所示的編號,並約定紅方棋子總在棋盤的下方。數據結構

qipan.gif

下面是CChessDef.h的代碼。該頭文件定義了象棋相關的基本數據結構,包括棋子棋盤的表示,行棋的基本結構類型等。我同時使用了兩種方式來爲一個棋子命名,這是爲了在有些狀況下見名知意而在其它狀況下能簡單快捷地表示。ide

// CChessDef.h       

////////////////////// 基本類型定義 //////////////////////////////////////////
typedef char BYTE;       

typedef struct _point{
  BYTE x;
  BYTE y;
} POINT ;            // 棋盤上的點的結構       

typedef struct _cchessmove{
  POINT ptFrom;     // 起點
  POINT ptTo;         // 目標點
  int nScore;         // 該走法的歷史得分
} CCHESSMOVE ;        // 走法結構       

////////////////////// 下棋方定義 ////////////////////////////////////////////
const int HUMAN        = 1;    // 人
const int COMPUTER    = 0;    // 電腦       

const int RED    = 1;    // 紅方
const int BLACK    = 0;    // 黑方       

////////////////////// 棋子定義 //////////////////////////////////////////////
//紅方棋子定義        紅
const BYTE K =    1;    // 帥
const BYTE A =    2;    // 仕
const BYTE E =    3;    // 相
const BYTE H =    4;    // 馬
const BYTE R =    5;    // 車
const BYTE C =    6;    // 炮
const BYTE P =    7;    // 兵       

//黑方棋子定義        黑
const BYTE k =    8;    // 將
const BYTE a =    9;    // 士
const BYTE e =    10;    // 象
const BYTE h =    11;    // 馬
const BYTE r =    12;    // 車
const BYTE c =    13;    // 炮
const BYTE p =    14;    // 卒       

//紅方棋子定義
#define RED_K    K
#define RED_S    A
#define RED_X    E
#define RED_M    H
#define RED_J    R
#define RED_P    C
#define RED_B    P       

//黑方棋子定義
#define BLACK_K    k
#define BLACK_S    a
#define BLACK_X    e
#define BLACK_M    h
#define BLACK_J    r
#define BLACK_P    c
#define BLACK_B    p       

//判斷該棋子爲哪一方
const int SideOfMan[15] ={0, RED, RED, RED, RED, RED, RED, RED,
  BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, };
//此數組將做爲一個「函數」來使用。相似 int SideOfMan( BYTE );       

/////////////////////// 棋局定義//////////////////////////////////////////////
// 棋盤上棋子分佈
BYTE CChessBoard[9][10] = {
  R,  0,  0,  P,  0,  0,  p,  0,  0,  r,
  H,  0,  C,  0,  0,  0,  0,  c,  0,  h,
  E,  0,  0,  P,  0,  0,  p,  0,  0,  e,
  A,  0,  0,  0,  0,  0,  0,  0,  0,  a,
  K,  0,  0,  P,  0,  0,  p,  0,  0,  k,
  A,  0,  0,  0,  0,  0,  0,  0,  0,  a,
  E,  0,  0,  P,  0,  0,  p,  0,  0,  e,
  H,  0,  C,  0,  0,  0,  0,  c,  0,  h,
  R,  0,  0,  P,  0,  0,  p,  0,  0,  r
};       

// end of CChessDef.h