蘭 偉
(重慶科創(chuàng)職業(yè)學(xué)院 信息工程系, 重慶 永川 402160)
棋牌對弈類游戲是玩家利用休閑時消遣的主要競技性游戲,因具有良好的娛樂性和智慧性,深受玩家喜愛。同時軟件程序員也熱衷編寫棋牌對弈類游戲,原因是棋牌對弈類游戲可以訓(xùn)練程序員面向?qū)ο笤O(shè)計能力,同時也能學(xué)習(xí)和應(yīng)用人工智能相關(guān)知識。中國象棋,是由兩人輪流走子,以“將死”或“困斃”對方將(帥)為勝的一種棋類運動。由于用具簡單,趣味性強,是當(dāng)今國內(nèi)最流行棋藝活動之一。
Java語言是一款非常優(yōu)秀的面向?qū)ο蟪绦蛟O(shè)計語言,因其具有極高的安全性和跨平臺性,廣泛應(yīng)用于互聯(lián)網(wǎng)、嵌入式智能終端、游戲開發(fā)等領(lǐng)域。[1]本文以Java語言為例,利用面向?qū)ο笤O(shè)計思想設(shè)計一款網(wǎng)絡(luò)對弈版的中國象棋游戲。
本系統(tǒng)主要需要完成網(wǎng)絡(luò)對戰(zhàn)時開始新局、走棋、認輸、求和、悔棋、網(wǎng)絡(luò)連接設(shè)置等基本操作。
本系統(tǒng)完成中國象棋網(wǎng)絡(luò)對弈功能。除了滿足功能需求外,還需要考慮網(wǎng)絡(luò)質(zhì)量問題,因為良好的網(wǎng)絡(luò)環(huán)境才能增加游戲樂趣。用戶對網(wǎng)絡(luò)性能要求主要體現(xiàn)連接時延、棋局同步時延和連接穩(wěn)定性方面。連接時延是指對弈雙方建立網(wǎng)格連接的平均時延,棋局同步時延是指一方玩家落子后到另一方玩家游戲界面顯示的時間差,網(wǎng)絡(luò)穩(wěn)定性是規(guī)定時間內(nèi)連接玩家之間棋局同步成功的概率。性能需求見表1。[2]
表1 網(wǎng)絡(luò)對弈版的中國象棋性能需求
網(wǎng)絡(luò)編程需要解決兩個問題:一個是如何在網(wǎng)絡(luò)中準確定位一臺或多臺主機,另一個是當(dāng)找到所需要的主機后如何進行可靠高效的數(shù)據(jù)傳輸。Java Socket(中文翻譯成:套接字)技術(shù)就是用來解決Java網(wǎng)絡(luò)編程中主機定位和數(shù)據(jù)傳輸?shù)?,Socket實質(zhì)是雙向連通的輸入輸出流。無論是服務(wù)器端還是客戶端都可以向流中寫入和讀取信息,從而實現(xiàn)服務(wù)器與客戶端的通信功能。[3]
本系統(tǒng)主要需要解決兩個核心問題,第一是中國象棋棋盤、棋子等各元素的抽象,即類的設(shè)計;第二是對游戲友好界面的設(shè)計。
中國象棋棋盤是一個由10條橫線和9條豎線構(gòu)成的網(wǎng)絡(luò),共90個交叉點。這些交叉點又稱為棋點,每一個棋子只能在棋點上行走。為了能準確記錄下棋盤的每個棋點,可以選擇一個大小為90的數(shù)組模擬棋盤上的90個棋點。如圖1所示。
圖1 中國象棋棋盤模型
因此可以設(shè)計一個棋點類(ChessPoint)和一個類盤類(ChessBoard),設(shè)計如下:
中國象棋共有32顆棋子,雙方各16顆。類型有“車”、“馬”、“相/象”、“士”、“帥/將”、“炮”、“兵/士”。紅方的“帥”和黑方的“將”只是所加載的圖片不同,棋子的功能是一樣的。類似的還有“兵/士”和“相/象”。棋子另外還有所在位置、是否顯示、紅方或黑方等屬性。因此中國象棋棋子可抽象出的棋子類(ChessPiece)如下:[4]
不同的棋子有不同的走法,即走棋規(guī)則。例如“車”的走棋規(guī)則是按水平或垂直方向無障礙行走或吃棋子。因為中國象棋走棋規(guī)則較復(fù)雜,因此單獨設(shè)計一個規(guī)則類(Rule)。[5]
游戲主界面類ChineseChess是一個可視化的界面,因此需要繼承JFrame類。在該界面中我們通過菜單完成網(wǎng)絡(luò)設(shè)置、開始新棋局、認輸、求和等操作。另外還要顯示棋盤及棋子,可以完成走棋操作。[6]因此,ChineseChess類設(shè)計如下:
因為本系統(tǒng)為一款網(wǎng)絡(luò)對弈版的中國象棋游戲,因此需要設(shè)計網(wǎng)絡(luò)通信模塊。根據(jù)面向?qū)ο蟮木幊趟枷耄磺薪詾閷ο?,網(wǎng)絡(luò)通信模塊可以設(shè)計成一個網(wǎng)絡(luò)通信類,完成網(wǎng)絡(luò)對弈的需要。網(wǎng)絡(luò)通信類需要使用Socket技術(shù)。因網(wǎng)絡(luò)對弈需要兩臺電腦通過Internet完成對弈,因此需要輸入和輸出Socket,即服務(wù)器端和客戶端兩個方向的流實現(xiàn)數(shù)據(jù)傳輸。
在服務(wù)器端,首先需要根據(jù)端口(port)建立一個serverSocket,然后建立一個等待客戶端的監(jiān)聽Socket,然后再各創(chuàng)建一個輸入輸出流。在客戶端需要根據(jù)服務(wù)器的IP地址和Port創(chuàng)建客戶端Socket,同樣需要各創(chuàng)建一個輸入輸出流,這樣服務(wù)器端和客戶端就可以通信了。另外網(wǎng)絡(luò)通信類中設(shè)計一個調(diào)度方法 dispatcher(String s),通過提取字符 s的信息,可以得出調(diào)用者的操作類別,包括走棋、悔棋、新游戲申請等,再根據(jù)操作類別做相應(yīng)的處理。
本文在分析中國象棋走棋規(guī)則后,采用Java技術(shù)、網(wǎng)絡(luò)通信技術(shù)和面向?qū)ο蟮脑O(shè)計方法,完成了網(wǎng)絡(luò)對弈版中國象棋設(shè)計,實現(xiàn)玩家通過網(wǎng)絡(luò)完成對弈功能。通過實驗運行,證明本次設(shè)計可行,并達到了預(yù)期效果。
[1]Bruce Eckel.Java 編程思想[M].北京:機械工業(yè)出版社,2007:680-688.
[2]臧利萍,程文靜,王衛(wèi)振.基于Android的中國象棋游戲的模擬[J].電腦知識與技術(shù),2014(32):7742-7743.
[3]杜幫國.基于Java平臺的中國象棋游戲的設(shè)計與實現(xiàn)[D].大連:大連理工大學(xué),2013.
[4]高偉,郭瑾,張昊.基于JAVA技術(shù)的中國象棋游戲設(shè)計與實現(xiàn)[J].大連民族學(xué)院學(xué)報,2007(5):17-19.
[5]李勇.基于移動互聯(lián)網(wǎng)的國際象棋對弈系統(tǒng)的設(shè)計與實現(xiàn)[D].武漢:華中科技大學(xué),2011.
[6]戴錦餛.計算機象棋[J].微計算機應(yīng)用,1994(3):5-11.
襄陽職業(yè)技術(shù)學(xué)院學(xué)報2016年3期