之前我們已經講了實現乙個中國象棋軟體的所有要素,本篇我們只是粗略地建乙個工程再新增一點檔案使得我們能看到程式的運**況如何。
在介面完成之前,我先建了乙個win32控制台專案(學生朋友們對這個最熟悉也最容易理解)。根據前面所講的我們已經有了cchessdef.h cchessmove.h cchesssearch.h historyheuristic.h sortmove.h cchessevaluate.h六個檔案。將這六個檔案加入工程後,再向工程裡加入sccchess.h和sccchess.cpp兩個檔案。定義如下:
sccchess.cpp
// sccchess.cppsccchess.h#include "sccchess.h"
int main()
// end of sccchess.cpp
// sccchess.h兩個檔案其實都很簡單,就是使用者輸入下棋的起點座標和終點座標,電腦再返回乙個起點座標和終點座標,如此反覆來進行對弈。關於座標的定義依然是按下圖所示(同棋局表示中所講的一樣)。#include < stdio.h>
#include < stdlib.h>
#include < time.h>
#include < iostream>
using namespace std;
#include "cchessmove.h"
#include "cchesssearch.h"
#define ok 1
#define error 0
/// data define ///
cchessmove cmmove;
int nnumofstep;
// type define
typedef int status;
// function prototype /
// 初始化遊戲(進行一些基本引數的設定)
status initgame( int fcomputerside = black, int nusersetmaxsearchdepth = 4 );
// 開始遊戲
status startgame();
// 使用開局庫
inline cchessmove uselibrary();
/ programmer-defined function /
status initgame( int fcomputerside, int nusersetmaxsearchdepth )
nmaxsearchdepth = nusersetmaxsearchdepth ;
nnumofstep =0;
return ok;
}status startgame()
else
}else
printf( "%d%d %d%dn", cmmove.ptfrom.x, cmmove.ptfrom.y,
cmmove.ptto.x, cmmove.ptto.y );
} return ok;
}// 使用開局庫
inline cchessmove uselibrary()
else //右炮
} else if( cchessboard[2][2] == red_p )//炮
else if( cchessboard[6][2] == red_p )//炮
else if( cchessboard[3][2] == red_p )//炮
else
}} else if( cchessboard[5][2] == red_p )//炮
else
}} else if( cchessboard[4][2] == red_x )//飛象
}else if( cchessboard[2][2] == red_m )//跳馬
else if( cchessboard[6][2] == red_m )//跳馬
else if( cchessboard[2][4] == red_b )//走卒
}else if( cchessboard[6][4] == red_b )//走卒
}return cmmove;
}// end of sccchess.h
例如,第一步你要走一步當頭炮,你就可以輸入1242或是7242。之後電腦會返回它的走法。
如果你覺得電腦下棋太慢你可以通過修改
// 初始化遊戲(進行一些基本引數的設定)中nusersetmaxsearchdepth = 4處的值來設定搜尋深度。值越小電腦下棋速度越快(當然從理論上講水平也越差)。status initgame( int fcomputerside = black, int nusersetmaxsearchdepth = 4 );
這兩個檔案寫得都很簡單,既沒有結束判斷也沒有使用者下棋的合法性檢查。目的只是大概地測試一下電腦的下棋情況。由於電腦第一步棋下得不好,所以我給它加了乙個簡陋的「開局庫」而使得**有點長。這一部分的程式沒有什麼難點,就不再累述了。各位網友也可以自己另寫介面來測試程式。說到這兒順便提一句,我們科技小組所寫的介面也已經初步完成了。過一段時間我把介面的主體**也貼上來,讓大家可以更方便地測試程式: )
至此,本站的「中國象棋軟體-引擎實現」系列就全部結束了。簡單地總結一下。
首先,這個程式是我目前所寫的程式中**最長、難度也最大的乙個。通過不斷查詢資料學習、寫程式、修改程式,直至最終順利完成程式。我體會到了無比的喜悅及成就感(這種喜悅與成就感完全沖淡了寫程式的辛苦)。我很高興自己從最初對象棋軟體的一無所知到了後來能親手實現了乙個象棋軟體。
再者,寫本程式我最大的乙個遺憾就是沒有用上物件導向的思想,雖然在學校裡學過了c++,但很遺憾沒能將其用之於實踐。通篇程式沒有乙個類,大量的全域性變數實在讓我也有點不太好意思把程式貼到網上來——這也反映了我對物件導向的認識還有很大的欠缺,今後還需努力學習……
最後,我把程式貼到網上的目的是想讓同我一樣熱愛程式設計但暫為菜鳥的學生朋友有乙個了解象棋軟體的具體實現的機會。由於本人著實很菜,程式中難免有多多少少的不佳之處(比如剛剛所說的沒用物件導向等等)。對此,一來希望不要誤導、影響各位學弟學妹,二來還請大蝦們不要見笑、多多指教。
好了,大概就講這麼多了。對於程式中有什麼欠妥的地方還望各位朋友多多賜教。同時再次感謝廣大網友的支援,謝謝!
中國象棋軟體 引擎實現(二)棋局表示
對於棋盤的表示當前比較先進的思想是 位棋盤 位棋盤 用於西洋棋非常便捷,因為西洋棋的棋盤正好有64個格仔,可以將乙個棋盤的資訊用乙個64位的變數來表示。其基本思想就是用位上的值是1或0來表示棋子在棋盤相應位置上的存在與否,這樣做的好處是可以通過位操作運算來加快局面評估和著法生成的速度。當用於中國象棋...
中國象棋主流象棋引擎分析
象棋旋風與佳佳象棋,從出現以來就廣泛吸引住了人們的眼球。在那個奇兵與大聖逐漸沒落的年代,旋風與佳佳的接連出現為象棋軟體的發展注入了新的活力。兩個軟體都採取了新的演算法,使得棋力相比過去的軟體有了較大幅度的增長,一時間風靡網路。這兩個軟體都開發了很多個版本,直到現在也沒有停息。但新版本採用了非常先進的...
中國象棋軟體 引擎實現(四)搜尋演算法
首先對於棋類遊戲存在一棵 博弈樹 樹的每乙個結點代表棋盤上的乙個局面,對每乙個局面 結點 根據不同的走法又產生不同的局面 生出新的結點 如此不斷直到再無可選擇的走法 棋局結束 現在假定甲乙兩方下棋,甲勝的局面是乙個極大值 乙個正數 那麼乙勝的局面則是乙個極小值 極大值的負值 和棋的局面則是零值或是接...