電腦象棋循序漸進
 
象棋百科全書網 ([email protected]) 20084
 
  本連載將分六個階段來闡述一個電腦象棋程序從無到有、從弱智到聰明的過程,對應“象棋小巫師”示范程序的各個版本:
  0.1版:介紹制作象棋圖形界面的方法;
  0.2版:介紹中國象棋規則的實現;
  0.3版:介紹以Alpha-Beta搜索為基礎的一些計算機博弈基本智能算法;
  0.4版:介紹Zobrist校驗碼、重復局面判斷以及消除水平線效應的各種技術,進一步提高程序的智能;
  0.5版:介紹置換表技術和走法順序優化技巧,使一個象棋程序的技術架構趨于完整;
  0.6版:介紹克服搜索不穩定性的方法、開局庫、走子隨機性等錦上添花的技術。
  本連載花費的文字不多,關鍵的技術只是點到為止,而在示范程序里則有詳盡的注釋。關于一些技術細節,可參閱象棋百科全書網計算機博弈專欄關于國際象棋程序設計的系列譯文:
    http://www.ejnwjd.tw/computer.htm
 
() 從圖形界面做起
 
  與本文配套的示范程序是“象棋小巫師0.1版,程序清單是:
  (1) XQWL01.CPP——C++源程序;
  (2) XQWLIGHT.RC——資源描述文件;
  (3) RESOURCE.H——資源符號定義文件;
  (4) RES目錄——圖標、圖片、聲音等資源。
 
  為了使更多的程序設計師對這個話題感興趣,我們選用了最常用的程序開發工具——Microsoft Visual C++,它適合編寫Windows下的任何應用程序。為了讓程序盡可能簡潔,我們不使用任何第三方的控件和庫,取而代之的是大量的Win32 API函數。
  象棋程序是讓人跟電腦下棋的,所以圖形界面必不可少。我們選取了開源程序《象棋巫師》中的素材——一張520x576大小的棋盤圖片和幾張56x56大小的棋子圖片,拼湊在一起便可組成一副不太難看的棋具。
 
 
  僅僅把棋盤和棋子畫到窗口上是不夠的,圖形界面的另一個作用是讓用戶走棋。走棋的操作應該是非常簡單的——用鼠標點擊一枚棋子,該棋子就被選中(上面有個標記),用戶想讓這枚棋子走到哪個位置,就用鼠標點擊哪個位置。因此,操作過程可分為兩狀態:
  A. 讓用戶選子的狀態:只能點擊自己的子;
  B. 讓用戶落子的狀態:如果點擊自己的子,那么被選中的子改變了;如果點擊對方的子或空格處,那么可以走這步棋。
 
 
  這樣,鼠標點擊事件(WM_LBUTTONDOWN消息)的處理過程就可以寫成:
 
if (點擊自己的子) {
 把點擊的子選中; // 進入狀態B(已選中)
} else if (已經有子選中) {
 可以走這步棋(剛才選中位置->現在點擊的位置); // 進入狀態A(未選中)
}
 
  那么,如何把一枚棋子畫在棋盤上呢?實際上只要用BitBltTransparentBlt兩個函數就夠了,過程如下:
  (1) 把原來位置的棋子用棋盤圖案覆蓋掉(BitBlt函數)
  (2) 在該位置貼上棋子的圖案,由于棋子圖案是透明的,所以要用TransparentBlt函數;
  (3) 如果這枚棋子是選中的,那么再在該位置貼上選中的圖案(再用一次TransparentBlt函數)
 
  在象棋小巫師中,所有在棋盤上的棋子都放在數組 ucpcSquares[256] (長度256的好處將在后面介紹),數組指標代表格子的編號,匈牙利標記 uc 表示每個元素占用一個字節,pc 表示棋子標識。棋子標識的含義如下:
  A. 0表示空格(沒有棋子)
  B. 8~14依次表示紅方的帥、仕、相、馬、車、炮和兵;
  C. 16~22依次表示黑方的將、士、象、馬、車、炮和卒。
  這樣做的好處是判斷棋子的顏色非常簡單——(pc & 8) != 0 表示紅方的棋子,(pc & 16) != 0 表示黑方的棋子。
 
  在象棋小巫師中,選中的棋子用變量 sqSelected 表示,sq 代表格子的編號。判斷棋子 ucpcSquares[sq] 是否被選中,只需要判斷 sq sqSelected 是否相等即可。sqSelected == 0 表示沒有棋子被選中。
  在象棋小巫師中,一個走法只用一個數子表示,即 mv = sqSrc + sqDst * 256mv 代表走法,mv % 256 就是起始格子的編號,mv / 256 就是目標格子的編號。走完一步棋后,通常會把該走法賦值給變量 mvLast,并把 mvLast % 256 mvLast / 256 這兩個格子都做上標記,這樣就能清晰地看到用戶或電腦剛才走的一步棋了。
  • 上一篇
  • 下一篇 電腦象棋循序漸進():掌握象棋規則
  • 返 回 象棋百科全書——計算機博弈
  • www.ejnwjd.tw
    快乐双彩今晚开奖结果