覃建運,李春青
(廣西民族師范學院 數(shù)學與計算機科學學院,廣西 崇左 532200)
國際象棋作為一款著名的棋牌類游戲,不僅擁有悠久的歷史和大規(guī)模玩家群體,還具有豐富的娛樂性、健腦性和交友性[1]。眾多玩家群體在此具有廣闊的交友空間,然而受地域限制,玩家以棋會友的夢想難以實現(xiàn)。隨著計算機技術(shù)的發(fā)展,棋牌類游戲得到了快速發(fā)展,不僅擁有更加豐富的娛樂性,還打破了地域限制,玩家能交到更多好友。
Java作為一種面向?qū)ο笤O計的編程語言,因其可移植性、簡潔、安全等特點,成為世界上最受歡迎的編程語言之一,深受眾多編程人員喜愛[2-4]。本文在研究國際象棋規(guī)則基礎上,結(jié)合Java Socket編程技術(shù)[5]、Java Swing技術(shù)[6]和人機博弈算法[7-9]等,設計并實現(xiàn)一個具有人機博弈、在線博弈、殘局闖關(guān)和好友互動等功能的國際象棋博弈系統(tǒng)。
游戲網(wǎng)絡通訊部分采用C/S模式,并結(jié)合Java Socket技術(shù)實現(xiàn)客戶端與服務端之間的通信[10]。游戲需實現(xiàn)多用戶同時在線,因此服務端需具有多客戶端同時連接功能。首先在服務端建立ServerSocket類繼承Thread類,并創(chuàng)建ServerSocket對象SS,采用線程實現(xiàn)對客戶端連接請求的持續(xù)監(jiān)聽,即循環(huán)調(diào)用ServerSocket的accept()方法。當服務器接收到客戶端的連接請求時建立專線連接,建立連接后的兩個scoket將在一個單獨的線程上進行信息交互。
游戲界面采用Java Swing技術(shù),分為登錄界面、用戶界面、游戲界面等。登錄界面為玩家提供登錄和注冊功能,用戶界面為玩家提供玩家互動和功能選擇模塊,玩家在用戶界面點擊功能選項進入相應的功能模塊或游戲界面。
用戶在與平臺進行交流過程中,需要運用數(shù)據(jù)庫進行語言傳遞,數(shù)據(jù)庫是數(shù)據(jù)存儲和數(shù)據(jù)分析的基礎。本文數(shù)據(jù)庫設計采用E-R圖[11]方式,將用戶需求、平臺內(nèi)容建設等相對抽象的概念轉(zhuǎn)化為相對具象的概念模式[12],再由E-R圖呈現(xiàn)。 在邏輯設計過程中,E-R圖在Java的要求下需要轉(zhuǎn)變?yōu)榫唧w的DBMS產(chǎn)品[13]支持數(shù)據(jù)模型,并根據(jù)設計的功能模塊分別形成符合模塊要求的基本表。在基本表中對模塊的不同功能設置不同字段,再借助數(shù)據(jù)類型使模塊功能完整。
在SQL Server中建立ChessDB數(shù)據(jù)庫,并根據(jù)ER圖設計結(jié)果在ChessDB數(shù)據(jù)庫中建立UserInformation表、Friend表、Count表、Chess表等。為方便數(shù)據(jù)庫操作,本文新建了SQLDBO類,在SQLDBO類中運用JDBC技術(shù)實現(xiàn)服務端與服務器連接[14],在Operate類中實現(xiàn)對數(shù)據(jù)庫的增刪改查操作。服務端通過調(diào)用Operate類實現(xiàn)對數(shù)據(jù)庫的操作。 玩家在客戶端與數(shù)據(jù)庫服務器端的交互過程如圖1所示。
圖1 客戶端與數(shù)據(jù)庫服務器端交互過程
根據(jù)需求分析結(jié)果確定游戲系統(tǒng)功能,如圖2所示。
圖2 系統(tǒng)功能
關(guān)鍵模塊功能如下:
(1)注冊功能為玩家提供便捷的游戲賬號注冊通道。注冊時玩家須填寫用戶名即玩家游戲昵稱和密碼,確認密碼后點擊“注冊”完成注冊;游戲玩家用戶名唯一,不能重復注冊,成功后不可更改。
(2)登陸功能是網(wǎng)絡游戲必備的功能,該功能實現(xiàn)客戶端與服務端連接。玩家須正確輸入游戲賬號和密碼,客戶端將賬號信息發(fā)送至服務端,服務端將信息與數(shù)據(jù)庫內(nèi)的數(shù)據(jù)進行比對,驗證成功后方可登陸至游戲界面。
(3)在線對戰(zhàn)分為普通模式和殘局模式。普通模式為完整棋盤,殘局模式由服務器為雙方玩家隨機抽取殘局棋盤,兩種模式均通過服務器為玩家隨機匹配對手,玩家下載模式后可進入匹配隊列服務器為其匹配相應模式下的玩家,匹配成功后方可進行游戲。
(4)人機對戰(zhàn)功能基于人機博弈算法Alpha_Beta[15]實現(xiàn),游戲玩家可通過搜索算法功能與計算機進行博弈,從而達到鍛煉棋技的目的。
(5)闖關(guān)模式是人機對戰(zhàn)的特殊玩法,該功能通過將收錄的殘局棋譜設置成關(guān)卡形式供玩家選擇,不同關(guān)卡代表不同的殘局。在該模式下玩家將與計算機進行對戰(zhàn),在對戰(zhàn)中玩家獲勝后方能解鎖下一關(guān)卡。
(6)玩家互動功能分為聊天、查找、挑戰(zhàn)和好友功能,其中聊天室功能[16]分為多人文字聊天、一對一文字聊天、一對一網(wǎng)絡語音聊天;查找功能為游戲玩家提供簡單的玩家搜索功能;挑戰(zhàn)功能模塊為玩家提供挑戰(zhàn)功能,通過該功能玩家能對任意在線空閑玩家發(fā)起挑戰(zhàn);好友功能擁有添加和刪除功能,方便玩家對好友進行管理。
(7)我的棋譜功能模塊擁有棋譜上傳、下載、分享、刪除、查看功能,為游戲玩家提供簡單的棋譜管理功能。
(8)排行榜模塊通過對游戲玩家的游戲數(shù)據(jù)進行統(tǒng)計,根據(jù)玩家的勝率排行。
操作系統(tǒng):Windows 7 64-bit,內(nèi)存:4 GB RAM;開發(fā)工具:eclipse + jdk1.8+mysql2005;存儲空間: 1GB 可用空間;環(huán)境需求:jdk1.8+mysql2005。
2.2.1 著法實現(xiàn)
著法實現(xiàn)原理:根據(jù)當前點擊棋子的坐標和棋子類型,通過當前棋子的行棋規(guī)則生成一個可行路徑數(shù)組,該數(shù)組保存當前棋子所在位置的所有合法著法[17]。著法主要代碼如下:
getMovePos(String selectPiece, int[] startPos, Board board){
switch(selectPiece.charAt(1)){//判斷當前點擊的棋子類型
case 'b':
return 當前棋子可行路徑
…
default:
return 空數(shù)組;
}
}
2.2.2 Alpha_Beta搜索算法實現(xiàn)
Alpha_Beta搜索算法原理:首先判斷葉子節(jié)點是否為0或是否有玩家獲勝,如果是則通過局面評估函數(shù)[18]返回估值,否則生成所有合法著法,遍歷所有著法并逐個執(zhí)行。遞歸調(diào)用alphabetaSearch,最后保留最大值,撤銷執(zhí)行著法并剪枝。在搜索算法中需要傳遞兩個值alpha和beta,其中alpha表示搜索到的最好值,beta表示對于對方來說最壞的值,通過判斷這兩個值的關(guān)系結(jié)束搜索,從而達到剪枝目的[19]。Alpha_Beta搜索算法實現(xiàn)主要代碼如下:
int alphabetaSearch(int depth, int alpha, int beta,boolean flag){
if (depth == 0||board.isWin()!='N')// board.isWin()//判斷輸贏N表示沒有玩家獲勝
return new BoardEvaluation(board, board.player).eval();//返回估值
ArrayList
for (Node node : moves) {//遍歷所有著法
UpdatePiece(node);//移動棋子
if (flag) {
alpha=Math.max(alpha,alphabetaSearch(depth - 1, alpha, beta, false));//遞歸調(diào)用
}else{
beta= Math.min(beta, alphabetaSearch(depth - 1, alpha, beta, true)); //遞歸調(diào)用
}
Black();//撤銷移動棋子
if (beta <= alpha) {//剪枝
break;
}
}
}
2.2.3 人機博弈算法實現(xiàn)
人機博弈算法原理:人機博弈算法是人機對戰(zhàn)的靈魂,因此人機博弈算法的實現(xiàn)是人機對戰(zhàn)玩法的重要組成部分。要實現(xiàn)人機博弈算法首先要實現(xiàn)棋子的著法,其次需要設置一個局面評估函數(shù)BoardEvaluation實現(xiàn)對棋局的評價,最后使用Alpha_Beta搜索算法搜索出最優(yōu)著法[20]。人機博弈算法流程如圖3所示。
圖3 人際博弈算法流程
2.2.4 語音聊天功能實現(xiàn)
語音聊天功能實現(xiàn)原理:語音聊天需要實現(xiàn)聊天雙方一對一專線連接,該功能模塊涉及到語音信息的實時采集、傳輸和播放,因此新建語音捕捉類CaptureSound和語音播放類PlaySound。語音捕捉類CaptureSound實現(xiàn)Runnable接口,通過run方法實現(xiàn)麥克風信息的實時采集和發(fā)送;語音播放類PlaySound實現(xiàn)Runnable接口,通過run方法實時接收語音信息并解析播放語音信息[21]。語音聊天功能實現(xiàn)代碼如下:
AudioFormat format =new AudioFormat(8000,16,2,true,true);//設置音頻格式
byte[] data = new byte[1024];
//語音捕捉及其發(fā)送
DataLine.Info info = new DataLine.Info(TargetDataLine.class,format);
BufferedOutputStream OutputStream=new BufferedOutputStream(SC. getOutputStream());//封裝
TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info);
line.open(format, line.getBufferSize());
line.start();
int num=line.read(data, 0, 1024);//將語音流寫入byte數(shù)組
OutputStream.write(data, 0, num);//將數(shù)組寫入網(wǎng)絡流
//語音接收及其播放
InputStream=new BufferedInputStream(new AudioInputStream(SC.getInputStream(),
format,2147483647));
DataLine.Info info = new DataLine.Info(SourceDataLine.class,format);
line = (SourceDataLine) AudioSystem.getLine(info);
line.open(format, bufSize);
line.start();
int num = InputStream.read(data); //將解碼后的音頻流寫入byte數(shù)組
line.write(data, 0,num);//播放音頻
游戲客戶端與服務端均在Window系統(tǒng)上對游戲基本功能、各功能模塊運行狀況進行測試,結(jié)果顯示游戲運行狀況良好、基本功能完善、各功能模塊運行正常。
本文國際象棋系統(tǒng)采用Java技術(shù)、SQL2005數(shù)據(jù)庫實現(xiàn)。完成的主要功能有人機博弈、在線博弈、闖關(guān)模式、玩家互動、殘局模式、棋盤的查看、分享和保存、文字聊天和語音聊天、多人聊天、排行榜、登錄和注冊等,為國際象棋玩家提供了一個具有豐富娛樂性和交友性的對戰(zhàn)平臺。游戲的實時語音聊天使玩家能在游戲中與對方進行語音對話,為游戲增添了趣味。但本國際象棋游戲還存在界面不夠美觀、消息提醒功能不夠完善、玩家無法及時獲取聊天信息等問題,后續(xù)需實現(xiàn)消息盒子功能,對人機博弈算法進行深入研究及完善。