中國(guó)象棋對(duì)弈系統(tǒng)--Java課程設(shè)計(jì)資料(共77頁(yè))_第1頁(yè)
中國(guó)象棋對(duì)弈系統(tǒng)--Java課程設(shè)計(jì)資料(共77頁(yè))_第2頁(yè)
中國(guó)象棋對(duì)弈系統(tǒng)--Java課程設(shè)計(jì)資料(共77頁(yè))_第3頁(yè)
中國(guó)象棋對(duì)弈系統(tǒng)--Java課程設(shè)計(jì)資料(共77頁(yè))_第4頁(yè)
中國(guó)象棋對(duì)弈系統(tǒng)--Java課程設(shè)計(jì)資料(共77頁(yè))_第5頁(yè)
已閱讀5頁(yè),還剩80頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、PAGE 面向?qū)ο蟪绦蛟O(shè)計(jì)(chn x sh j)課程設(shè)計(jì)報(bào)告(bogo)題 目: 中國(guó)象棋(zhn u xin q)對(duì)弈軟件設(shè)計(jì)與實(shí)現(xiàn) 院 (系): 信息科學(xué)與工程學(xué)院 專業(yè)班級(jí): 計(jì)算機(jī)科學(xué)與技術(shù)1201班 學(xué)生姓名: 程偉 學(xué) 號(hào): 20121183011 指導(dǎo)教師: 吳奕 20 14 年 12 月 29 日至20 15 年 1 月 9日華中科技大學(xué)武昌分校制 面向?qū)ο蟪绦蛟O(shè)計(jì) 課程設(shè)計(jì)任務(wù)書一、設(shè)計(jì)(調(diào)查報(bào)告/論文)題目中國(guó)象棋對(duì)弈軟件設(shè)計(jì)與實(shí)現(xiàn)二、設(shè)計(jì)(調(diào)查報(bào)告/論文)主要內(nèi)容內(nèi)容:利用Java實(shí)現(xiàn)一個(gè)中國(guó)象棋對(duì)弈的軟件,實(shí)現(xiàn)中國(guó)象棋的規(guī)則。中國(guó)象棋的棋盤是方形的,棋盤的中間有一條“

2、界河”,把對(duì)壘的雙方隔在兩邊。兩邊畫有交叉線的交叉點(diǎn)共有90個(gè),棋子就擺在這些交叉點(diǎn)上。中國(guó)象棋共有32枚棋子,分為黑紅兩組,下棋的雙方各用一組,每組各有一帥(將)兩士?jī)上鄡神R兩車兩炮五兵。兩人對(duì)局時(shí),按照規(guī)定的位置將各自的棋子擺好,紅方先走,然后輪流下子。各種棋子走法不同,最后把對(duì)方將死為勝,不分勝負(fù)則為和棋。系統(tǒng)使用Eclipse與JDK1.6工具,操作系統(tǒng)為WINDOWS,采用面向?qū)ο蠓椒ㄍ瓿桑傮w設(shè)計(jì)、詳細(xì)設(shè)計(jì)、編碼實(shí)現(xiàn)、測(cè)試。 基本功能與要求:1象棋對(duì)弈。首先紅方走棋,然后黑方走棋,直到一方獲勝。2.象棋規(guī)則。依據(jù)中國(guó)象棋的規(guī)則。3新游戲。任何時(shí)候都可以重新開始一盤新的對(duì)弈。4悔

3、棋。當(dāng)走錯(cuò)棋的時(shí)候可以悔棋。5 .信息提示。提示當(dāng)前信息狀態(tài)。三、原始資料1.面向?qū)ο蟪绦蛟O(shè)計(jì)課程設(shè)計(jì)指導(dǎo)書2. 耿祥義JAVA大學(xué)實(shí)用教程北京:清華大學(xué)出版社,2009四、要求的設(shè)計(jì)(調(diào)查/論文)成果1.課程設(shè)計(jì)報(bào)告2.課程設(shè)計(jì)軟件五、進(jìn)程安排布置任務(wù),查找資料、需求分析1天總體設(shè)計(jì)1天詳細(xì)設(shè)計(jì)1.5天編制源程序?qū)崿F(xiàn)3.5天測(cè)試與修改1天撰寫課設(shè)報(bào)告2天六、主要參考資料1 張廣彬. Java課程設(shè)計(jì)案例精編(第二版).北京:清華大學(xué)出版社, 2011. 2 耿祥義. Java課程設(shè)計(jì)(第二版).北京:清華大學(xué)出版社, 2008.3 耿祥義JAVA大學(xué)實(shí)用教程北京:清華大學(xué)出版社,20094

