《java語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)中國(guó)象棋對(duì)弈系統(tǒng)(源碼)
《《java語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)中國(guó)象棋對(duì)弈系統(tǒng)(源碼)》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《《java語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)中國(guó)象棋對(duì)弈系統(tǒng)(源碼)(42頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、 數(shù)學(xué)與應(yīng)用數(shù)學(xué)專(zhuān)業(yè)Java課程設(shè)計(jì)報(bào)告 《java語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì) 姓 名: 王 ** 學(xué) 號(hào): 指導(dǎo)教師: 班 級(jí): 所在院系: Java語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)報(bào)告 實(shí)驗(yàn)項(xiàng)目名稱(chēng):中國(guó)象棋對(duì)弈系統(tǒng) 作者姓名與單位:王浩 數(shù)學(xué)與應(yīng)用數(shù)學(xué)專(zhuān)業(yè) 數(shù)學(xué)081班 摘
2、要: 本文主要是運(yùn)用java實(shí)現(xiàn)具有一定功能的中國(guó)象棋對(duì)弈系統(tǒng)軟件,主要功能如下: a、 象棋對(duì)弈:紅方先走,然后黑方再走,紅黑交替,直到一方獲勝。 b、 新游戲:任何時(shí)候可以重新開(kāi)始一盤(pán)新的對(duì)弈。 c、 悔棋:當(dāng)走錯(cuò)棋的時(shí)候可以悔棋。 d、 信息提示:提示當(dāng)前信息狀態(tài)。 e、 簡(jiǎn)單的幫助文檔:象棋規(guī)則介紹、軟件的簡(jiǎn)單介紹和編制說(shuō)明 關(guān)鍵詞:java、中國(guó)象棋對(duì)弈系統(tǒng) 正文: 一 程序設(shè)計(jì)說(shuō)明 1.1程序的設(shè)計(jì)及實(shí)現(xiàn) 本系統(tǒng)主要有以下4個(gè)模塊,每個(gè)模塊對(duì)應(yīng)一個(gè)程序包: 1、engine:搜索引擎包,系統(tǒng)的核心部分。 2、message:網(wǎng)絡(luò)
3、對(duì)戰(zhàn)過(guò)程中各種消息及其傳遞機(jī)制的類(lèi)實(shí)現(xiàn)包。 3、main:主界面實(shí)現(xiàn)包。 4、pieces:棋子及其相關(guān)類(lèi)實(shí)現(xiàn)包。 現(xiàn)就各個(gè)包中的要點(diǎn)給與說(shuō)明。 1.1.1 搜索引擎的實(shí)現(xiàn)(engine包) (1) BitBoard.java:位棋盤(pán)的實(shí)現(xiàn),見(jiàn)2.4節(jié)。 (2) CCEvalue.java:評(píng)價(jià)函數(shù)知識(shí)類(lèi)。 本程序使用開(kāi)源軟件“夢(mèng)入神蛋”的快速評(píng)價(jià)函數(shù)。該函數(shù)包含子力價(jià)值和棋子所在位置的獎(jiǎng)勵(lì)值。子力價(jià)值分別是:帥-0, 仕- 40, 象-40, 馬-88, 車(chē)-200, 炮-96, 兵-9。帥是無(wú)價(jià)的,用0表示。以馬為例,位置的獎(jiǎng)勵(lì)值如下: 0, -3, 5, 4, 2, 2,
4、 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, 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 上面的每行代表棋盤(pán)的一條縱線(xiàn)。其中,-10所在的位置是“窩
5、心馬”,所以要罰10分。 (3) ChessPosition.java:動(dòng)態(tài)局面類(lèi) 包含對(duì)局過(guò)程中的動(dòng)態(tài)信息,主要實(shí)現(xiàn)的是2.4節(jié)的各類(lèi)位棋盤(pán)和移子函數(shù)。 (4) MoveStruct.java:著法表示類(lèi)。 (5) PreMove.java:偽合法著法生成模塊,見(jiàn)4.1。 (6) MoveSortStruct.java:合法著法的生成及其排序算法,見(jiàn)4.2。 (7) SearchMove.java:搜索算法,實(shí)現(xiàn)如下功能: 1)主置換表及開(kāi)局庫(kù) 2)Alpha-Beta搜索算法 3)針對(duì)吃子著法的靜態(tài)搜索算法 4)適應(yīng)性空著裁剪算法:見(jiàn)5.5.2,根據(jù)不同情況來(lái)調(diào)整R值的
6、做法,稱(chēng)為“適應(yīng)性空著裁剪”(Adaptive Null-Move Pruning),它首先由Ernst Heinz發(fā)表在1999年的ICCA雜志上。其內(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)主要變例搜索算法 1.1.2 信息傳輸機(jī)制(message包) 在對(duì)弈過(guò)程中(
7、主要是網(wǎng)絡(luò)對(duì)弈)需要在對(duì)弈雙方之間傳輸各類(lèi)信息,抽象為各類(lèi)消息。如時(shí)間規(guī)則的協(xié)定、各方的走子信息等。每方都有消息接收、消息處理和消息發(fā)送程序(OuterMsgReceiver、LocalMsgReceiver,QzMessageHandler,MessageSender)。己方的MessageSender與對(duì)方的OuterMsgReceiver通過(guò)接口SrConnection連接。所有接收的消息放入消息隊(duì)列QzMsgQueue中,等待消息處理進(jìn)程QzMessageHandler來(lái)處理。所有的消息都封裝在QzMessage類(lèi)對(duì)象中,消息的類(lèi)型通過(guò)消息的Header類(lèi)型(以靜態(tài)常量存放在MsgHe
8、ader類(lèi)中)來(lái)區(qū)分。 1.1.3 棋子(pieces包) Qizi.java包含棋子的信息,如棋子的(在棋盤(pán)上的)位置、圖片、名稱(chēng)、類(lèi)型、狀態(tài)等。PiecesFactory.java以“工廠(chǎng)”模式提供根據(jù)棋子類(lèi)型或其他信息生成相關(guān)Qizi對(duì)象的方法。 1.2主控模塊(main包) 實(shí)現(xiàn)了程序界面與消息傳遞、搜索引擎的集成。 (1) NewBoard.java:棋盤(pán)坐標(biāo)系統(tǒng)及其界面的實(shí)現(xiàn)。 (2) CChessApp.java:主界面類(lèi),以?xún)?nèi)部類(lèi)實(shí)現(xiàn)了QzMessageHandler接口、計(jì)時(shí)規(guī)則TimeRule接口以及事件的處理程序,根據(jù)需要生成其他的并發(fā)線(xiàn)程如消息接收、處理和發(fā)
9、送,機(jī)器思考(啟動(dòng)搜索引擎),計(jì)時(shí)顯示等。 (3) SetRuleDialog.java:設(shè)置規(guī)則的對(duì)話(huà)框。 (4) SetSysInfoDialog.java:設(shè)置系統(tǒng)的一些屬性如對(duì)戰(zhàn)模式、連接端口等。 (5) Translation.java:提供了一系列實(shí)用方法主要有: 1)FEN串與局面ChessPosition對(duì)象之間的轉(zhuǎn)換 2)不同著法表示(見(jiàn)第一章)之間的轉(zhuǎn)換。如“炮二平五”與“Ch2-e2”及“62.5或C2.5“(C和6代表炮)這幾種表示法之間的轉(zhuǎn)換 3)棋譜文件的讀入和存儲(chǔ)。 4)開(kāi)局庫(kù)的生成:將近年實(shí)戰(zhàn)的棋譜文件(可能有幾種格式)整理生成開(kāi)局庫(kù)。
10、 2、 運(yùn)行結(jié)果: 3、 設(shè)計(jì)體會(huì): 本次課程設(shè)計(jì)主要是運(yùn)用本學(xué)期所學(xué)到的Java基礎(chǔ)知識(shí)來(lái)設(shè)計(jì)一個(gè)符合要求的中國(guó)象棋對(duì)弈系統(tǒng),這期間我遇到了很多的困難,發(fā)現(xiàn)了很多的問(wèn)題,正是在解決問(wèn)題的期間我才慢慢地熟悉了Java的基礎(chǔ)知識(shí),才慢慢學(xué)會(huì)了如何去按照給定的要求設(shè)計(jì)出合適的java系統(tǒng)。 通過(guò)本次課程設(shè)計(jì),我明白了一個(gè)道理:無(wú)論做什么事情,都必需養(yǎng)成嚴(yán)謹(jǐn),認(rèn)真,善思的工作作風(fēng)遇到問(wèn)題最好的辦法就是請(qǐng)教別人,因?yàn)槊總€(gè)人掌握的情況都不一樣,一個(gè)人不可能做到處處都懂,必須發(fā)揮群眾的力量,
11、復(fù)雜的事情才能夠簡(jiǎn)單化。這一點(diǎn)我深有體會(huì),在很多時(shí)候,我遇到的困難或許別人之前就遇到過(guò),向他們請(qǐng)教遠(yuǎn)比自己在那邊摸索來(lái)得簡(jiǎn)單,來(lái)得快。 附件 程序代碼: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; import java.io.*; public class Chess{ public static void main(String args[]){ new Ches
12、sMainFrame("中國(guó)象棋:觀(guān)棋不語(yǔ)真君子,棋死無(wú)悔大丈夫"); } } class ChessMainFrame extends JFrame implements ActionListener,MouseListener,Runnable{ //玩家 JLabel play[] = new JLabel[32]; //棋盤(pán) JLabel image; //窗格 Container con; //工具欄 JToolBar jmain; //重新開(kāi)始 JButton anew; //悔棋 JButton repent; //
13、退出 JButton exit; //當(dāng)前信息 JLabel text; //保存當(dāng)前操作 Vector Var; //規(guī)則類(lèi)對(duì)象(使于調(diào)用方法) ChessRule rule; /** ** 單擊棋子 ** chessManClick = true 閃爍棋子 并給線(xiàn)程響應(yīng) ** chessManClick = false 吃棋子 停止閃爍 并給線(xiàn)程響應(yīng) */ boolean chessManClick; /** ** 控制玩家走棋 ** chessPlayClick=1 黑棋走棋 ** chessPlayClick=2 紅
14、棋走棋 默認(rèn)紅棋 ** chessPlayClick=3 雙方都不能走棋 */ int chessPlayClick=2; //控制棋子閃爍的線(xiàn)程 Thread tmain; //把第一次的單擊棋子給線(xiàn)程響應(yīng) static int Man,i; ChessMainFrame(){ new ChessMainFrame("中國(guó)象棋"); } /** ** 構(gòu)造函數(shù) ** 初始化圖形用戶(hù)界面 */ ChessMainFrame(String Title){ //獲行客格引用 con = this.getContentPane(
15、); con.setLayout(null); //實(shí)例化規(guī)則類(lèi) rule = new ChessRule(); Var = new Vector(); //創(chuàng)建工具欄 jmain = new JToolBar(); text = new JLabel("歡迎使用象棋對(duì)弈系統(tǒng)"); //當(dāng)鼠標(biāo)放上顯示信息 text.setToolTipText("信息提示"); anew = new JButton(" 新 游 戲 "); anew.setToolTipText("重新開(kāi)始新的一局"); exit = new JButto
16、n(" 退 出 "); 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.a
17、dd(jmain); //添加棋子標(biāo)簽 drawChessMan(); //注冊(cè)按扭監(jiān)聽(tīng) anew.addActionListener(this); repent.addActionListener(this); exit.addActionListener(this); //注冊(cè)棋子移動(dòng)監(jiān)聽(tīng) for (int i=0;i<32;i++){ con.add(play[i]); play[i].addMouseListener(this); } //添加棋盤(pán)標(biāo)簽 con.add(image = new JLabel
18、(new ImageIcon("image\\Main.GIF"))); image.setBounds(0,30,558,620); image.addMouseListener(this); //注冊(cè)窗體關(guān)閉監(jiān)聽(tīng) this.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent we){ System.exit(0); } } ); //窗體居中 Dimension screenSize = Tool
19、kit.getDefaultToolkit().getScreenSize(); Dimension frameSize = this.getSize(); if (frameSize.height > screenSize.height){ frameSize.height = screenSize.height; } if (frameSize.width > screenSize.width){ frameSize.width = screenSize.width; } this.setLocation((screenSize.widt
20、h - frameSize.width) / 2 - 280 ,(screenSize.height - frameSize.height ) / 2 - 350); //設(shè)置 this.setIconImage(new ImageIcon("image\\紅將.GIF").getImage()); this.setResizable(false); this.setTitle(Title); this.setSize(558,670); this.show(); } /** ** 添加棋子方法 */ public void draw
21、ChessMan(){ //流程控制 int i,k; //圖標(biāo) Icon in; //黑色棋子 //車(chē) in = new ImageIcon("image\\黑車(chē).GIF"); for (i=0,k=24;i<2;i++,k+=456){ play[i] = new JLabel(in); play[i].setBounds(k,56,55,55); play[i].setName("車(chē)1"); } //馬 in = new ImageIcon("image\\黑馬.GIF"); f
22、or (i=4,k=81;i<6;i++,k+=342){ play[i] = new JLabel(in); play[i].setBounds(k,56,55,55); play[i].setName("馬1"); } //相 in = new ImageIcon("image\\黑象.GIF"); for (i=8,k=138;i<10;i++,k+=228){ play[i] = new JLabel(in); play[i].setBounds(k,56,55,55); play[i].setName("象1
23、"); } //士 in = new ImageIcon("image\\黑士.GIF"); for (i=12,k=195;i<14;i++,k+=114){ play[i] = new JLabel(in); play[i].setBounds(k,56,55,55); play[i].setName("士1"); } //卒 in = new ImageIcon("image\\黑卒.GIF"); for (i=16,k=24;i<21;i++,k+=114){ play[i] = new JLabel(in
24、); play[i].setBounds(k,227,55,55); play[i].setName("卒1" + i); } //炮 in = new ImageIcon("image\\黑炮.GIF"); for (i=26,k=81;i<28;i++,k+=342){ play[i] = new JLabel(in); play[i].setBounds(k,170,55,55); play[i].setName("炮1" + i); } //將 in = new ImageIcon("image\\
25、黑將.GIF"); play[30] = new JLabel(in); play[30].setBounds(252,56,55,55); play[30].setName("將1"); //紅色棋子 //車(chē) in = new ImageIcon("image\\紅車(chē).GIF"); for (i=2,k=24;i<4;i++,k+=456){ play[i] = new JLabel(in); play[i].setBounds(k,569,55,55); play[i].setName("車(chē)2"); } //馬
26、 in = new ImageIcon("image\\紅馬.GIF"); for (i=6,k=81;i<8;i++,k+=342){ play[i] = new JLabel(in); play[i].setBounds(k,569,55,55); play[i].setName("馬2"); } //相 in = new ImageIcon("image\\紅象.GIF"); for (i=10,k=138;i<12;i++,k+=228){ play[i] = new JLabel(in); play[i].s
27、etBounds(k,569,55,55); play[i].setName("象2"); } //士 in = new ImageIcon("image\\紅士.GIF"); for (i=14,k=195;i<16;i++,k+=114){ play[i] = new JLabel(in); play[i].setBounds(k,569,55,55); play[i].setName("士2"); } //兵 in = new ImageIcon("image\\紅卒.GIF"); for (i=21,k=2
28、4;i<26;i++,k+=114){ play[i] = new JLabel(in); play[i].setBounds(k,398,55,55); play[i].setName("卒2" + i); } //炮 in = new ImageIcon("image\\紅炮.GIF"); for (i=28,k=81;i<30;i++,k+=342){ play[i] = new JLabel(in); play[i].setBounds(k,455,55,55); play[i].setName("炮2" + i)
29、; } //帥 in = new ImageIcon("image\\紅將.GIF"); play[31] = new JLabel(in); play[31].setBounds(252,569,55,55); play[31].setName("帥2"); } /** ** 線(xiàn)程方法控制棋子閃爍 */ public void run(){ while (true){ //單擊棋子第一下開(kāi)始閃爍 if (chessManClick){ play[Man].setVisible(false);
30、 //時(shí)間控制 try{ tmain.sleep(200); } catch(Exception e){ } play[Man].setVisible(true); } //閃爍當(dāng)前提示信息 以免用戶(hù)看不見(jiàn) else {text.setVisible(false);//時(shí)間控制 try{tmain.sleep(250); } catch(Exception e){ } text.setVisible(true); }
31、 try{tmain.sleep(350); } catch (Exception e){ } } } /** ** 單擊棋子方法*/ public void mouseClicked(MouseEvent me){ System.out.println("Mouse");//當(dāng)前坐標(biāo) int Ex=0,Ey=0; //啟動(dòng)線(xiàn)程 if (tmain == null){ tmain = new Thread(this); tmain.start(); } //單擊棋盤(pán)(移動(dòng)棋子) if (m
32、e.getSource().equals(image)){//該紅棋走棋的時(shí)候 if (chessPlayClick == 2 && play[Man].getName().charAt(1) == 2){ Ex = play[Man].getX(); Ey = play[Man].getY();//移動(dòng)卒、兵 if (Man > 15 && Man < 26){ rule.armsRule(Man,play[Man],me); } //移動(dòng)炮 else if (Man > 25 && Man < 30){
33、 rule.cannonRule(play[Man],play,me); }//移動(dòng)車(chē) else if (Man >=0 && Man < 4){ rule.cannonRule(play[Man],play,me); }//移動(dòng)馬 else if (Man > 3 && Man < 8){ rule.horseRule(play[Man],play,me); }//移動(dòng)相、象 else if (Man > 7 && Man < 12){ rule.elephantRule(Man,play[
34、Man],play,me); }//移動(dòng)仕、士 else if (Man > 11 && Man < 16){ rule.chapRule(Man,play[Man],play,me); }//移動(dòng)將、帥 else if (Man == 30 || Man == 31){ rule.willRule(Man,play[Man],play,me); }//是否走棋錯(cuò)誤(是否在原地沒(méi)有動(dòng)) if (Ex == play[Man].getX() && Ey == play[Man].getY()){
35、 text.setText(" 紅棋走棋"); chessPlayClick=2; } else {text.setText(" 黑棋走棋"); chessPlayClick=1; } }//if//該黑棋走棋的時(shí)候 else if (chessPlayClick == 1 && play[Man].getName().charAt(1) == 1){ Ex = play[Man].getX(); Ey = play[Man].getY();//
36、移動(dòng)卒、兵 if (Man > 15 && Man < 26){ rule.armsRule(Man,play[Man],me); }//移動(dòng)炮 else if (Man > 25 && Man < 30){ rule.cannonRule(play[Man],play,me); }//移動(dòng)車(chē) else if (Man >=0 && Man < 4){ rule.cannonRule(play[Man],play,me); }//移動(dòng)馬 else if (Man > 3 && Man <
37、8){ rule.horseRule(play[Man],play,me); }//移動(dòng)相、象 else if (Man > 7 && Man < 12){ rule.elephantRule(Man,play[Man],play,me); }//移動(dòng)仕、士 else if (Man > 11 && Man < 16){ rule.chapRule(Man,play[Man],play,me); }//移動(dòng)將、帥 else if (Man == 30 || Man == 31){ rul
38、e.willRule(Man,play[Man],play,me); }//是否走棋錯(cuò)誤(是否在原地沒(méi)有動(dòng)) if (Ex == play[Man].getX() && Ey == play[Man].getY()){ text.setText(" 黑棋走棋"); chessPlayClick=1; } else {text.setText(" 紅棋走棋"); chessPlayClick=2; }}//else if //當(dāng)前沒(méi)有操作(停止閃爍)
39、 chessManClick=false; }//if//單擊棋子 else{//第一次單擊棋子(閃爍棋子) if (!chessManClick){ for (int i=0;i<32;i++){ //被單擊的棋子 if (me.getSource().equals(play[i])){ //告訴線(xiàn)程讓該棋子閃爍 Man=i; //開(kāi)始閃爍 chessManClick=true; break; } }//for }//if
40、//第二次單擊棋子(吃棋子) else if (chessManClick){//當(dāng)前沒(méi)有操作(停止閃爍) chessManClick=false; for (i=0;i<32;i++){ //找到被吃的棋子 if (me.getSource().equals(play[i])){ //該紅棋吃棋的時(shí)候 if (chessPlayClick == 2 && play[Man].getName().charAt(1) == 2){ Ex = play[Man].getX(); Ey =
41、 play[Man].getY(); //卒、兵吃規(guī)則 if (Man > 15 && Man < 26){ rule.armsRule(play[Man],play[i]); } //炮吃規(guī)則 else if (Man > 25 && Man < 30){ rule.cannonRule(0,play[Man],play[i],play,me); } //車(chē)吃規(guī)則 else if (Man >=0 &
42、& Man < 4){ rule.cannonRule(1,play[Man],play[i],play,me); } //馬吃規(guī)則 else if (Man > 3 && Man < 8){ rule.horseRule(play[Man],play[i],play,me); } //相、象吃規(guī)則 else if (Man > 7 && Man < 12){ rule.elephantRule(play[Man],play[i],play);
43、 } //士、仕吃棋規(guī)則 else if (Man > 11 && Man < 16){ rule.chapRule(Man,play[Man],play[i],play); } //將、帥吃棋規(guī)則 else if (Man == 30 || Man == 31){ rule.willRule(Man,play[Man],play[i],play); play[Man].setVisible(true); } /
44、/是否走棋錯(cuò)誤(是否在原地沒(méi)有動(dòng)) if (Ex == play[Man].getX() && Ey == play[Man].getY()){ text.setText(" 紅棋走棋"); chessPlayClick=2; break; } else{text.setText(" 黑棋走棋"); chessPlayClick=1;break; } }//if //該黑棋吃
45、棋的時(shí)候 else if (chessPlayClick == 1 && play[Man].getName().charAt(1) == 1){ Ex = play[Man].getX(); Ey = play[Man].getY(); //卒吃規(guī)則 if (Man > 15 && Man < 26){ rule.armsRule(play[Man],play[i]); } //炮吃規(guī)則 else if (Man > 25 && Man < 30){
46、 rule.cannonRule(0,play[Man],play[i],play,me); }//車(chē)吃規(guī)則 else if (Man >=0 && Man < 4){ rule.cannonRule(1,play[Man],play[i],play,me); }//馬吃規(guī)則 else if (Man > 3 && Man < 8){ rule.horseRule(play[Man],play[i],play,me); } //相、象吃規(guī)則
47、 else if (Man > 7 && Man < 12){ rule.elephantRule(play[Man],play[i],play); } //士、仕吃棋規(guī)則 else if (Man > 11 && Man < 16){ rule.chapRule(Man,play[Man],play[i],play); } //將、帥吃棋規(guī)則 else if (Man == 30 || Man == 31){ rule.willRul
48、e(Man,play[Man],play[i],play); play[Man].setVisible(true); } //是否走棋錯(cuò)誤(是否在原地沒(méi)有動(dòng)) if (Ex == play[Man].getX() && Ey == play[Man].getY()){text.setText(" 黑棋走棋"); chessPlayClick=1;break; } else { text.setText("
49、紅棋走棋"); chessPlayClick=2; break; } }//else if }//if }//for //是否勝利 if (!play[31].isVisible()){ JOptionPane.showConfirmDialog( this,"黑棋勝利","玩家一勝利", JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE); //雙方都不可以在走棋了
50、 chessPlayClick=3; text.setText(" 黑棋勝利"); }//if else if (!play[30].isVisible()){ JOptionPane.showConfirmDialog( this,"紅棋勝利","玩家二勝利", JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE); chessPlayClick=3; text.setText(" 紅棋勝利"); }//else if }//
51、else }//else } public void mousePressed(MouseEvent me){} public void mouseReleased(MouseEvent me){} public void mouseEntered(MouseEvent me){} public void mouseExited(MouseEvent me){} /** ** 定義按鈕的事件響應(yīng) */ public void actionPerformed(ActionEvent ae) {//重新開(kāi)始按鈕 if (ae.getSource(
52、).equals(anew)){int i,k; //重新排列每個(gè)棋子的位置 //黑色棋子 //車(chē) for (i=0,k=24;i<2;i++,k+=456){play[i].setBounds(k,56,55,55); } //馬 for (i=4,k=81;i<6;i++,k+=342){play[i].setBounds(k,56,55,55); }//相 for (i=8,k=138;i<10;i++,k+=228){ play[i].setBounds(k,56,55,55); }//士 fo
53、r (i=12,k=195;i<14;i++,k+=114){ play[i].setBounds(k,56,55,55); }//卒 for (i=16,k=24;i<21;i++,k+=114){ play[i].setBounds(k,227,55,55);} //炮 for (i=26,k=81;i<28;i++,k+=342){ play[i].setBounds(k,170,55,55);} //將 play[30].setBounds(252,56,55,55); //紅色棋子 //車(chē)
54、 for (i=2,k=24;i<4;i++,k+=456){ play[i].setBounds(k,569,55,55);}//馬 for (i=6,k=81;i<8;i++,k+=342){ play[i].setBounds(k,569,55,55);}//相 for (i=10,k=138;i<12;i++,k+=228){ play[i].setBounds(k,569,55,55);}//士 for (i=14,k=195;i<16;i++,k+=114){ play[i].setBounds(k,569,55,55
55、);}//兵 for (i=21,k=24;i<26;i++,k+=114){ play[i].setBounds(k,398,55,55);}//炮 for (i=28,k=81;i<30;i++,k+=342){ play[i].setBounds(k,455,55,55);}//帥 play[31].setBounds(252,569,55,55); chessPlayClick = 2; text.setText(" 紅棋走棋"); for (i=0;i<32;i++){ play[
56、i].setVisible(true);}//清除Vector中的內(nèi)容 Var.clear();}//悔棋按鈕 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(V
57、ar.size()-2));//獲得索引 int M = Integer.parseInt((String)Var.get(Var.size()-1)); //賦給棋子 play[M].setVisible(true); play[M].setBounds(x,y,55,55); if (play[M].getName().charAt(1) == 1){ text.setText(" 黑棋走棋"); chessPlayClick = 1;} else{text.setText("
58、 紅棋走棋"); chessPlayClick = 2;}//刪除用過(guò)的坐標(biāo) Var.remove(Var.size()-4); Var.remove(Var.size()-3); Var.remove(Var.size()-2); Var.remove(Var.size()-1);//停止旗子閃爍 chessManClick=false;} catch(Exception e){}}//退出 else if (ae.getSource().equals(exit)){ int j=JO
59、ptionPane.showConfirmDialog(this,"真的要退出嗎?","退出", JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE); if (j == JOptionPane.YES_OPTION){System.exit(0);}}} /*定義中國(guó)象棋規(guī)則的類(lèi)*/ class ChessRule {/**卒子的移動(dòng)規(guī)則*/ public void armsRule(int Man,JLabel play,MouseEvent me){//黑卒向下 if (Man < 21){//向下移
60、動(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(String.valueOf(play.isVisible())); Var.add(String.valueOf(play.getX())); Var.add(String.valueOf(p
61、lay.getY())); Var.add(String.valueOf(Man)); play.setBounds(play.getX(),play.getY()+57,55,55);} //向右移動(dòng)、得到終點(diǎn)的坐標(biāo)模糊成合法的坐標(biāo)、必須過(guò)河 else if (play.getY() > 284 && (me.getX() - play.getX()) >= 57 && (me.getX() - play.getX()) <= 112){play.setBounds(play.getX()+57,play.getY(),55,55); }//向左移動(dòng)、
62、得到終點(diǎn)的坐標(biāo)模糊成合法的坐標(biāo)、必須過(guò)河 else if (play.getY() > 284 && (play.getX() - me.getX()) >= 2 && (play.getX() - me.getX()) <=58){//模糊坐標(biāo) play.setBounds(play.getX()-57,play.getY(),55,55);}}//紅卒向上 else{//當(dāng)前記錄添加到集合(用于悔棋) Var.add(String.valueOf(play.isVisible())); Var.add(String.valueOf(play
63、.getX())); Var.add(String.valueOf(play.getY())); Var.add(String.valueOf(Man)); //向上移動(dòng)、得到終點(diǎn)的坐標(biāo)模糊成合法的坐標(biāo) if ((me.getX()-play.getX()) >= 0 && (me.getX()-play.getX()) <= 55 && (play.getY()-me.getY()) >27 && play.getY()-me.getY() < 86){ play.setBounds(play.getX(),play.getY()-57,5
64、5,55);}//向右移動(dòng)、得到終點(diǎn)的坐標(biāo)模糊成合法的坐標(biāo)、必須過(guò)河 else if (play.getY() <= 341 && (me.getX() - play.getX()) >= 57 && (me.getX() - play.getX()) <= 112){ play.setBounds(play.getX()+57,play.getY(),55,55);} //向左移動(dòng)、得到終點(diǎn)的坐標(biāo)模糊成合法的坐標(biāo)、必須過(guò)河 else if (play.getY() <= 341 && (play.getX() - me.getX()) >= 3 && (
65、play.getX() - me.getX()) <=58){ play.setBounds(play.getX()-57,play.getY(),55,55); }}}//卒移動(dòng)結(jié)束/**卒吃棋規(guī)則*/ public void armsRule(JLabel play1,JLabel play2){//向右走 if ((play2.getX() - play1.getX()) <= 112 && (play2.getX() - play1.getX()) >= 57 && (play1.getY() - play2.getY()) < 22 && (pla
66、y1.getY() - play2.getY()) > -22 && play2.isVisible() && play1.getName().charAt(1)!=play2.getName().charAt(1)){//黑棋要過(guò)河才能右吃棋 if (play1.getName().charAt(1) == 1 && play1.getY() > 284 && play1.getName().charAt(1) != play2.getName().charAt(1)){ play2.setVisible(false);//把對(duì)方的位置給自己 play1.setBounds(play2.getX(),play2.getY(),55,55);} //紅棋要過(guò)河才左能吃棋 else if (play1.getName().charAt(1) == 2 && play1.getY() < 341 &&play1.getName().charAt(1) != play2.getName().charAt(1)){play
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 110中國(guó)人民警察節(jié)(筑牢忠誠(chéng)警魂感受別樣警彩)
- 2025正字當(dāng)頭廉字入心爭(zhēng)當(dāng)公安隊(duì)伍鐵軍
- XX國(guó)企干部警示教育片觀(guān)后感筑牢信仰之基堅(jiān)守廉潔底線(xiàn)
- 2025做擔(dān)當(dāng)時(shí)代大任的中國(guó)青年P(guān)PT青年思想教育微黨課
- 2025新年工作部署會(huì)圍繞六個(gè)干字提要求
- XX地區(qū)中小學(xué)期末考試經(jīng)驗(yàn)總結(jié)(認(rèn)真復(fù)習(xí)輕松應(yīng)考)
- 支部書(shū)記上黨課筑牢清廉信念為高質(zhì)量發(fā)展?fàn)I造風(fēng)清氣正的環(huán)境
- 冬季消防安全知識(shí)培訓(xùn)冬季用電防火安全
- 2025加強(qiáng)政治引領(lǐng)(政治引領(lǐng)是現(xiàn)代政黨的重要功能)
- 主播直播培訓(xùn)直播技巧與方法
- 2025六廉六進(jìn)持續(xù)涵養(yǎng)良好政治生態(tài)
- 員工職業(yè)生涯規(guī)劃方案制定個(gè)人職業(yè)生涯規(guī)劃
- 2024年XX地區(qū)黨建引領(lǐng)鄉(xiāng)村振興工作總結(jié)
- XX中小學(xué)期末考試經(jīng)驗(yàn)總結(jié)(認(rèn)真復(fù)習(xí)輕松應(yīng)考)
- 幼兒園期末家長(zhǎng)會(huì)長(zhǎng)長(zhǎng)的路慢慢地走