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