4、鄒林達(dá)陳國(guó)君 Java2程序設(shè)計(jì)基礎(chǔ)北京:清華大學(xué)出版社,20105 鄒林達(dá)Java2程序設(shè)計(jì)基礎(chǔ)實(shí)驗(yàn)指導(dǎo)北京:清華大學(xué),2010指導(dǎo)教師(簽名): 20 年 月 日目 錄 TOC o 1-3 h z u HYPERLINK l _Toc408566661 1需求(xqi)與總體設(shè)計(jì) PAGEREF _Toc408566661 h 1 HYPERLINK l _Toc408566662 1.1需求(xqi)分析 PAGEREF _Toc408566662 h 1 HYPERLINK l _Toc408566663 1.2總體設(shè)計(jì) PAGEREF _Toc408566663 h 2 HYPERL

5、INK l _Toc408566664 2詳細(xì)(xingx)設(shè)計(jì) PAGEREF _Toc408566664 h 3 HYPERLINK l _Toc408566665 2.1詳細(xì)設(shè)計(jì)思路 PAGEREF _Toc408566665 h 3 HYPERLINK l _Toc408566666 3編碼實(shí)現(xiàn) PAGEREF _Toc408566666 h 8 HYPERLINK l _Toc408566667 3.1 源程序代碼 PAGEREF _Toc408566667 h 8 HYPERLINK l _Toc408566668 4系統(tǒng)運(yùn)行與測(cè)試 PAGEREF _Toc408566668 h

6、61 HYPERLINK l _Toc408566669 總 結(jié) PAGEREF _Toc408566669 h 65 PAGE 791需求(xqi)與總體設(shè)計(jì)各種中國(guó)象棋軟件的開發(fā)與應(yīng)用,尤其是在網(wǎng)絡(luò)方面的推廣,使得中國(guó)象棋得到了很好的宣傳,全面展示了中國(guó)象棋的風(fēng)采、優(yōu)點(diǎn)(yudin)與特色,同時(shí)也讓外國(guó)人認(rèn)識(shí)到中國(guó)象棋這一我國(guó)的“國(guó)粹”。中國(guó)象棋打譜系統(tǒng)正是為這一可行性而開發(fā)設(shè)計(jì)的,玩家可以通過它很好的研究(ynji)棋譜,學(xué)習(xí)中國(guó)象棋技術(shù),提高水平。1.1需求分析實(shí)現(xiàn)一個(gè)中國(guó)象棋對(duì)弈的軟件,實(shí)現(xiàn)中國(guó)象棋的規(guī)則:棋子共有三十二個(gè),分為紅、黑兩組,每組十六個(gè),各分七種,其名稱和數(shù)目如下所述。

7、(1) 紅棋子:帥一人,車、馬、炮、相、士各兩個(gè),兵五個(gè)。(2)黑棋子:將一個(gè),車、馬、炮、象、士各兩個(gè),卒五個(gè)。(3)在對(duì)局時(shí),由執(zhí)紅棋的一方先走,雙方輪流各走一著,直至分出勝負(fù)或走成和棋為止。輪到走棋的一方,將某個(gè)棋子從一個(gè)交叉點(diǎn)到另一個(gè)空著的交叉點(diǎn),或者吃掉對(duì)方的棋子而占領(lǐng)叉點(diǎn),都算走了一著。雙方各走了一著,稱為一個(gè)回合。(4)帥(將)每一著只許走一步,前進(jìn)、后退、橫走都可以,但不能走出“九宮”。帥和將不準(zhǔn)在同一直線上直接對(duì)面,如一方已先占據(jù),另一方必須回避。(5)士每一著只許沿“九宮”斜線走一步,可進(jìn)可退。相(象)不能越過“河界”,每一著斜走兩步,可進(jìn)可退,即俗稱相(象)走田字。當(dāng)田字

8、中心有別的棋子時(shí),俗稱塞相(象)眼,則不行走過去。(6)馬每著走一直(或一橫)一斜,可進(jìn)可退,即俗稱“馬走日字”。如果在要去方向緊靠一直(或一橫)的地方,有別的棋子擋住,俗稱“蹩馬腿”,就不能走過去。(7)車每一著可以直進(jìn)、直退、橫走,不限步數(shù)。(8)炮在不吃子的時(shí)候,走法同車一樣。(9)兵(卒)在沒有過“河界”前,每著只許向前直走一步;過“河界”后,每著可以向前走一步,也可以橫走一步,但不能后退。走一著棋時(shí),如果己方棋子能夠走到的位置有對(duì)方棋子存在,就可把對(duì)棋子吃掉而占領(lǐng)那個(gè)位置。只有炮吃了必須隔一個(gè)棋子(無論是哪一方的)跳吃,即俗稱“炮打隔子”。除 帥(將)外,其它棋子都可以聽任對(duì)方吃,或

