張昊
【摘 要】Java語(yǔ)言具有平臺(tái)無(wú)關(guān)性、易移植性等諸多特征,得到了廣泛的應(yīng)用。程序開(kāi)發(fā)費(fèi)用少,工作效率高,并擁有很好的用戶界面和強(qiáng)大的開(kāi)發(fā)工具。網(wǎng)上數(shù)據(jù)編程體現(xiàn)的非常充分,是其它語(yǔ)言無(wú)法做到的。
本論文著眼于Java技術(shù)的應(yīng)用,開(kāi)發(fā)中國(guó)象棋游戲程序,完成基于Java技術(shù)象棋游戲的分析與設(shè)計(jì),充分在游戲中體現(xiàn)了java的優(yōu)勢(shì)。
【關(guān)鍵詞】Java 象棋 游戲 類 接口
【中圖分類號(hào)】TP311 【文獻(xiàn)標(biāo)識(shí)碼】A 【文章編號(hào)】2095-3089(2017)06-0063-02
中國(guó)象棋被譽(yù)為中國(guó)的“國(guó)粹”,從誕生到現(xiàn)在已經(jīng)成為國(guó)人最喜歡的棋類競(jìng)技游戲,對(duì)青少年的影響也是很廣泛,雙方在象棋的對(duì)弈過(guò)程中,體驗(yàn)著智慧對(duì)壘的快樂(lè)。
隨著游戲與Java技術(shù)平臺(tái)的合作,越來(lái)越多的游戲編程愛(ài)好者把Java作為了實(shí)現(xiàn)游戲程序的首選。如今Java技術(shù)在游戲產(chǎn)業(yè)中發(fā)展迅猛,并在網(wǎng)絡(luò)的支持下,在游戲領(lǐng)域中開(kāi)辟了自己的廣闊天地。
游戲設(shè)計(jì)目的及意義
象棋歷史悠久,棋類博弈游戲越來(lái)越受廣大游戲愛(ài)好者的喜愛(ài),它不僅能給對(duì)弈的雙方帶來(lái)快樂(lè),而且還在競(jìng)技的過(guò)程中感受使用計(jì)策戰(zhàn)術(shù),戰(zhàn)勝對(duì)手的自豪感。
功能需求
通過(guò)對(duì)中國(guó)象棋游戲的需求分析,該游戲應(yīng)實(shí)現(xiàn)棋盤(pán)界面的顯示功能,雙方下棋使用鼠標(biāo)挪動(dòng)棋子并吃子的功能,每走一步棋對(duì)棋譜進(jìn)行記錄的功能,嚴(yán)格實(shí)現(xiàn)中國(guó)象棋走棋規(guī)則的功能,關(guān)閉退出游戲等功能。
象棋游戲設(shè)計(jì)的幾個(gè)要點(diǎn)
對(duì)弈的程序,至少應(yīng)具備如下幾個(gè)部分:
①在機(jī)器中表示棋盤(pán)的方法,能夠提供一個(gè)最基本的操作界面,有了這個(gè)界面才能運(yùn)行。
②產(chǎn)生中國(guó)象棋走法的規(guī)則,以使對(duì)弈正確地進(jìn)行,并可判斷雙方是否亂走。
③實(shí)現(xiàn)吃子過(guò)程中的圖形替換、重繪,使得雙方能看出游戲當(dāng)前的形勢(shì)。
象棋游戲棋盤(pán)的設(shè)計(jì)
中國(guó)象棋的棋盤(pán)與其它博弈類的棋盤(pán)不同,對(duì)陣雙方各執(zhí)一方戰(zhàn)場(chǎng),中間有空白河界相隔,俗稱“楚河漢界”。在己方各有一個(gè)交點(diǎn)互相連接的田字格,俗稱“九宮格”,“將”和“士”只能在這個(gè)范圍內(nèi)走動(dòng),不能踏出。
中國(guó)象棋的棋盤(pán)如圖1-1所示:
棋盤(pán)表示就是使用一種數(shù)據(jù)結(jié)構(gòu)來(lái)描述棋盤(pán)及棋盤(pán)上的棋子,通常是使用一個(gè)二維數(shù)組。一個(gè)典型的中國(guó)象棋棋盤(pán)是使用9×10的二維數(shù)組表示。每一個(gè)元素代表棋盤(pán)上的一個(gè)交點(diǎn)。在Java中我們?cè)贑hessBoard這個(gè)類下來(lái)具體實(shí)現(xiàn),定義一個(gè)ChessPoint point[ ][ ]二維數(shù)組,縱列從1到9,橫列從A到J,這樣就表示了象棋棋盤(pán)的9×10的方陣,為每個(gè)棋子提供了放置位置。
中國(guó)象棋游戲規(guī)則的實(shí)現(xiàn)描述
從中國(guó)象棋游戲的棋子和規(guī)則可以看出,由于將或帥、仕和士、象和相、卒和兵的走法相同,只是棋子的標(biāo)示不同,再加上車、馬、炮,所以規(guī)則的主要實(shí)現(xiàn)點(diǎn)有七點(diǎn),以下對(duì)中國(guó)象棋游戲的部分棋子行棋規(guī)則實(shí)現(xiàn)加以描述。
首先我們對(duì)每個(gè)棋子行棋時(shí)的初始和中止位置設(shè)置為startI,startJ,endI,endJ。這樣我們就可以用這四個(gè)值表示出棋子的初始及中止位置的坐標(biāo)點(diǎn)。
接著,我們?cè)俣x兩個(gè)整形變量xAxle和yAxle,他們分別表示初始與終止坐標(biāo)值之間差值的絕對(duì)值。
將或帥:只能在王宮內(nèi)移動(dòng)。每一步只可以水平或垂直移動(dòng)一點(diǎn)。
將或帥的行棋思路如圖1-2所示:
分析描述:對(duì)于帥的活動(dòng)范圍,通過(guò)if(endI<=6&&endI>=4&&endJ>=8)語(yǔ)句限定,如果滿足則可以走棋,不滿足則不能走棋,這就限定棋盤(pán)下方的帥不能走出九宮格。對(duì)于將的活動(dòng)范圍,通過(guò)if(endI<=6&&endI>=4&&endJ<=3)語(yǔ)句限定,原理同上。
行棋規(guī)則則通過(guò)if((xAxle==1&&yAxle==0)||(xAxle==0&&yAxle==1))這條語(yǔ)句限定,就圖1-2所示,帥只能移動(dòng)到(x2,y1)、(x2,y3)、(x1,y2)、(x3,y2)四個(gè)點(diǎn),他們的坐標(biāo)差絕對(duì)值只有滿足上面語(yǔ)句這兩種情況才可以行棋。
象或相:河界的一側(cè)。每一步只可以沿對(duì)角線方向移動(dòng)兩點(diǎn),另外,在移動(dòng)的過(guò)程中不能夠穿越障礙。
象或相的行棋思路如圖1-3所示:
分析描述:對(duì)于象的活動(dòng)范圍,通過(guò)if(endJ<=5)語(yǔ)句就可限定,如果滿足則可以走棋,不滿足則不能走棋,這就限定了象不能越過(guò)河界到對(duì)方盤(pán)面去。對(duì)于相的活動(dòng)范圍,通過(guò)if(endJ>=6)語(yǔ)句限定,原理同上。
行棋規(guī)則比較特殊,它是沿對(duì)角線方向移動(dòng)兩點(diǎn),另外,在移動(dòng)的過(guò)程中不能夠穿越障礙。就圖1-3所示,象要走到(x3,y3)這一點(diǎn)上的前提條件是(x2,y2)這個(gè)田字格的中心,也就是“象眼”的位置沒(méi)有棋子,對(duì)于這一點(diǎn)的坐標(biāo),我們要定義兩個(gè)變量centerI=(startI+endI)/2和centerJ=(startJ+endJ)/2,這樣當(dāng)我們行棋時(shí),就可以用if(point[centerI][centerJ].isPiece())這條語(yǔ)句判斷“象眼”位置是否有棋子,如果有則返回false,無(wú)則返回true。對(duì)于沿對(duì)角線方向移動(dòng)兩點(diǎn)的實(shí)現(xiàn),則通過(guò)if(xAxle==2&&yAxle==2)語(yǔ)句來(lái)限定,他們的坐標(biāo)差絕對(duì)值只有滿足上面語(yǔ)句這種情況才可以行棋。
馬:任何位置。每一步只可以水平或垂直移動(dòng)一點(diǎn),再按對(duì)角線方面向左或者右移動(dòng)。另移動(dòng)的過(guò)程中不能夠穿越障礙。
馬的行棋思路如圖1-4,1-5所示,有兩種形式:
分析描述:行棋規(guī)則比較特殊,每一步只可以水平或垂直移動(dòng)一點(diǎn),再按對(duì)角線方面向左或者右移動(dòng)。另外移動(dòng)的過(guò)程中不能夠穿越障礙。
就圖1-4所示,這種跳躍形式屬于if(xAxle==2&&yAxle==1)這一情況,馬可以走到(x1,y1)(x5,y1)(x1,y3)(x5,y3)這四個(gè)點(diǎn)上的前提條件是(x2,y2)(x4,y2)這兩個(gè)點(diǎn)上,也就是“馬腿”的位置沒(méi)有棋子。
對(duì)于棋子向右側(cè)跳的情況,即滿足if(endI>startI)時(shí),我們判斷“馬腿”位置的棋子通過(guò)if(point[startI+1][startJ].isPiece())語(yǔ)句來(lái)判斷;對(duì)于棋子向左側(cè)跳的情況,即滿足if(endI 車:任何位置。可以水平或垂直方向移動(dòng)任意個(gè)無(wú)阻礙的點(diǎn)。 車的行棋思路如圖1-6所示: 分析描述:可以水平或垂直方向移動(dòng)任意個(gè)無(wú)阻礙的點(diǎn)。就圖1-6所示,對(duì)于車縱向行棋情況,即if(startI==endI),先賦j=0,通過(guò)對(duì)車初始位置和中止位置之間進(jìn)行掃描,通過(guò)if(point[startI][j].isPiece())這條語(yǔ)句判斷有無(wú)阻礙的棋子。對(duì)于車橫向行棋情況,即if(startJ==endJ),先賦i=0,通過(guò)對(duì)車初始位置和中止位置之間進(jìn)行掃描,通過(guò)if(point[i][startJ].isPiece())這條語(yǔ)句判斷有無(wú)阻礙的棋子。 炮:任何位置。移動(dòng)起來(lái)和車很相似,但它必須跳過(guò)一個(gè)棋子來(lái)吃掉對(duì)方的一個(gè)棋子。 炮的行棋思路如圖1-7所示: 分析描述:移動(dòng)起來(lái)和車很相似,但它必須跳過(guò)一個(gè)棋子來(lái)吃掉對(duì)方的一個(gè)棋子。就圖1-7所示,對(duì)于炮縱向行棋情況,即if(startI==endI),我們?yōu)榱伺袛嘈衅迓肪€上是否有棋子,引入一個(gè)變量number,然后賦j=0,通過(guò)對(duì)炮初始位置和中止位置之間進(jìn)行掃描,通過(guò)if(point[startI][j].isPiece())這條語(yǔ)句判斷有無(wú)阻礙的棋子,如果有棋子,則number++,這樣number這個(gè)變量就相當(dāng)于一個(gè)計(jì)數(shù)器,對(duì)炮初始位置和中止位置之間棋子的數(shù)量進(jìn)行統(tǒng)計(jì)。if(number>1),則表示初始位置和中止位置之間多于1個(gè)棋子,返回值false,不能走棋;if(number==1),則表示初始位置和中止位置之間有1個(gè)棋子,且if(point[endI][endJ].isPiece()),表示中止位置上有對(duì)方棋子,則可以走棋吃子;if(number==0&&!point[endI][endJ].isPiece()),表示初始位置和中止位置之間沒(méi)有棋子,則可以行棋。對(duì)于炮橫向行棋情況,原理同上。 本論文主要研究基于Java技術(shù)象棋游戲的分析與設(shè)計(jì),對(duì)java 在中國(guó)象棋游戲編程中的方法和思想進(jìn)行了深刻的分析,對(duì)中國(guó)象棋特殊的走棋規(guī)則給予了細(xì)致理解,充分體現(xiàn)了在中國(guó)象棋游戲中java的優(yōu)勢(shì)。 參考文獻(xiàn): [1]耿祥義編著.《JAVA 課程設(shè)計(jì)》.清華大學(xué)出版社. [2]王克宏編著.《Java技術(shù)教程(基礎(chǔ)篇)》.2002年4月第一版.清華大學(xué)出版社. [3]孫鑫編著. 《Java Web開(kāi)發(fā)詳解》. 2006年4月第一版. 電子工業(yè)出版社. [4]朱戰(zhàn)立,沈偉編著. 《Java程序設(shè)計(jì)實(shí)用教程》. 電子工業(yè)出版社. [5]《Java Web開(kāi)發(fā)詳解》光盤(pán)視頻教程 [6]Thomas Petche編著.《Java游戲編程》.清華大學(xué)出版社. [7]王小春編著.《PC游戲編程》.重慶大學(xué)出版社. [8]中文Java技術(shù)網(wǎng) http://www.cn-java.com/ [9]Sun中國(guó)技術(shù)社區(qū)http://developers.sun.com.cn/home/sdnchina/home [10]Java高級(jí)編程專區(qū) http://dev.yesky.com/javagaoji/