中國象棋java源碼
《中國象棋java源碼》由會(huì)員分享,可在線閱讀,更多相關(guān)《中國象棋java源碼(59頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、 東北大學(xué)秦?皇島分校 信息與計(jì)算?科學(xué)系 Java程?序設(shè)計(jì)實(shí)驗(yàn)?報(bào)告 專業(yè)名稱 信息與計(jì)算?科學(xué) 班級(jí)學(xué)號(hào) 70802?06 學(xué)生姓名 彭 軍 指導(dǎo)教師 王薇 完成時(shí)間 2011.04.15 一、設(shè)計(jì)題目 中國象棋。 2、 設(shè)計(jì)說明 2.1 引言 象棋水平的?發(fā)展是需要?靠信息技術(shù)?來推動(dòng)的,國際象棋有?兩個(gè)很好的?范例,一個(gè)是象棋?棋譜編輯和?對(duì)弈程序的?公共平臺(tái)——WinBo?ard平臺(tái)?,另一個(gè)是商?業(yè)的國際象?棋數(shù)據(jù)庫和?對(duì)弈軟件——Chess?Base,他們?yōu)閲H?象棋愛好者?和研究者
2、提?供了極大的?便利。國際象棋軟?件有著成功?的商業(yè)運(yùn)作?,已發(fā)展成一?種產(chǎn)業(yè)。然而,電腦在中國?象棋上的運(yùn)?用還剛剛起?步,盡管國內(nèi)涌?現(xiàn)出一大批?中國象棋的?專業(yè)網(wǎng)站和?專業(yè)軟件,但是由于缺?乏必要的基?礎(chǔ)工作,電腦技術(shù)在?中國象棋上?的應(yīng)用優(yōu)勢(shì)?還無法體現(xiàn)?出來。 在設(shè)計(jì)中國?象棋軟件過?程中,國際象棋軟?件有很多值?得借鑒的成?功經(jīng)驗(yàn)和優(yōu)?秀的思想。例如B. Morel?and,微軟(Micro?soft)的程序設(shè)計(jì)?師,業(yè)余從事國?際象棋引擎?Ferre?t的開發(fā),他的一系列?關(guān)于國際象?棋程序設(shè)計(jì)?的文章非常?值得其他棋?類程序設(shè)計(jì)?人員借鑒。然而,中國象棋與?國際象棋存?在著很
3、大的?差異,因此國際象?棋的某些成?熟技術(shù),無法直接應(yīng)?用于中國象?棋,需要對(duì)其加?以改進(jìn)和創(chuàng)?新。 本文針對(duì)中?國象棋程序?設(shè)計(jì)的一系?列問題,總結(jié)出一些?搜索引擎的?設(shè)計(jì)方法,并給出ja?va語言的?實(shí)現(xiàn) 2.2程序的設(shè)?計(jì)及實(shí)現(xiàn) 本系統(tǒng)主要?有以下4個(gè)?模塊,每個(gè)模塊對(duì)?應(yīng)一個(gè)程序?包: 1、engin?e:搜索引擎包?,系統(tǒng)的核心?部分。 2、messa?ge:網(wǎng)絡(luò)對(duì)戰(zhàn)過?程中各種消?息及其傳遞?機(jī)制的類實(shí)?現(xiàn)包。 3、main:主界面實(shí)現(xiàn)?包。 4、piece?s:棋子及其相?關(guān)類實(shí)現(xiàn)包?。 現(xiàn)就各個(gè)包?中的要點(diǎn)給?與說明。 2.2.1 搜索引擎的?實(shí)現(xiàn)(engin
4、?e包) (1) BitBo?ard.java:位棋盤的實(shí)?現(xiàn),見2.4節(jié)。 (2) CCEva?lue.java:評(píng)價(jià)函數(shù)知?識(shí)類。 本程序使用?開源軟件“夢(mèng)入神蛋”的快速評(píng)價(jià)?函數(shù)。該函數(shù)包含?子力價(jià)值和?棋子所在位?置的獎(jiǎng)勵(lì)值?。子力價(jià)值分?別是:帥-0, 仕- 40, 象-40, 馬-88, 車-200, 炮-96, 兵-9。帥是無價(jià)的?,用0表示。以馬為例,位置的獎(jiǎng)勵(lì)?值如下: 0, -3, 5, 4, 2, 2, 5, 4, 2, 2, -3, 2, 4, 6,10,12,20,10, 8, 2, 2, 4, 6,10,13,11,12,11,15, 2, 0,
5、5, 7, 7,14,15,19,15, 9, 8, 2,-10, 4,10,15,16,12,11, 6, 2, 0, 5, 7, 7,14,15,19,15, 9, 8, 2, 4, 6,10,13,11,12,11,15, 2, -3, 2, 4, 6,10,12,20,10, 8, 2, 0, -3, 5, 4, 2, 2, 5, 4, 2, 2 上面的每行?代表棋盤的?一條縱線。其中,-10所在的?位置是“窩心馬”,所以要罰1?0分。 (3) Chess?Posit?ion.java:動(dòng)態(tài)局面類? 包含對(duì)局過?程中的動(dòng)態(tài)?信息,主要實(shí)現(xiàn)的?是2.4節(jié)的各類?位
6、棋盤和移?子函數(shù)。 (4) MoveS?truct?.java:著法表示類?。 (5) PreMo?ve.java:偽合法著法?生成模塊,見4.1。 (6) MoveS?ortSt?ruct.java:合法著法的?生成及其排?序算法,見4.2。 (7) Searc?hMove?.java:搜索算法,實(shí)現(xiàn)如下功?能: 1)主置換表及?開局庫 2)Alpha?-Beta搜?索算法 3)針對(duì)吃子著?法的靜態(tài)搜?索算法 4)適應(yīng)性空著?裁剪算法:見5.5.2,根據(jù)不同情?況來調(diào)整R?值的做法,稱為“適應(yīng)性空著?裁剪”(Adapt?ive Null-Move Pruni?ng),它首先由
7、E?rnst Heinz?發(fā)表在19?99年的I?CCA雜志?上。其內(nèi)容可以?概括為: a. 深度小于或?等于6時(shí),用R = 2的空著裁?剪進(jìn)行搜索? b. 深度大于8?時(shí),用R = 3; c. 深度是6或?7時(shí),如果每方棋?子都大于或?等于3個(gè),則用 R = 3,否則用 R = 2。 5)帶時(shí)間控制?的迭代加深?搜索算法:每次加深搜?索都判斷時(shí)?間是否夠用?。 6)“將軍”擴(kuò)展(加深)搜索算法:當(dāng)搜索到己?方被“將”時(shí),增加搜索的?深度。 7)主要變例搜?索算法 2.2.2 信息傳輸機(jī)?制(messa?ge包) 在對(duì)弈過程?中(主要是網(wǎng)絡(luò)?對(duì)弈)需要在對(duì)弈?雙方之間傳?輸各
8、類信息?,抽象為各類?消息。如時(shí)間規(guī)則?的協(xié)定、各方的走子?信息等。每方都有消?息接收、消息處理和?消息發(fā)送程?序(Outer?MsgRe?ceive?r、Local?MsgRe?ceive?r,QzMes?sageH?andle?r,Messa?geSen?der)。己方的Me?ssage?Sende?r與對(duì)方的?Outer?MsgRe?ceive?r通過接口?SrCon?necti?on連接。所有接收的?消息放入消?息隊(duì)列Qz?MsgQu?eue中,等待消息處?理進(jìn)程Qz?Messa?geHan?dler來?處理。所有的消息?都封裝在Q?zMess?age類對(duì)?象中,消息的類型?通過消息的
9、?Heade?r類型(以靜態(tài)常量?存放在Ms?gHead?er類中)來區(qū)分。 2.2.3 棋子(piece?s包) Qizi.java包?含棋子的信?息,如棋子的(在棋盤上的?)位置、圖片、名稱、類型、狀態(tài)等。Piece?sFact?ory.java以?“工廠”模式提供根?據(jù)棋子類型?或其他信息?生成相關(guān)Q?izi對(duì)象?的方法。 2.2.4 主控模塊(main包?) 實(shí)現(xiàn)了程序?界面與消息?傳遞、搜索引擎的?集成。 (1) NewBo?ard.java:棋盤坐標(biāo)系?統(tǒng)及其界面?的實(shí)現(xiàn)。 (2) CChes?sApp.java:主界面類,以內(nèi)部類實(shí)?現(xiàn)了QzM?essag?eHand
10、?ler接口?、計(jì)時(shí)規(guī)則T?imeRu?le接口以?及事件的處?理程序,根據(jù)需要生?成其他的并?發(fā)線程如消?息接收、處理和發(fā)送?,機(jī)器思考(啟動(dòng)搜索引?擎),計(jì)時(shí)顯示等?。 (3) SetRu?leDia?log.java:設(shè)置規(guī)則的?對(duì)話框。 (4) SetSy?sInfo?Dialo?g.java:設(shè)置系統(tǒng)的?一些屬性如?對(duì)戰(zhàn)模式、連接端口等?。 (5) Trans?latio?n.java:提供了一系?列實(shí)用方法?主要有: 1)FEN串與?局面Che?ssPos?ition?對(duì)象之間的?轉(zhuǎn)換 2)不同著法表?示(見第一章)之間的轉(zhuǎn)換?。如“炮二平五”與“Ch2-e2”及“62.
11、5或C2.5“(C和6代表?炮)這幾種表示?法之間的轉(zhuǎn)?換 3)棋譜文件的?讀入和存儲(chǔ)?。 4)開局庫的生?成:將近年實(shí)戰(zhàn)?的棋譜文件?(可能有幾種?格式)整理生成開?局庫。 3、 程序代碼: impor?t java.awt.*; impor?t java.awt.event?.*; impor?t javax?.swing?.*; impor?t java.util.*; impor?t java.io.*; publi?c class? Chess?{ publi?c stati?c void main(Strin?g args[]){ new Che
12、ss?MainF?rame("中國象棋:觀棋不語真?君子,棋死無悔大?丈夫"); } } class? Chess?MainF?rame exten?ds JFram?e imple?ments? Actio?nList?ener,Mouse?Liste?ner,Runna?ble{ //玩家 JLabe?l play[] = new JLabe?l[32]; //棋盤 JLabe?l image?; //窗格 Conta?iner con; //工具欄 JTool?Bar jmain?; //重新開始 JButt?on anew;
13、//悔棋 JButt?on repen?t; //退出 JButt?on exit; //當(dāng)前信息 JLabe?l text; //保存當(dāng)前操?作 Vecto?r Var; //規(guī)則類對(duì)象?(使于調(diào)用方?法) Chess?Rule rule; /** ** 單擊棋子 ** chess?ManCl?ick = true 閃爍棋子 并給線程響?應(yīng) ** chess?ManCl?ick = false? 吃棋子 停止閃爍 并給線程響?應(yīng) */ boole?an chess?ManCl?ick; /** **
14、 控制玩家走?棋 ** chess?PlayC?lick=1 黑棋走棋 ** chess?PlayC?lick=2 紅棋走棋 默認(rèn)紅棋 ** chess?PlayC?lick=3 雙方都不能?走棋 */ int chess?PlayC?lick=2; //控制棋子閃?爍的線程 Threa?d tmain?; //把第一次的?單擊棋子給?線程響應(yīng) stati?c int Man,i; Chess?MainF?rame(){ new Chess?MainF?rame("中國象棋"); } /** ** 構(gòu)造函數(shù) **
15、初始化圖形?用戶界面 */ Chess?MainF?rame(Strin?g Title?){ //獲行客格引?用 con = this.getCo?ntent?Pane(); con.setLa?yout(null); //實(shí)例化規(guī)則?類 rule = new Chess?Rule(); Var = new Vecto?r(); //創(chuàng)建工具欄? jmain? = new JTool?Bar(); text = new JLabe?l("歡迎使用象?棋對(duì)弈系統(tǒng)?"); //當(dāng)鼠標(biāo)放上?顯示信息 text.set
16、To?olTip?Text("信息提示"); anew = new JButt?on(" 新 游 戲 "); anew.setTo?olTip?Text("重新開始新?的一局"); exit = new JButt?on(" 退 出 "); exit.setTo?olTip?Text("退出象棋程?序程序"); repen?t = new JButt?on(" 悔 棋 "); repen?t.setTo?olTip?Text("返回到上次?走棋的位置?"); //把組件添加?到工具欄 jmain?.setLa?yout(new GridL
17、?ayout?(0,4)); jmain?.add(anew); jmain?.add(repen?t); jmain?.add(exit); jmain?.add(text); jmain?.setBo?unds(0,0,558,30); con.add(jmain?); //添加棋子標(biāo)?簽 drawC?hessM?an(); //注冊(cè)按扭監(jiān)?聽 anew.addAc?tionL?isten?er(this); repen?t.addAc?tionL?isten?er(this); exit.addAc?ti
18、onL?isten?er(this); //注冊(cè)棋子移?動(dòng)監(jiān)聽 for (int i=0;i<32;i++){ con.add(play[i]); play[i].addMo?useLi?stene?r(this); } //添加棋盤標(biāo)?簽 con.add(image? = new JLabe?l(new Image?Icon("image?\\Main.GIF"))); image?.setBo?unds(0,30,558,620); image?.addMo?useLi?stene?r(this);
19、 //注冊(cè)窗體關(guān)?閉監(jiān)聽 this.addWi?ndowL?isten?er( new Windo?wAdap?ter() { publi?c void windo?wClos?ing(Windo?wEven?t we){ Syste?m.exit(0); } } ); //窗體居中 Dimen?sion scree?nSize? = Toolk?it.getDe?fault?Toolk?it().getSc?reenS?ize(); Dimen?sion frame?Size = this.getSi?
20、ze(); if (frame?Size.heigh?t > scree?nSize?.heigh?t){ frame?Size.heigh?t = scree?nSize?.heigh?t; } if (frame?Size.width? > scree?nSize?.width?){ frame?Size.width? = scree?nSize?.width?; } this.setLo?catio?n((scree?nSize?.width? - frame?Size.width?) / 2 - 280 ,(scree?nS
21、ize?.heigh?t - frame?Size.heigh?t ) / 2 - 350); //設(shè)置 this.setIc?onIma?ge(new Image?Icon("image?\\紅將.GIF").getIm?age()); this.setRe?sizab?le(false?); this.setTi?tle(Title?); this.setSi?ze(558,670); this.show(); } /** ** 添加棋子方?法 */ publi?c void drawC?hessM?an(){ //
22、流程控制 int i,k; //圖標(biāo) Icon in; //黑色棋子 //車 in = new Image?Icon("image?\\黑車.GIF"); for (i=0,k=24;i<2;i++,k+=456){ play[i] = new JLabe?l(in); play[i].setBo?unds(k,56,55,55); play[i].setNa?me("車1"); } //馬 in = new Image?Icon("image?\\黑馬.GIF");
23、 for (i=4,k=81;i<6;i++,k+=342){ play[i] = new JLabe?l(in); play[i].setBo?unds(k,56,55,55); play[i].setNa?me("馬1"); } //相 in = new Image?Icon("image?\\黑象.GIF"); for (i=8,k=138;i<10;i++,k+=228){ play[i] = new JLabe?l(in); play[i].setBo?unds(k,56,55,55); play
24、[i].setNa?me("象1"); } //士 in = new Image?Icon("image?\\黑士.GIF"); for (i=12,k=195;i<14;i++,k+=114){ play[i] = new JLabe?l(in); play[i].setBo?unds(k,56,55,55); play[i].setNa?me("士1"); } //卒 in = new Image?Icon("image?\\黑卒.GIF"); for (i=16,k=24;i<21;i++,k+=11
25、4){ play[i] = new JLabe?l(in); play[i].setBo?unds(k,227,55,55); play[i].setNa?me("卒1" + i); } //炮 in = new Image?Icon("image?\\黑炮.GIF"); for (i=26,k=81;i<28;i++,k+=342){ play[i] = new JLabe?l(in); play[i].setBo?unds(k,170,55,55); play[i].setNa?me("炮1" + i);
26、 } //將 in = new Image?Icon("image?\\黑將.GIF"); play[30] = new JLabe?l(in); play[30].setBo?unds(252,56,55,55); play[30].setNa?me("將1"); //紅色棋子 //車 in = new Image?Icon("image?\\紅車.GIF"); for (i=2,k=24;i<4;i++,k+=456){ play[i] = new JLabe?l(in); play[i].setBo?
27、unds(k,569,55,55); play[i].setNa?me("車2"); } //馬 in = new Image?Icon("image?\\紅馬.GIF"); for (i=6,k=81;i<8;i++,k+=342){ play[i] = new JLabe?l(in); play[i].setBo?unds(k,569,55,55); play[i].setNa?me("馬2"); } //相 in = new Image?Icon("image?\\紅象.GIF"); f
28、or (i=10,k=138;i<12;i++,k+=228){ play[i] = new JLabe?l(in); play[i].setBo?unds(k,569,55,55); play[i].setNa?me("象2"); } //士 in = new Image?Icon("image?\\紅士.GIF"); for (i=14,k=195;i<16;i++,k+=114){ play[i] = new JLabe?l(in); play[i].setBo?unds(k,569,55,55); play
29、[i].setNa?me("士2"); } //兵 in = new Image?Icon("image?\\紅卒.GIF"); for (i=21,k=24;i<26;i++,k+=114){ play[i] = new JLabe?l(in); play[i].setBo?unds(k,398,55,55); play[i].setNa?me("卒2" + i); } //炮 in = new Image?Icon("image?\\紅炮.GIF"); for (i=28,k=81;i<30;i++,k
30、+=342){ play[i] = new JLabe?l(in); play[i].setBo?unds(k,455,55,55); play[i].setNa?me("炮2" + i); } //帥 in = new Image?Icon("image?\\紅將.GIF"); play[31] = new JLabe?l(in); play[31].setBo?unds(252,569,55,55); play[31].setNa?me("帥2"); } /** ** 線程方法控?制棋子閃爍?
31、 */ publi?c void run(){ while? (true){ //單擊棋子第?一下開始閃?爍 if (chess?ManCl?ick){ play[Man].setVi?sible?(false?); //時(shí)間控制 try{ tmain?.sleep?(200); } catch?(Excep?tion e){ } play[Man].setVi?sible?(true); } //閃爍當(dāng)前提?示信息 以免用戶看?不見
32、else { text.setVi?sible?(false?); //時(shí)間控制 try{ tmain?.sleep?(250); } catch?(Excep?tion e){ } text.setVi?sible?(true); } try{ tmain?.sleep?(350); } catch? (Excep?tion e){ } } } /** ** 單擊棋子方?法 */ publi?c
33、void mouse?Click?ed(Mouse?Event? me){ Syste?m.out.print?ln("Mouse?"); //當(dāng)前坐標(biāo) int Ex=0,Ey=0; //啟動(dòng)線程 if (tmain? == null){ tmain? = new Threa?d(this); tmain?.start?(); } //單擊棋盤(移動(dòng)棋子) if (me.getSo?urce().equal?s(image?)){ //該紅棋走棋?的時(shí)候 if (chess?PlayC?li
34、ck == 2 && play[Man].getNa?me().charA?t(1) == 2){ Ex = play[Man].getX(); Ey = play[Man].getY(); //移動(dòng)卒、兵 if (Man > 15 && Man < 26){ rule.armsR?ule(Man,play[Man],me); } //移動(dòng)炮 else if (Man > 25 && Man < 30){ rule.canno?nRule?(play[Man],play,me
35、); } //移動(dòng)車 else if (Man >=0 && Man < 4){ rule.canno?nRule?(play[Man],play,me); } //移動(dòng)馬 else if (Man > 3 && Man < 8){ rule.horse?Rule(play[Man],play,me); } //移動(dòng)相、象 else if (Man > 7 && Man < 12){ rule.eleph?antRu?le(Man,p
36、lay[Man],play,me); } //移動(dòng)仕、士 else if (Man > 11 && Man < 16){ rule.chapR?ule(Man,play[Man],play,me); } //移動(dòng)將、帥 else if (Man == 30 || Man == 31){ rule.willR?ule(Man,play[Man],play,me); } //是否走棋錯(cuò)?誤(是否在原地?沒有動(dòng)) if (Ex == play[
37、Man].getX() && Ey == play[Man].getY()){ text.setTe?xt(" 紅棋走棋"); chess?PlayC?lick=2; } else { text.setTe?xt(" 黑棋走棋"); chess?PlayC?lick=1; } }//if //該黑棋走棋?的時(shí)候 else if (chess?PlayC?lick == 1 && play[Man].get
38、Na?me().charA?t(1) == 1){ Ex = play[Man].getX(); Ey = play[Man].getY(); //移動(dòng)卒、兵 if (Man > 15 && Man < 26){ rule.armsR?ule(Man,play[Man],me); } //移動(dòng)炮 else if (Man > 25 && Man < 30){ rule.canno?nRule?(play[Man],play,me); } //移動(dòng)車
39、 else if (Man >=0 && Man < 4){ rule.canno?nRule?(play[Man],play,me); } //移動(dòng)馬 else if (Man > 3 && Man < 8){ rule.horse?Rule(play[Man],play,me); } //移動(dòng)相、象 else if (Man > 7 && Man < 12){ rule.eleph?antRu?le(Man,play[Man],play,me); }
40、 //移動(dòng)仕、士 else if (Man > 11 && Man < 16){ rule.chapR?ule(Man,play[Man],play,me); } //移動(dòng)將、帥 else if (Man == 30 || Man == 31){ rule.willR?ule(Man,play[Man],play,me); } //是否走棋錯(cuò)?誤(是否在原地?沒有動(dòng)) if (Ex == play[Man].getX() && Ey == play[Man].ge
41、tY()){ text.setTe?xt(" 黑棋走棋"); chess?PlayC?lick=1; } else { text.setTe?xt(" 紅棋走棋"); chess?PlayC?lick=2; } }//else if //當(dāng)前沒有操?作(停止閃爍) chess?ManCl?ick=false?; }//if //單擊棋子 else{
42、 //第一次單擊?棋子(閃爍棋子) if (!chess?ManCl?ick){ for (int i=0;i<32;i++){ //被單擊的棋?子 if (me.getSo?urce().equal?s(play[i])){ //告訴線程讓?該棋子閃爍? Man=i; //開始閃爍 chess?ManCl?ick=true; break?; } }//for }//if //第二次單擊?棋子(吃棋子) else if (ch
43、ess?ManCl?ick){ //當(dāng)前沒有操?作(停止閃爍) chess?ManCl?ick=false?; for (i=0;i<32;i++){ //找到被吃的?棋子 if (me.getSo?urce().equal?s(play[i])){ //該紅棋吃棋?的時(shí)候 if (chess?PlayC?lick == 2 && play[Man].getNa?me().charA?t(1) == 2){ Ex = play[Man].getX(); Ey = pla
44、y[Man].getY(); //卒、兵吃規(guī)則 if (Man > 15 && Man < 26){ rule.armsR?ule(play[Man],play[i]); } //炮吃規(guī)則 else if (Man > 25 && Man < 30){ rule.canno?nRule?(0,play[Man],play[i],play,me); } //車吃規(guī)則 else if
45、 (Man >=0 && Man < 4){ rule.canno?nRule?(1,play[Man],play[i],play,me); } //馬吃規(guī)則 else if (Man > 3 && Man < 8){ rule.horse?Rule(play[Man],play[i],play,me); } //相、象吃規(guī)則 else if (Man > 7 && Man < 12){ rule.eleph
46、?antRu?le(play[Man],play[i],play); } //士、仕吃棋規(guī)則? else if (Man > 11 && Man < 16){ rule.chapR?ule(Man,play[Man],play[i],play); } //將、帥吃棋規(guī)則? else if (Man == 30 || Man == 31){ rule.willR?ule(Man,play[Man],play[i],play);
47、 play[Man].setVi?sible?(true); } //是否走棋錯(cuò)?誤(是否在原地?沒有動(dòng)) if (Ex == play[Man].getX() && Ey == play[Man].getY()){ text.setTe?xt(" 紅棋走棋"); chess?PlayC?lick=2; break?; } else{ text.set
48、Te?xt(" 黑棋走棋"); chess?PlayC?lick=1; break?; } }//if //該黑棋吃棋?的時(shí)候 else if (chess?PlayC?lick == 1 && play[Man].getNa?me().charA?t(1) == 1){ Ex = play[Man].getX(); Ey = play[Man].getY();
49、 //卒吃規(guī)則 if (Man > 15 && Man < 26){ rule.armsR?ule(play[Man],play[i]); } //炮吃規(guī)則 else if (Man > 25 && Man < 30){ rule.canno?nRule?(0,play[Man],play[i],play,me); } //車吃規(guī)則 else if (Man >=0 && Man < 4){ r
50、ule.canno?nRule?(1,play[Man],play[i],play,me); } //馬吃規(guī)則 else if (Man > 3 && Man < 8){ rule.horse?Rule(play[Man],play[i],play,me); } //相、象吃規(guī)則 else if (Man > 7 && Man < 12){ rule.eleph?antRu?le(play[Man],play[i],play)
51、; } //士、仕吃棋規(guī)則? else if (Man > 11 && Man < 16){ rule.chapR?ule(Man,play[Man],play[i],play); } //將、帥吃棋規(guī)則? else if (Man == 30 || Man == 31){ rule.willR?ule(Man,play[Man],play[i],play); play[Man].setVi?sible?(tr
52、ue); } //是否走棋錯(cuò)?誤(是否在原地?沒有動(dòng)) if (Ex == play[Man].getX() && Ey == play[Man].getY()){ text.setTe?xt(" 黑棋走棋"); chess?PlayC?lick=1; break?; } else { text.setTe?xt(" 紅棋走棋"); c
53、hess?PlayC?lick=2; break?; } }//else if }//if }//for //是否勝利 if (!play[31].isVis?ible()){ JOpti?onPan?e.showC?onfir?mDial?og( this,"黑棋勝利","玩家一勝利?", JOpti?onPan?e.DEFAU?LT_OP?TION,JOpti?onPan?
54、e.WARNI?NG_ME?SSAGE?); //雙方都不可?以在走棋了? chess?PlayC?lick=3; text.setTe?xt(" 黑棋勝利"); }//if else if (!play[30].isVis?ible()){ JOpti?onPan?e.showC?onfir?mDial?og( this,"紅棋勝利","玩家二勝利?", JOpti?onPan?e.DEFAU?LT_OP?TION,JOpti?onPan?e.WARNI?NG_ME?SSAG
55、E?); chess?PlayC?lick=3; text.setTe?xt(" 紅棋勝利"); }//else if }//else }//else } publi?c void mouse?Press?ed(Mouse?Event? me){ } publi?c void mouse?Relea?sed(Mouse?Event? me){ } publi?c void mouse?Enter?ed(Mouse?Event? me){ } publi?c void mous
56、e?Exite?d(Mouse?Event? me){ } /** ** 定義按鈕的?事件響應(yīng) */ publi?c void actio?nPerf?ormed?(Actio?nEven?t ae) { //重新開始按?鈕 if (ae.getSo?urce().equal?s(anew)){ int i,k; //重新排列每?個(gè)棋子的位?置 //黑色棋子 //車 for (i=0,k=24;i<2;i++,k+=456){ play[i].setBo?unds(k,56,55,55);
57、 } //馬 for (i=4,k=81;i<6;i++,k+=342){ play[i].setBo?unds(k,56,55,55); } //相 for (i=8,k=138;i<10;i++,k+=228){ play[i].setBo?unds(k,56,55,55); } //士 for (i=12,k=195;i<14;i++,k+=114){ play[i].setBo?unds(k,56,55,55); } //卒
58、 for (i=16,k=24;i<21;i++,k+=114){ play[i].setBo?unds(k,227,55,55); } //炮 for (i=26,k=81;i<28;i++,k+=342){ play[i].setBo?unds(k,170,55,55); } //將 play[30].setBo?unds(252,56,55,55); //紅色棋子 //車 for (i=2,k=24;i<4;i++,k+=456){ play[i].setBo
59、?unds(k,569,55,55); } //馬 for (i=6,k=81;i<8;i++,k+=342){ play[i].setBo?unds(k,569,55,55); } //相 for (i=10,k=138;i<12;i++,k+=228){ play[i].setBo?unds(k,569,55,55); } //士 for (i=14,k=195;i<16;i++,k+=114){ play[i].setBo?unds(k,569,55,55)
60、; } //兵 for (i=21,k=24;i<26;i++,k+=114){ play[i].setBo?unds(k,398,55,55); } //炮 for (i=28,k=81;i<30;i++,k+=342){ play[i].setBo?unds(k,455,55,55); } //帥 play[31].setBo?unds(252,569,55,55); chess?PlayC?lick = 2; text.setTe?xt("
61、 紅棋走棋"); for (i=0;i<32;i++){ play[i].setVi?sible?(true); } //清除Vec?tor中的?內(nèi)容 Var.clear?(); } //悔棋按鈕 else if (ae.getSo?urce().equal?s(repen?t)){ try{ //獲得set?Visib?le屬性值? Strin?g S = (Strin?g)Var.get(Var.size()-4); //獲得X坐標(biāo)?
62、 int x = Integ?er.parse?Int((Strin?g)Var.get(Var.size()-3)); //獲得Y坐標(biāo)? int y = Integ?er.parse?Int((Strin?g)Var.get(Var.size()-2)); //獲得索引 int M = Integ?er.parse?Int((Strin?g)Var.get(Var.size()-1)); //賦給棋子 play[M].setVi?sible?(true); play[M].setBo?unds(x
63、,y,55,55); if (play[M].getNa?me().charA?t(1) == 1){ text.setTe?xt(" 黑棋走棋"); chess?PlayC?lick = 1; } else{ text.setTe?xt(" 紅棋走棋"); chess?PlayC?lick = 2; } //刪除用過的?坐標(biāo) Var.remov?e(Var.size()-4); Var.remo
64、v?e(Var.size()-3); Var.remov?e(Var.size()-2); Var.remov?e(Var.size()-1); //停止旗子閃?爍 chess?ManCl?ick=false?; } catch?(Excep?tion e){ } } //退出 else if (ae.getSo?urce().equal?s(exit)){ int j=JOpti?onPan?e.showC?onfir?mDial?og( this,"真的要退出?嗎
65、?","退出", JOpti?onPan?e.YES_O?PTION?,JOpti?onPan?e.QUEST?ION_M?ESSAG?E); if (j == JOpti?onPan?e.YES_O?PTION?){ Syste?m.exit(0); } } } /*定義中國象?棋規(guī)則的類?*/ class? Chess?Rule { /**卒子的移動(dòng)?規(guī)則*/ publi?c void armsR?ule(int Man,JLabe?l play,Mouse?Event? me){ //黑卒向下
66、 if (Man < 21){ //向下移動(dòng)、得到終點(diǎn)的?坐標(biāo)模糊成?合法的坐標(biāo)? if ((me.getY()-play.getY()) > 27 && (me.getY()-play.getY()) < 86 && (me.getX()-play.getX()) < 55 && (me.getX()-play.getX()) > 0){ //當(dāng)前記錄添?加到集合(用于悔棋) Var.add(Strin?g.value?Of(play.isVis?ible())); Var.add(Strin?g.value?Of(play.getX())); Var.add(Strin?g.value?Of(play.getY())); Var.add(Strin?g.value?Of(Man)); play.setBo?unds(play.getX(),play.getY()+57,55,55); } //向右移動(dòng)、得到終點(diǎn)的
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運(yùn)動(dòng)會(huì)安全工作預(yù)案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個(gè)人工作總結(jié)(可編輯)
- 2024年xx村兩委涉案資金退還保證書
- 2024年憲法宣傳周活動(dòng)總結(jié)+在機(jī)關(guān)“弘揚(yáng)憲法精神推動(dòng)發(fā)改工作高質(zhì)量發(fā)展”專題宣講報(bào)告會(huì)上的講話
- 2024年XX村合作社年報(bào)總結(jié)
- 2024-2025年秋季第一學(xué)期初中歷史上冊(cè)教研組工作總結(jié)
- 2024年小學(xué)高級(jí)教師年終工作總結(jié)匯報(bào)
- 2024-2025年秋季第一學(xué)期初中物理上冊(cè)教研組工作總結(jié)
- 2024年xx鎮(zhèn)交通年度總結(jié)
- 2024-2025年秋季第一學(xué)期小學(xué)語文教師工作總結(jié)
- 2024年XX村陳規(guī)陋習(xí)整治報(bào)告
- 2025年學(xué)校元旦迎新盛典活動(dòng)策劃方案
- 2024年學(xué)校周邊安全隱患自查報(bào)告
- 2024年XX鎮(zhèn)農(nóng)村規(guī)劃管控述職報(bào)告