9、主動(dòng)送吃。一方的棋子攻擊對(duì)方的帥(將),并在下一著要把它吃掉,稱為“將軍”,或簡(jiǎn)稱“將”。被“將軍”的一方必須立即“應(yīng)將”,即用自衛(wèi)的著法去化解被“將”的狀態(tài)。如果被“將軍”而無法“應(yīng)將”,就算被“將死”。輪到走棋的一方,帥(將)雖沒被對(duì)方“將軍”,卻被禁在一個(gè)位置上無路可走,同時(shí)己方其它棋子也都不能走動(dòng),就算被“困斃”。1.2總體設(shè)計(jì)本系統(tǒng)(xtng)實(shí)現(xiàn)(shxin)了三個(gè)功能,即新游戲:開始一局新的對(duì)弈;悔棋:將棋子返回剛才(gngci)所處位置;退出:退出本程序;信息提示:提示當(dāng)前信息狀態(tài)。功能圖如圖1-1所示。圖1-1 功能圖簡(jiǎn)單類圖如圖1-2所示。圖1-2 簡(jiǎn)單類圖2詳細(xì)(xing

10、x)設(shè)計(jì) 本文結(jié)合在中國(guó)象棋機(jī)器博弈方面的實(shí)踐經(jīng)驗(yàn),在分析了中國(guó)象棋游戲需求基礎(chǔ)上,設(shè)計(jì)并實(shí)現(xiàn)了中國(guó)象棋系統(tǒng)。該系統(tǒng)為人人對(duì)戰(zhàn)。人人對(duì)戰(zhàn)規(guī)則明確,包含了中國(guó)象棋所有的招法。方便了不同水平人群的不同選擇,其它些小功能也增加了本象棋游戲增加了樂趣。本系統(tǒng)的實(shí)現(xiàn)滿足(mnz)了人們對(duì)中國(guó)象棋的基本需求,解決了傳統(tǒng)象棋游戲?qū)W習(xí)性差、不易演示等問題。2.1詳細(xì)設(shè)計(jì)(shj)思路由上述類圖進(jìn)行分析。中國(guó)象棋對(duì)弈系統(tǒng)的程序由文件Chess.java實(shí)現(xiàn)。Chess.java主要包括兩個(gè)類:一個(gè)是被定義為public類型的類,名為Chess,主要負(fù)責(zé)中國(guó)象棋對(duì)弈程序的執(zhí)行;另一個(gè)類名為ChessMainFra

11、me,是程序的主框架類。程序中Chess類通過生成ChessMainFrame類的對(duì)象來執(zhí)行程序。ChessMainFrame類主要包含四個(gè)模塊:生成圖形用戶界面模塊,完成按鈕的操作模塊,棋子操作模塊和棋子的移動(dòng)規(guī)則模塊。其中其中棋子的移動(dòng)規(guī)則被定義為內(nèi)部類,名為ChessRule。ChessRule類中的方法用于定義各個(gè)棋子的移動(dòng)規(guī)則和吃子規(guī)則??傮w設(shè)計(jì)流程圖如圖2-1所示。圖2-1 總體設(shè)計(jì)流程(lichng) (1)圖形用戶界面模塊(m kui) 圖形用戶界面是ChessMainFrame類中的基本模塊,它的主要作用是定義該類中所使用的變量和實(shí)例對(duì)象(duxing),通過構(gòu)造函數(shù)初始化圖

12、形用戶界面,添加組件和棋子,注冊(cè)事件組件。(2)按鈕的操作模塊 程序(chngx)中有三個(gè)按鈕,分別為“新游戲(yux)”按鈕,“悔棋(hu q)”按鈕和“退出”按鈕。單擊“新游戲”按鈕時(shí),程序重新布置棋子,并將保存當(dāng)前操作Vector(向量)清空;單擊“悔棋”按鈕時(shí),調(diào)用Vector中的數(shù)據(jù)進(jìn)行悔棋操作;單擊“退出”向量按鈕時(shí),程序會(huì)詢問是否退出,選“是”則退出對(duì)弈。流程圖如圖2-2所示。圖2-2 按鈕模塊流程圖(3)棋子的操作模塊棋子的操作模塊定義了線程,單擊棋子的時(shí)候,可以使棋子閃爍以實(shí)現(xiàn)棋子已經(jīng)被選取的效果,單擊棋子或移動(dòng)時(shí),根據(jù)棋子的編號(hào)來判斷使用規(guī)則進(jìn)行移動(dòng)或吃子。需要注意的是,移

13、動(dòng)和吃子是調(diào)用規(guī)則類模塊完成的。流程圖如圖2-3所示:圖2-3 棋子(qz)操作模塊流程圖(4)棋子的移動(dòng)(ydng)規(guī)則類模塊移動(dòng)規(guī)則類ChessRule分別定義(dngy)中國(guó)象棋32個(gè)棋子的移動(dòng)規(guī)則。32個(gè)棋子可分為6類棋子。每一類棋子各有兩個(gè)方法,定義這類棋子的移動(dòng)規(guī)則和吃子規(guī)則。棋子的移動(dòng)規(guī)則如下所述。 帥(將)每次只許走一步,前進(jìn)、后退、橫走都可以,但不能走出“九宮”。將和帥不準(zhǔn)在同一直線上面對(duì)面,如一方已占據(jù),另一方就必須回避。 士每次只許沿“九宮”斜線走一步,可進(jìn)可退。 相(相)不能越過(yu gu)“河界”,每一次斜走兩步,可進(jìn)可退,即俗稱(s chn)“相(象)走田”。當(dāng)田

