摘要:本文設計實現(xiàn)了基于Android平臺的圍棋游戲,分別利用SDK、NDK交叉編譯工具開發(fā)了圖形界面和圍棋引擎,然后利用Java輸入輸出流和對GTP協(xié)議的解析,完成了圖形界面和引擎進程間的通信。經(jīng)測試,游戲操作簡單,棋力優(yōu)異,具備一定的可玩性。所提出的開發(fā)框架對Android棋牌類游戲開發(fā)有一定的參考意義。
關鍵詞:Android;NDK;GTP;圍棋游戲
中圖分類號:TP311.52 文獻標識碼:A 文章編號:1007-9599 (2012) 22-0000-02
隨著生活節(jié)奏的加快,智能手機的發(fā)展,人們對于在智能手機上進行娛樂的需求越來越大,而棋牌類游戲作為游戲中趣味性較強的一類,有著廣泛的市場空間和一定的娛樂價值。圍棋因其可玩性強和操作簡便等特點,成為棋牌類游戲中最受歡迎的游戲之一。本文基于Android平臺,利用Android SDK,結(jié)合Android NDK工具,設計實現(xiàn)了19路圍棋游戲。
1 游戲設計及框架
本文所討論的圍棋游戲,主要功能是人機對弈。它的實現(xiàn)主要涉及三個方面:對弈界面,引擎程序以及界面和引擎程序間的通信。基本步驟為:利用Android SDK開發(fā)游戲界面,將已有的C++引擎程序交叉編譯到Android系統(tǒng)上獨立運行在子進程中,再通過Java輸入輸出流實現(xiàn)界面與引擎間通信,且通信中遵循GTP(Go Text Protocol)協(xié)議。該游戲的整體結(jié)構(gòu)如圖1所示:
2 游戲界面的設計與實現(xiàn)
圍棋對弈需要遵守圍棋規(guī)則,所以,需要定義規(guī)則算法來保證對弈過程的正確性和真實性。規(guī)則算法中主要實現(xiàn)兩個功能:判斷某點是否可下和把無氣之子提出盤外。棋盤的繪制是將組成棋盤的元素,包括材質(zhì)背景圖片、棋盤線、星點和坐標,順序繪制在屏幕上。監(jiān)聽手指的觸屏動作,刷新界面,將棋子圖片繪制在屏幕正確的位置上,實現(xiàn)落子效果。
2.1 棋盤繪制
圍棋對弈界面的開發(fā)可以被劃歸到游戲開發(fā)范疇,Android游戲開發(fā)中常用的三種視圖是View、SurfaceView和GLSuifaceView[1]。View是顯示視圖,內(nèi)置畫布,提供圖形繪制函數(shù)、觸屏事件、按鍵事件函數(shù)等;SurfaceView拓展于View,以單獨的線程執(zhí)行畫布重繪;GLSurfaceView拓展于SurfaceView,專用于3D游戲開發(fā)。
View游戲框架已經(jīng)可以滿足圍棋界面2D顯示。定義游戲界面類GameView,繼承自View。復寫onDraw方法,在畫布(Canvas)上依次繪制棋盤材質(zhì)圖片、361條垂直交叉的棋盤線、9個圓形星位和76個橫縱坐標。
2.2 屏幕監(jiān)聽和棋子繪制
View視圖類中封裝了觸屏監(jiān)聽函數(shù):onTouchEvent(MotionEvent event),event實例中保存了觸屏動作,如:按下、抬起、移動、屏幕壓力、多點觸屏等。重寫onTouchEvent函數(shù),調(diào)用event的getX()、getY()方法獲取手指觸摸位置,將觸摸點對應到與其距離最近的棋盤坐標上。通過event.getAction()方法獲取玩家的動作,與MotionEvent類中定義的動作常量值相匹配,若匹配成功,進行相應處理??紤]落子操作的需求,對玩家的按下動作、抬起動作和移動動作進行處理。這三個動作對應的動作常量值分別是ACTION_DOWN、ACTION_UP和ACTION_MOVE。監(jiān)聽到ACTION_UP事件后,依據(jù)規(guī)則,判斷該坐標點可以落子后,調(diào)用invalidate()方法重繪畫布,刷新屏幕,將棋子繪制在棋盤上。
3 引擎程序交叉編譯
本文所利用的圍棋引擎程序是基于Linux、以C++語言實現(xiàn)的Lingo程序,對Lingo的交叉編譯是基于Android NDK(Native Development Kit)實現(xiàn)的。
NDK是Android原生態(tài)開發(fā)工具,主要面向C、C++程序員,NDK可以將本地C、C++組件代碼嵌入到應用程序中,為已有代碼的重用提供了便利[3]。NDK集成了交叉編譯器,并提供了相應的mk文件隔離CPU、平臺、ABI等差異,開發(fā)人員只需要編寫mk文件,就可以創(chuàng)建出動態(tài)庫、可執(zhí)行文件或者靜態(tài)庫。
Android NDK源碼路徑設置遵循一定的路徑格式。工程文件夾下需要包含如下幾個目錄:JNI、Libs、Obj[4]。將Lingo源碼文件存放在JNI目錄下,同時在JNI目錄下創(chuàng)建并編寫Android.mk文件和Application.mk文件,指出需要編譯的文件、編譯特性要求等,編譯的時候編譯腳本會在JNI目錄下自動尋找這兩個mk文件,然后根據(jù)腳本配置開始編譯工作。
將sgfc(sgf格式棋譜解析)模塊、go(引擎)模塊分別編譯成靜態(tài)庫libsgfc.a、libgo.a,再集成到lingo模塊中,最終將lingo編譯成可執(zhí)行文件。編譯后的可執(zhí)行文件lingo會自動拷貝到Libs文件夾下。
然后利用adb push命令將可執(zhí)行文件lingo復制到模擬器或手機上。
4 游戲界面與引擎通信
Java API中的ProcessBuilder提供了創(chuàng)建操作系統(tǒng)進程的方法。在游戲界面端,調(diào)用ProcessBuilder實例的start()方法,啟動lingo子進程。
4.1 GTP協(xié)議
目前,計算機圍棋程序間對弈多采用GTP協(xié)議,它基于文本輸入輸出來傳遞信息[5]。GTP協(xié)議基于提問/應答模式,通信雙方分別作為控制器與引擎,二者建立連接后,控制器可以向引擎發(fā)送請求指令,然后引擎會做出應答?;贚ingo程序?qū)TP協(xié)議的良好支持,游戲界面也解析了GTP協(xié)議,并作為客戶端向lingo發(fā)送指令,lingo會做出應答。本文所討論的圖形界面支持的兩個主要GTP協(xié)議指令為:
4.2 獨立線程實現(xiàn)通信
在多線程方面,Android提供了非常好的支持。為避免引擎計算時間可能過長而造成主線程阻塞,將界面與引擎的通信在單獨的線程中實現(xiàn)。在該線程中通過Java輸出流向lingo引擎發(fā)送請求指令,利用Java輸入流接收lingo引擎的應答。
5 結(jié)束語
圍棋游戲成功安裝,經(jīng)反復測試,該圍棋游戲通過友好的圖形界面和棋力優(yōu)異的圍棋引擎,使玩家體驗到圍棋的智慧與樂趣。文中重點介紹了本游戲開發(fā)過程中使用的關鍵技術,為Android棋牌類游戲開發(fā)提供了一定參考價值。
參考文獻:
[1]李華明. Android游戲編程之從零開始[M].北京:清華大學出版社,2011:118-119.
[2]吳亞峰,蘇亞光. Android游戲開發(fā)大全[M].北京:人民郵電出版社,2012:325-371.
[3]趙宏偉. Android NDK開發(fā)環(huán)境實現(xiàn)與應用[J].電腦知識與技術,2010,6(35):10055-10060.
[4]劉知青,李文峰.現(xiàn)代計算機圍棋基礎[M].北京:北京郵電大學出版社,2011:182-183.