沈旭 梁文
摘 要:中國(guó)象棋歷史悠久,集思想謀略、軍事競(jìng)技于一體,是一種古老而傳統(tǒng)的文化。中國(guó)象棋手機(jī)APP是基于Android平臺(tái)開(kāi)發(fā)的一款應(yīng)用軟件,具備兼容性和人機(jī)對(duì)弈的特點(diǎn)。 其APP設(shè)計(jì)主要由3部分組成:流程分析、功能設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì),對(duì)游戲界面設(shè)置、棋盤(pán)繪制、游戲規(guī)則與棋子走法設(shè)置,以及所有布局算法進(jìn)行設(shè)計(jì)開(kāi)發(fā),實(shí)現(xiàn)了APP的預(yù)定功能。實(shí)際運(yùn)行結(jié)果表明,中國(guó)象棋手機(jī)APP界面美觀、運(yùn)行穩(wěn)定,富有對(duì)抗性且具有傳統(tǒng)文化色彩,有助于游戲者的智力開(kāi)發(fā)與思維能力鍛煉。
關(guān)鍵詞:Android;移動(dòng)設(shè)備;中國(guó)象棋;手機(jī)游戲
DOI:10.11907/rjdk.172668
中圖分類號(hào):TP319
文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-7800(2018)004-0104-03
Abstract:Chinese chess has a long history and combines ideological strategy and military competition. It is an ancient and traditional culture. Chinese chess mobile phone APP is based on the Android platform to develop an application software, with compatibility and man-machine chess features. APP design mainly consists of three parts: process analysis, function design and data structure design. the game interface, welcome board drawing, the rules of the game, chess go settings, and all layout algorithm are set and designed, to achieve the intended function of APP. The actual running result proves that Chinese chess mobile phone APP has the characteristics of beautiful interface, stable operation, full of antagonism and traditional culture color, and it is conducive to the development of human intelligence and peoples thinking ability.
Key Words:Android; mobile devices; Chinese chess; mobile game
0 引言
隨著信息技術(shù)的高速發(fā)展,智能手機(jī)已進(jìn)入到普通人的日常生活,手機(jī)游戲這種大眾化的娛樂(lè)方式也受到人們的廣泛歡迎。中國(guó)象棋發(fā)展至今已有兩千三百多年歷史,是中華民族的國(guó)粹。它集文化、科學(xué)、軍事、競(jìng)技于一體,有利于開(kāi)發(fā)人的智力,鍛煉人的思維能力,并增強(qiáng)人的競(jìng)爭(zhēng)意識(shí)[1]。中國(guó)象棋愛(ài)好者遍布全球,通過(guò)網(wǎng)絡(luò),下棋沒(méi)有了地域限制,人們甚至可以和電腦對(duì)弈。在對(duì)弈中,對(duì)戰(zhàn)雙方通過(guò)對(duì)游戲規(guī)則的掌握使游戲結(jié)果利于己方,機(jī)器博弈研究成果已廣泛應(yīng)用于眾多領(lǐng)域[2]。通過(guò)中國(guó)象棋人機(jī)游戲,可以使象棋愛(ài)好者及希望了解象棋的人更加輕松地感受象棋的魅力[3]。
1 Android特征與體系結(jié)構(gòu)
1.1 Android特征
Android是一個(gè)對(duì)第三方軟件完全開(kāi)放的平臺(tái),開(kāi)發(fā)者在為其開(kāi)發(fā)程序時(shí)擁有更大的自由度,打破了iPhone等只能添加為數(shù)不多的固定軟件的枷鎖。同時(shí),與Windows mobile、Symbian等操作系統(tǒng)不同,Android操作系統(tǒng)免費(fèi)向開(kāi)發(fā)人員開(kāi)放,從而大大降低了開(kāi)發(fā)成本[4]。
1.2 體系結(jié)構(gòu)
Android的系統(tǒng)架構(gòu)與其操作系統(tǒng)相同,采用了分層架構(gòu)。Android結(jié)構(gòu)分為4層,從低到高層分別為:①Linux內(nèi)核層:該層是基礎(chǔ)層,包含各種驅(qū)動(dòng),并提供操作系統(tǒng)的基本功能;②中間層,包括程序庫(kù)(Libraries)和Android運(yùn)行環(huán)境;③應(yīng)用框架層:該層是編寫(xiě)核心應(yīng)用使用的API框架,開(kāi)發(fā)者可以使用相關(guān)框架開(kāi)發(fā)自己的應(yīng)用,但必須遵守該框架的開(kāi)發(fā)原則[5];④應(yīng)用層:該層是各種應(yīng)用軟件,包括通話、短信、日歷、地圖、瀏覽器等軟件的核心應(yīng)用程序。
2 系統(tǒng)分析
2.1 可行性分析
中國(guó)象棋人機(jī)游戲是基于Android平臺(tái)開(kāi)發(fā)的一個(gè)手持設(shè)備應(yīng)用游戲,具備兼容性和人機(jī)對(duì)弈的特點(diǎn)。中國(guó)象棋游戲?qū)儆谄迮祁愑螒?,每類不同的棋子有著各自固定的走法,?duì)弈雙方進(jìn)行輪換走棋。本游戲模擬人人對(duì)弈,可實(shí)現(xiàn)人機(jī)對(duì)弈。游戲設(shè)計(jì)主要由3方面組成:流程分析、功能設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)。
2.2 界面需求分析
游戲界面需求如下:①運(yùn)行游戲,首先出現(xiàn)歡迎界面,隨后進(jìn)入菜單頁(yè)面;②菜單頁(yè)面設(shè)置“開(kāi)始游戲”、“象棋歷史”、“象棋規(guī)則”、“退出游戲”幾個(gè)板塊。點(diǎn)擊“象棋歷史”與“象棋規(guī)則”可分別進(jìn)入象棋歷史介紹與游戲玩法介紹頁(yè)面;③單擊“開(kāi)始游戲”進(jìn)入游戲主界面,游戲界面中玩家按照象棋規(guī)則下棋,可單擊聲音按鈕控制聲音,當(dāng)游戲一方的“將”或“帥”被吃掉時(shí),出現(xiàn)“你輸了”或 “你贏了”界面。游戲中玩家還可隨時(shí)通過(guò)“退出”按鈕返回游戲主菜單。
2.3 游戲流程分析
進(jìn)入游戲界面后,設(shè)置象棋棋盤(pán)。雙方各持一種顏色的棋子,棋子按照規(guī)則從棋盤(pán)的一個(gè)位置走到另一個(gè)位置,或吃掉該位置上對(duì)方的一枚棋子,方為走了一步,之后以輪換的方式進(jìn)行交互走棋博弈。玩家走完一步后,程序需要在棋子的諸多走法中,通過(guò)搜索函數(shù)和局面評(píng)估函數(shù)逐一打分,最后挑選出最佳走法并執(zhí)行[6]。
3 游戲系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
3.1 類框架設(shè)計(jì)
通過(guò)瀏覽中國(guó)象棋的歷史以及走法,同時(shí)結(jié)合象棋人機(jī)對(duì)戰(zhàn)游戲的需求分析,游戲總體設(shè)計(jì)由以下幾部分組成:共有類、輔助界面相關(guān)類、游戲界面相關(guān)類。
共有類是Activity的派生類Chess_DJB_Activity,該類是游戲的控制器,也是整個(gè)程序的入口;輔助界面相關(guān)類由歡迎界面類WelcomeView、菜單界面類MenuView等組成;游戲界面相關(guān)類由游戲界面類GameView、游戲界面相關(guān)常量類ViewConstant組成;走法引擎相關(guān)類由常量類Constant、方法類Chess_LoadUtil、走法引擎主類LoadUtil、比較器類MyComparator,以及走棋步驟類StackplayChess組成。
3.2 共有類實(shí)現(xiàn)
共有類Chess_DJB_Activity的主要作用是通過(guò)接收Handler消息變量,根據(jù)各界面發(fā)送過(guò)來(lái)的Handler消息類型判斷需要執(zhí)行的操作。適當(dāng)?shù)爻跏蓟鄳?yīng)用戶界面,各個(gè)界面初始化被調(diào)用時(shí),根據(jù)其它界面需求直接將用戶界面切換到相應(yīng)界面[7]。
3.3 輔助界面相關(guān)類實(shí)現(xiàn)
游戲歡迎界面通過(guò)WelcomeView類實(shí)現(xiàn),加載一個(gè)歡迎圖片,并通過(guò)監(jiān)聽(tīng)菜單圖片,向Activity發(fā)送Handler消息,通知控制器切換用戶界面,然后切換到菜單界面MenuView。MenuView類中通過(guò)監(jiān)聽(tīng)“開(kāi)始游戲”切換到游戲界面,監(jiān)聽(tīng)“打開(kāi)聲音/關(guān)閉聲音”按鈕切換聲音的打開(kāi)與關(guān)閉,監(jiān)聽(tīng)“象棋歷史”切換到象棋起源界面,監(jiān)聽(tīng)“象棋規(guī)則”切換到規(guī)則介紹頁(yè)面,監(jiān)聽(tīng)“退出游戲”,結(jié)束并退出游戲。
3.4 游戲界面相關(guān)類實(shí)現(xiàn)
游戲界面類GameView是游戲最核心的類,該類首先繪制屏幕棋盤(pán)和相應(yīng)棋子,提示一方先走,當(dāng)“帥”或“將”被吃掉則彈出“贏”或者“輸”[8],還可控制游戲聲音及結(jié)束游戲。
3.5 走法引擎相關(guān)類實(shí)現(xiàn)
3.5.1 常量類Constant
中國(guó)象棋分為紅黑雙方,以楚河漢界為界限,雙方排兵布陣,一方持16子,分為2車、2馬、2炮、2象(相)、2士(仕)、1將(帥)、5卒(兵)。各類棋子走法不同,具體如下:“將”、“帥”統(tǒng)領(lǐng)整個(gè)棋局,在中軍帳中運(yùn)籌帷幄,并且受到嚴(yán)密保護(hù),不能隨意走出軍帳范圍。因此,“將”、“帥”的行走范圍只在己方底三行中三列形成的9個(gè)交叉點(diǎn),俗稱“九宮格”,一步只能走一個(gè)方格的直線距離。同時(shí),在中間無(wú)其它棋子隔離時(shí),將帥不能出現(xiàn)在同一條直線上,如圖1所示。
“仕”的主要職責(zé)是保護(hù)首領(lǐng),因此它們也只能在將帥附近九宮格的交叉線上走動(dòng),一步只能走一個(gè)交點(diǎn)的距離;“象”、“相”只可在己方陣營(yíng)以“田字格”形式走動(dòng),不能過(guò)河,走動(dòng)時(shí)起始點(diǎn)與目標(biāo)點(diǎn)構(gòu)成一條斜線,若該斜線的中點(diǎn)位置存在其它棋子(包括己方棋子),則無(wú)法走動(dòng);“炮”可以走直線上的任意距離,但起點(diǎn)與目標(biāo)點(diǎn)之間不能存在其它棋子?!芭凇毕麥鐚?duì)方棋子的條件是與目標(biāo)棋子在一條直線上,而且兩棋子之間有且只有一個(gè)棋子(已方或敵方棋子)作為“炮臺(tái)”,如圖2所示。
“馬”只能走“日”字方格并且可以過(guò)河,但是存在“絆馬腿”的情況,從初始位置到目標(biāo)位置緊挨著的兩格長(zhǎng)度方向不能有棋子,否則會(huì)被絆??;“車”可以隨意在直線上走動(dòng)任意距離,但起點(diǎn)和目標(biāo)點(diǎn)中間不能有其它棋子,包括己方棋子;卒和兵個(gè)數(shù)最多,在過(guò)河之前不能向左右走,只能向前走,過(guò)河之后可以向左右走,但不能向后走。
3.5.2 棋盤(pán)表示
對(duì)于棋盤(pán)的設(shè)計(jì),每種棋子采用一個(gè)固定值以識(shí)別該棋子類型,然后根據(jù)紅黑雙方以及不同類型的棋子設(shè)計(jì)規(guī)則類,調(diào)用其中的canMove方法判斷每一步走法是否可行。規(guī)則類設(shè)計(jì)采用規(guī)則方法,因?yàn)槠遄臃N類只有7類,且紅黑雙方位于棋盤(pán)兩端[9],部分棋子走動(dòng)時(shí)方向不同,設(shè)計(jì)時(shí)需要進(jìn)行分類設(shè)計(jì),采用14種不同的判別方法對(duì)所有棋子的走法進(jìn)行判斷。棋盤(pán)上各個(gè)棋子以及棋盤(pán)的初始布局設(shè)計(jì)采用10*9的數(shù)組進(jìn)行標(biāo)識(shí),各數(shù)字的對(duì)應(yīng)關(guān)系為:
0-無(wú)棋子;8-黑方的將;9-黑方的士;10-黑方的象;11-黑方的馬;12-黑方的車;13-黑方的炮;14-黑方的卒;16-紅方的帥;17-紅方的仕;18-紅方的相;19-紅方的馬;20-紅方的車;21-紅方的炮;22-紅方的兵。
3.5.3 走法引擎主類實(shí)現(xiàn)
(1)在棋盤(pán)上放一枚棋子的方法AddPiece:
public static void AddPiece(int sq, int pc){
ucpcSquares[sq]=pc;
if (pc<16) {
vlWhite+=cucvlPiecePos[pc-8][sq];
} else {
vlBlack+=cucvlPiecePos[pc-16][SQUARE_FLIP(sq)];
}
}
(2)在棋盤(pán)上拿走一枚棋子的方法DelPiece:
public static void DelPiece(int sq, int pc){
ucpcSquares[sq]=0;
if (pc<16) {
vlWhite-=cucvlPiecePos[pc-8][sq];
} else {
vlBlack-=cucvlPiecePos[pc-16][SQUARE_FLIP(sq)];
}
(3)撤銷一步棋的方法UndoMakeMove:
public static void UndoMakeMove(int mv,int pcCaptured){
nDistance--;
ChangeSide();
UndoMovePiece(mv, pcCaptured);
}
(4)移動(dòng)棋子方法MovePiece:
public static int MovePiece(int mv){
int sqSrc, sqDst, pc, pcCaptured;
sqSrc=SRC(mv);
sqDst=DST(mv);
pcCaptured=ucpcSquares[sqDst];
if (pcCaptured !=0) {
DelPiece(sqDst, pcCaptured);
}
pc=ucpcSquares[sqSrc];
DelPiece(sqSrc, pc);
AddPiece(sqDst, pc);
return pcCaptured;
}
(5)撤銷移動(dòng)棋子方法UndoMovePiece:
public static void UndoMovePiece(int mv,int pcCaptured){
int sqSrc, sqDst, pc;
sqSrc=SRC(mv);
sqDst=DST(mv);
pc=ucpcSquares[sqDst];
DelPiece(sqDst, pc);
AddPiece(sqSrc, pc);
if (pcCaptured !=0) {
AddPiece(sqDst, pcCaptured);
}}
(6)走棋的方法MakeMove:
public static boolean MakeMove(int mv, int pcCaptured){
pcCaptured=MovePiece(mv);
if (Checked()) {
UndoMovePiece(mv, pcCaptured);
return false;}
ChangeSide();
nDistance++;
return true;}
3.6 游戲?qū)崿F(xiàn)
子力價(jià)值表示一個(gè)棋子在棋盤(pán)中某個(gè)位置時(shí)的價(jià)值,而一方棋盤(pán)上所有棋子的子力價(jià)值之和,表示該局面下的局面價(jià)值。局面價(jià)值越大,說(shuō)明該局面對(duì)己方越有利,程序根據(jù)局面價(jià)值搜索最優(yōu)走棋步驟并執(zhí)行。
4 結(jié)語(yǔ)
在中國(guó)象棋人機(jī)對(duì)戰(zhàn)APP的開(kāi)發(fā)中,遇到了諸多問(wèn)題,如棋子走法如何約束、人機(jī)輪流走棋如何控制等。最后成功克服了諸多難題,實(shí)現(xiàn)了一款界面美觀、運(yùn)行穩(wěn)定,且富有對(duì)抗性和傳統(tǒng)文化色彩的中國(guó)象棋人機(jī)對(duì)弈游戲Android APP。未來(lái)還可作進(jìn)一步改進(jìn),比如通過(guò)深度學(xué)習(xí)等人工智能算法[10],讓機(jī)器更加“聰明”,從而使人機(jī)對(duì)戰(zhàn)更具有挑戰(zhàn)性和觀賞性。
參考文獻(xiàn):
[1] 杜幫國(guó).基于Java平臺(tái)的中國(guó)象棋游戲的設(shè)計(jì)與實(shí)現(xiàn)[D].大連:大連理工大學(xué),2013.
[2] 魏欽剛,王驕,徐心和,等.中國(guó)象棋計(jì)算機(jī)博弈開(kāi)局庫(kù)研究與設(shè)計(jì)[C].2006中國(guó)機(jī)器博弈學(xué)術(shù)研討會(huì),2006.
[3] 王曉鵬,王驕,徐心和,等.中國(guó)象棋與國(guó)際象棋比較分析[J].重慶工學(xué)院學(xué)報(bào):自然科學(xué)版,2007(1):71-76.
[4] 韓敬海.Android程序設(shè)計(jì)[M].北京:電子工業(yè)出版社,2012.
[5] 趙燕萍.Java程序設(shè)計(jì)語(yǔ)言基礎(chǔ)研究[J].硅谷,2013(8):61-62.
[6] 徐心和,王驕.中國(guó)象棋計(jì)算機(jī)博弈關(guān)鍵技術(shù)分析[J].小型微型計(jì)算機(jī)系統(tǒng),2006,27(6):961-969.
[7] 蘇攀,王熙照,李艷.基于不平衡學(xué)習(xí)的分類器博弈模型及其在中國(guó)象棋中的應(yīng)用[J].計(jì)算機(jī)研究與發(fā)展,2011(5):841-847.
[8] 周瑋,王水濤,孫旸.中國(guó)象棋計(jì)算機(jī)博弈中的一種數(shù)據(jù)結(jié)構(gòu)方法[J].計(jì)算機(jī)工程與應(yīng)用,2006(35):219-221.
[9] 杜俊俐,張景飛,黃心漢.基于視覺(jué)的象棋棋盤(pán)識(shí)別[J].計(jì)算機(jī)工程與應(yīng)用,2007(34):220-222.
[10] 劉建偉,劉媛,羅雄麟.深度學(xué)習(xí)研究進(jìn)展[J].計(jì)算機(jī)應(yīng)用研究,2014(7):1921-1930.
(責(zé)任編輯:黃 健)