14、字中心(zhngxn)有別的棋子時(shí),俗稱“塞相(象)眼”,則不許走過去。 馬每次走一直(或一橫)一斜,可進(jìn)可退,即俗稱“馬走日”。如果在要去的方向有別的棋子擋住。俗稱“蹩馬腿”,則不許走過去。 車每次可以直進(jìn)、直退、橫走,不限步數(shù)。炮在不吃子的時(shí)候,走法同車一樣。兵(卒)在沒有過“河界”前,每次只許向前直走一步;過“ 河界”后,每次可向前直走或橫走一步,但不能后退。吃子規(guī)則:在走棋時(shí),如果棋子能夠走到的位置有對(duì)方棋子存在,就可以把對(duì)方棋子吃掉而占領(lǐng)那個(gè)位置。只有炮在吃子時(shí)必須隔一個(gè)棋子跳吃,即俗稱“炮打隔子”。 帥(將)外其他棋子都可以聽任對(duì)方吃。吃子的一方必須立即把被吃掉的子從棋盤上拿掉。3

15、編碼(bin m)實(shí)現(xiàn)源代碼/* *中國(guó)象棋(zhn u xin q)Java版 *作者(zuzh):程偉 *源文件:Chess.java *添加功能:實(shí)現(xiàn)了當(dāng)前棋局的保存 */import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;/主類public class Chesspublic static void main(String args)new ChessMainFrame(中國(guó)象棋:觀棋不語(yǔ)真君子,棋死無悔大丈夫);/主框架類class ChessMainFrame exten

16、ds JFrame implements ActionListener,MouseListener,Runnable/玩家JLabel play = new JLabel32;/棋盤JLabel image;/窗格Container con;/工具欄JToolBar jmain;/重新開始JButton anew;/悔棋JButton repent;/退出JButton exit;/當(dāng)前信息JLabel text;/保存(bocn)當(dāng)前操作Vector Var;/規(guī)則類對(duì)象(duxing)(使于調(diào)用方法)ChessRule rule;/* 單擊棋子(qz)* chessManClick = t

17、rue 閃爍棋子 并給線程響應(yīng)* chessManClick = false 吃棋子 停止閃爍 并給線程響應(yīng)*/boolean chessManClick;/* 控制玩家走棋* chessPlayClick=1 黑棋走棋* chessPlayClick=2 紅棋走棋 默認(rèn)紅棋* chessPlayClick=3 雙方都不能走棋*/int chessPlayClick=2;/控制棋子閃爍的線程Thread tmain;/把第一次的單擊棋子給線程響應(yīng)static int Man,i;ChessMainFrame()new ChessMainFrame(中國(guó)象棋);/* 構(gòu)造函數(shù)* 初始化圖形用戶界

18、面*/ChessMainFrame(String Title)/獲行客格引用con = this.getContentPane();con.setLayout(null);/實(shí)例化規(guī)則類rule = new ChessRule();Var = new Vector();/創(chuàng)建(chungjin)工具欄jmain = new JToolBar();text = new JLabel(歡迎使用(shyng)象棋對(duì)弈系統(tǒng));/當(dāng)鼠標(biāo)放上顯示信息text.setToolTipText(信息(xnx)提示);anew = new JButton( 新 游 戲 );anew.setToolTipText(

19、重新開始新的一局);exit = new JButton( 退 出 );exit.setToolTipText(退出象棋程序程序);repent = new JButton( 悔 棋 );repent.setToolTipText(返回到上次走棋的位置);/把組件添加到工具欄jmain.setLayout(new GridLayout(0,4);jmain.add(anew);jmain.add(repent);jmain.add(exit);jmain.add(text);jmain.setBounds(0,0,558,30);con.add(jmain);/添加棋子標(biāo)簽drawChessM

20、an();/注冊(cè)按扭監(jiān)聽anew.addActionListener(this);repent.addActionListener(this);exit.addActionListener(this);/注冊(cè)棋子移動(dòng)監(jiān)聽for (int i=0;i screenSize.height)frameSize.height = screenSize.height;if (frameSize.width screenSize.width)frameSize.width = screenSize.width;this.setLocation(screenSize.width - frameSize.wi

21、dth) / 2 - 280 ,(screenSize.height - frameSize.height ) / 2 - 350);/設(shè)置(shzh)this.setIconImage(new ImageIcon(image紅將.GIF).getImage();this.setResizable(false);this.setTitle(Title);this.setSize(558,670);this.show();/* 添加棋子(qz)方法*/public void drawChessMan()/流程控制int i,k;/圖標(biāo)Icon in;/黑色棋子/車in = new ImageIc

22、on(image黑車.GIF);for (i=0,k=24;i2;i+,k+=456)playi = new JLabel(in);playi.setBounds(k,56,55,55);playi.setName(車1);/馬in = new ImageIcon(image黑馬(hi m).GIF);for (i=4,k=81;i6;i+,k+=342)playi = new JLabel(in);playi.setBounds(k,56,55,55);playi.setName(馬1);/相in = new ImageIcon(image黑象.GIF);for (i=8,k=138;i10

23、;i+,k+=228)playi = new JLabel(in);playi.setBounds(k,56,55,55);playi.setName(象1);/士in = new ImageIcon(image黑士.GIF);for (i=12,k=195;i14;i+,k+=114)playi = new JLabel(in);playi.setBounds(k,56,55,55);playi.setName(士1);/卒in = new ImageIcon(image黑卒.GIF);for (i=16,k=24;i21;i+,k+=114)playi = new JLabel(in);p

24、layi.setBounds(k,227,55,55);playi.setName(卒1 + i);/炮in = new ImageIcon(image黑炮.GIF);for (i=26,k=81;i28;i+,k+=342)playi = new JLabel(in);playi.setBounds(k,170,55,55);playi.setName(炮1 + i);/將in = new ImageIcon(image黑將.GIF);play30 = new JLabel(in);play30.setBounds(252,56,55,55);play30.setName(將1);/紅色(h

25、ngs)棋子/車in = new ImageIcon(image紅車.GIF);for (i=2,k=24;i4;i+,k+=456)playi = new JLabel(in);playi.setBounds(k,569,55,55);playi.setName(車2);/馬in = new ImageIcon(image紅馬.GIF);for (i=6,k=81;i8;i+,k+=342)playi = new JLabel(in);playi.setBounds(k,569,55,55);playi.setName(馬2);/相in = new ImageIcon(image紅象.GIF

26、);for (i=10,k=138;i12;i+,k+=228)playi = new JLabel(in);playi.setBounds(k,569,55,55);playi.setName(象2);/士in = new ImageIcon(image紅士.GIF);for (i=14,k=195;i16;i+,k+=114)playi = new JLabel(in);playi.setBounds(k,569,55,55);playi.setName(士2);/兵in = new ImageIcon(image紅卒.GIF);for (i=21,k=24;i26;i+,k+=114)p

27、layi = new JLabel(in);playi.setBounds(k,398,55,55);playi.setName(卒2 + i);/炮in = new ImageIcon(image紅炮.GIF);for (i=28,k=81;i 15 & Man 25 & Man =0 & Man 3 & Man 7 & Man 11 & Man 15 & Man 25 & Man =0 & Man 3 & Man 7 & Man 11 & Man 16)rule.chapRule(Man,playMan,play,me);/移動(dòng)將、帥else if (Man = 30 | Man = 31

28、)rule.willRule(Man,playMan,play,me);/是否(sh fu)走棋錯(cuò)誤(是否在原地沒有動(dòng))if (Ex = playMan.getX() & Ey = playMan.getY()text.setText( 黑棋走棋(zu q);chessPlayClick=1;else text.setText( 紅棋走棋(zu q);chessPlayClick=2;/else if/當(dāng)前沒有操作(停止閃爍)chessManClick=false;/if/單擊棋子else/第一次單擊棋子(閃爍棋子)if (!chessManClick)for (int i=0;i32;i+)

29、/被單擊的棋子if (me.getSource().equals(playi)/告訴線程讓該棋子閃爍Man=i;/開始閃爍chessManClick=true;break;/for/if/第二次單擊棋子(吃棋子)else if (chessManClick)/當(dāng)前沒有操作(停止閃爍)chessManClick=false;for (i=0;i 15 & Man 25 & Man =0 & Man 3 & Man 7 & Man 11 & Man 15 & Man 25 & Man =0 & Man 3 & Man 7 & Man 11 & Man 16)rule.chapRule(Man,pl

30、ayMan,playi,play);/將、帥吃棋規(guī)則else if (Man = 30 | Man = 31)rule.willRule(Man,playMan,playi,play);playMan.setVisible(true);/是否(sh fu)走棋錯(cuò)誤(是否在原地沒有動(dòng))if (Ex = playMan.getX() & Ey = playMan.getY()text.setText( 黑棋走棋(zu q);chessPlayClick=1;break;else text.setText( 紅棋走棋(zu q);chessPlayClick=2;break;/else if /if

31、/for/是否勝利if (!play31.isVisible()JOptionPane.showConfirmDialog(this,黑棋勝利,玩家一勝利,JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);/雙方都不可以在走棋了chessPlayClick=3;text.setText( 黑棋勝利);/if else if (!play30.isVisible()JOptionPane.showConfirmDialog(this,紅棋勝利(shngl),玩家二勝利,JOptionPane.DEFAULT_OPTION,JOptio

32、nPane.WARNING_MESSAGE);chessPlayClick=3;text.setText( 紅棋勝利(shngl);/else if/else/elsepublic void mousePressed(MouseEvent me)public void mouseReleased(MouseEvent me)public void mouseEntered(MouseEvent me)public void mouseExited(MouseEvent me)/* 定義(dngy)按鈕的事件響應(yīng)*/public void actionPerformed(ActionEvent

33、ae) /重新開始按鈕if (ae.getSource().equals(anew)int i,k;/重新排列每個(gè)棋子的位置/黑色棋子/車for (i=0,k=24;i2;i+,k+=456)playi.setBounds(k,56,55,55);/馬for (i=4,k=81;i6;i+,k+=342)playi.setBounds(k,56,55,55);/相for (i=8,k=138;i10;i+,k+=228)playi.setBounds(k,56,55,55);/士for (i=12,k=195;i14;i+,k+=114)playi.setBounds(k,56,55,55);

34、/卒for (i=16,k=24;i21;i+,k+=114)playi.setBounds(k,227,55,55);/炮for (i=26,k=81;i28;i+,k+=342)playi.setBounds(k,170,55,55);/將play30.setBounds(252,56,55,55);/紅色(hngs)棋子/車for (i=2,k=24;i4;i+,k+=456)playi.setBounds(k,569,55,55);/馬for (i=6,k=81;i8;i+,k+=342)playi.setBounds(k,569,55,55);/相for (i=10,k=138;i1

35、2;i+,k+=228)playi.setBounds(k,569,55,55);/士for (i=14,k=195;i16;i+,k+=114)playi.setBounds(k,569,55,55);/兵for (i=21,k=24;i26;i+,k+=114)playi.setBounds(k,398,55,55);/炮for (i=28,k=81;i30;i+,k+=342)playi.setBounds(k,455,55,55);/帥play31.setBounds(252,569,55,55);chessPlayClick = 2;text.setText( 紅棋走棋(zu q);

36、for (i=0;i32;i+)playi.setVisible(true);/清除(qngch)Vector中的內(nèi)容Var.clear();/悔棋(hu q)按鈕else if (ae.getSource().equals(repent)try/獲得setVisible屬性值String S = (String)Var.get(Var.size()-4);/獲得X坐標(biāo)int x = Integer.parseInt(String)Var.get(Var.size()-3);/獲得Y坐標(biāo)int y = Integer.parseInt(String)Var.get(Var.size()-2);

37、/獲得索引int M = Integer.parseInt(String)Var.get(Var.size()-1);/賦給棋子playM.setVisible(true);playM.setBounds(x,y,55,55);if (playM.getName().charAt(1) = 1)text.setText( 黑棋走棋);chessPlayClick = 1; elsetext.setText( 紅棋走棋(zu q);chessPlayClick = 2;/刪除(shnch)用過的坐標(biāo)Var.remove(Var.size()-4);Var.remove(Var.size()-3)

38、;Var.remove(Var.size()-2);Var.remove(Var.size()-1);/停止(tngzh)旗子閃爍chessManClick=false;catch(Exception e)/退出else if (ae.getSource().equals(exit)int j=JOptionPane.showConfirmDialog(this,真的要退出嗎?,退出,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if (j = JOptionPane.YES_OPTION)System.exit(0);/*定義中國(guó)象

39、棋規(guī)則的類*/class ChessRule /*卒子的移動(dòng)規(guī)則*/public void armsRule(int Man,JLabel play,MouseEvent me)/黑卒向下if (Man 27 & (me.getY()-play.getY() 86 & (me.getX()-play.getX() 0)/當(dāng)前記錄添加到集合(jh)(用于悔棋)Var.add(String.valueOf(play.isVisible();Var.add(String.valueOf(play.getX();Var.add(String.valueOf(play.getY();Var.add(St

40、ring.valueOf(Man);play.setBounds(play.getX(),play.getY()+57,55,55);/向右移動(dòng)、得到終點(diǎn)(zhngdin)的坐標(biāo)模糊成合法的坐標(biāo)、必須過河else if (play.getY() 284 & (me.getX() - play.getX() = 57 & (me.getX() - play.getX() 284 & (play.getX() - me.getX() = 2 & (play.getX() - me.getX() = 0 & (me.getX()-play.getX() 27 & play.getY()-me.get

41、Y() 86)play.setBounds(play.getX(),play.getY()-57,55,55);/向右移動(dòng)(ydng)、得到終點(diǎn)的坐標(biāo)模糊成合法的坐標(biāo)、必須過河else if (play.getY() = 57 & (me.getX() - play.getX() = 112)play.setBounds(play.getX()+57,play.getY(),55,55);/向左移動(dòng)、得到終點(diǎn)的坐標(biāo)模糊成合法(hf)的坐標(biāo)、必須過河else if (play.getY() = 3 & (play.getX() - me.getX() =58)play.setBounds(pla

42、y.getX()-57,play.getY(),55,55);/卒移動(dòng)(ydng)結(jié)束/*卒吃棋規(guī)則*/public void armsRule(JLabel play1,JLabel play2)/向右走if (play2.getX() - play1.getX() = 57 & (play1.getY() - play2.getY() -22 & play2.isVisible() & play1.getName().charAt(1)!=play2.getName().charAt(1)/黑棋要過河才能右吃棋if (play1.getName().charAt(1) = 1 & play

43、1.getY() 284 & play1.getName().charAt(1) != play2.getName().charAt(1)play2.setVisible(false);/把對(duì)方的位置給自己play1.setBounds(play2.getX(),play2.getY(),55,55);/紅棋要過河才左能吃棋e(cuò)lse if (play1.getName().charAt(1) = 2 & play1.getY() 341 & play1.getName().charAt(1) != play2.getName().charAt(1)play2.setVisible(false)

44、;/把對(duì)方(dufng)的位置給自己play1.setBounds(play2.getX(),play2.getY(),55,55);/向左走else if (play1.getX() - play2.getX() = 57 & (play1.getY() - play2.getY() -22 & play2.isVisible() & play1.getName().charAt(1)!=play2.getName().charAt(1)/黑棋要過河才能(cinng)左吃棋if (play1.getName().charAt(1) = 1 & play1.getY() 284 & play1

45、.getName().charAt(1) != play2.getName().charAt(1)play2.setVisible(false);/把對(duì)方(dufng)的位置給自己play1.setBounds(play2.getX(),play2.getY(),55,55);/紅棋要過河才能右吃棋e(cuò)lse if (play1.getName().charAt(1) = 2 & play1.getY() = -22 & play1.getX() - play2.getX() = -112 & play1.getY() - play2.getY() = 112)/黑棋不能向上(xingshng)

46、吃棋if (play1.getName().charAt(1) = 1 & play1.getY() play2.getY() & play1.getName().charAt(1) != play2.getName().charAt(1)play2.setVisible(false);/把對(duì)方的位置給自己play1.setBounds(play2.getX(),play2.getY(),55,55);/當(dāng)前記錄添加到集合(用于悔棋)Var.add(String.valueOf(play1.isVisible();Var.add(String.valueOf(play1.getX();Var.

47、add(String.valueOf(play1.getY();Var.add(String.valueOf(Man);/當(dāng)前記錄添加到集合(用于悔棋)Var.add(String.valueOf(play2.isVisible();Var.add(String.valueOf(play2.getX();Var.add(String.valueOf(play2.getY();Var.add(String.valueOf(i);/卒吃結(jié)束/*炮、車移動(dòng)規(guī)則*/public void cannonRule(JLabel play,JLabel playQ,MouseEvent me)/起點(diǎn)和終點(diǎn)之

48、間是否有棋子int Count = 0;/上、下移動(dòng)(ydng)if (play.getX() - me.getX() = -55)/指定所有(suyu)模糊Y坐標(biāo)for (int i=56;i= -27 & i - me.getY() = 27)/所有的棋子for (int j=0;j= -27 & playQj.getX() - play.getX() = 27 & playQj.getName()!=play.getName() & playQj.isVisible()/從起點(diǎn)到終點(diǎn)(從左到右)for (int k=play.getY()+57;ki;k+=57)/大于起點(diǎn)、小于終點(diǎn)的坐

49、標(biāo)就可以知道中間是否有棋子if (playQj.getY() play.getY()/中間有一個(gè)棋子就不可以從這條豎線過去Count+;break;/for/從起點(diǎn)到終點(diǎn)(從右到左)for (int k=i+57;kplay.getY();k+=57)/找起點(diǎn)和終點(diǎn)的棋子if (playQj.getY() i)Count+;break;/for/if/for/起點(diǎn)和終點(diǎn)沒有棋子就可以移動(dòng)了if (Count = 0)/當(dāng)前記錄添加到集合(jh)(用于悔棋)Var.add(String.valueOf(play.isVisible();Var.add(String.valueOf(play.ge

50、tX();Var.add(String.valueOf(play.getY();Var.add(String.valueOf(Man);play.setBounds(play.getX(),i,55,55);break;/if/for/if/左、右移動(dòng)(ydng)else if (play.getY() - me.getY() =-27 & play.getY() - me.getY() = 27)/指定所有模糊(m hu)X坐標(biāo)for (int i=24;i= -55 & i-me.getX() = 0)/所有的棋子for (int j=0;j= -27 & playQj.getY() -

51、play.getY() = 27 & playQj.getName()!=play.getName() & playQj.isVisible()/從起點(diǎn)到終點(diǎn)(從上到下)for (int k=play.getX()+57;ki;k+=57)/大于起點(diǎn)、小于終點(diǎn)的坐標(biāo)就可以知道中間是否有棋子if (playQj.getX() play.getX()/中間有一個(gè)棋子就不可以從這條橫線過去Count+;break;/for/從起點(diǎn)(qdin)到終點(diǎn)(從下到上)for (int k=i+57;kplay.getX();k+=57)/找起點(diǎn)(qdin)和終點(diǎn)的棋子if (playQj.getX() i)

52、Count+;break;/for/if/for/起點(diǎn)(qdin)和終點(diǎn)沒有棋子if (Count = 0)/當(dāng)前記錄添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible();Var.add(String.valueOf(play.getX();Var.add(String.valueOf(play.getY();Var.add(String.valueOf(Man);play.setBounds(i,play.getY(),55,55);break;/if/for/else/炮、車移動(dòng)方法結(jié)束/*炮、車吃棋規(guī)則*/public void canno

53、nRule(int Chess,JLabel play,JLabel playTake,JLabel playQ,MouseEvent me)/起點(diǎn)和終點(diǎn)之間是否有棋子int Count = 0;/所有(suyu)的棋子for (int j=0;j= -27 & playQj.getX() - play.getX() = 27 & playQj.getName()!=play.getName() & playQj.isVisible()/自己(zj)是起點(diǎn)被吃的是終點(diǎn)(從上到下)for (int k=play.getY()+57;kplayTake.getY();k+=57)/大于起點(diǎn)、小于終

54、點(diǎn)的坐標(biāo)就可以知道中間是否有棋子if (playQj.getY() play.getY()/計(jì)算起點(diǎn)和終點(diǎn)的棋子個(gè)數(shù)Count+;break;/for/自己是起點(diǎn)被吃的是終點(diǎn)(從下到上)for (int k=playTake.getY();kplay.getY();k+=57)/找起點(diǎn)和終點(diǎn)的棋子if (playQj.getY() playTake.getY()Count+;break;/for/if/找出在同一條豎線的所有棋子、并不包括自己else if (playQj.getY() - play.getY() = -10 & playQj.getY() - play.getY() = 10

55、 & playQj.getName()!=play.getName() & playQj.isVisible()/自己是起點(diǎn)被吃的是終點(diǎn)(從左到右)for (int k=play.getX()+50;kplayTake.getX();k+=57)/大于起點(diǎn)、小于終點(diǎn)的坐標(biāo)就可以知道中間(zhngjin)是否有棋子if (playQj.getX() play.getX()Count+;break;/for/自己是起點(diǎn)(qdin)被吃的是終點(diǎn)(從右到左)for (int k=playTake.getX();kplay.getX();k+=57)/找起點(diǎn)和終點(diǎn)(zhngdin)的棋子if (play

56、Qj.getX() playTake.getX()Count+;break;/for/if/for/起點(diǎn)和終點(diǎn)之間要一個(gè)棋子是炮的規(guī)則、并不能吃自己的棋子if (Count = 1 & Chess = 0 & playTake.getName().charAt(1) != play.getName().charAt(1)/當(dāng)前記錄添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible();Var.add(String.valueOf(play.getX();Var.add(String.valueOf(play.getY();Var.add(Strin

57、g.valueOf(Man);/當(dāng)前記錄添加到集合(用于悔棋)Var.add(String.valueOf(playTake.isVisible();Var.add(String.valueOf(playTake.getX();Var.add(String.valueOf(playTake.getY();Var.add(String.valueOf(i);playTake.setVisible(false);play.setBounds(playTake.getX(),playTake.getY(),55,55);/起點(diǎn)和終點(diǎn)之間沒有棋子(qz)是車的規(guī)則、并不能吃自己的棋子else if (

58、Count =0 & Chess = 1 & playTake.getName().charAt(1) != play.getName().charAt(1)/當(dāng)前(dngqin)記錄添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible();Var.add(String.valueOf(play.getX();Var.add(String.valueOf(play.getY();Var.add(String.valueOf(Man);/當(dāng)前記錄添加到集合(jh)(用于悔棋)Var.add(String.valueOf(playTake.isVisib

59、le();Var.add(String.valueOf(playTake.getX();Var.add(String.valueOf(playTake.getY();Var.add(String.valueOf(i);playTake.setVisible(false);play.setBounds(playTake.getX(),playTake.getY(),55,55);/炮、車吃棋方法結(jié)束/*馬移動(dòng)規(guī)則*/public void horseRule(JLabel play,JLabel playQ,MouseEvent me)/保存坐標(biāo)和障礙int Ex=0,Ey=0,Move=0;/

60、上移、左邊if (play.getX() - me.getX() = 2 & play.getX() - me.getX() = 87 & play.getY() - me.getY() = 141)/合法的Y坐標(biāo)for (int i=56;i= -27 & i - me.getY() = 27)Ey = i;break;/合法(hf)的X坐標(biāo)for (int i=24;i= -55 & i-me.getX() = 0)Ex = i;break;/正前方是否(sh fu)有別的棋子for (int i=0;i= 27 & play.getY() - me.getY() = 70 & play.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論