中國象棋對弈系統(tǒng)--Java課程設計_第1頁
中國象棋對弈系統(tǒng)--Java課程設計_第2頁
中國象棋對弈系統(tǒng)--Java課程設計_第3頁
中國象棋對弈系統(tǒng)--Java課程設計_第4頁
中國象棋對弈系統(tǒng)--Java課程設計_第5頁
已閱讀5頁,還剩68頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 面向對象程序設計課程設計報告題 目: 中國象棋對弈軟件設計與實現(xiàn) 院 (系): 信息科學與工程學院 專業(yè)班級: 計算機科學與技術1201班 學生姓名: 程偉 學 號: 指導教師: 吳奕 20 14 年 12 月 29 日至20 15 年 1 月 9日華中科技大學武昌分校制 面向對象程序設計 課程設計任務書一、設計(調查報告/論文)題目中國象棋對弈軟件設計與實現(xiàn)二、設計(調查報告/論文)主要內容內容:利用Java實現(xiàn)一個中國象棋對弈的軟件,實現(xiàn)中國象棋的規(guī)則。中國象棋的棋盤是方形的,棋盤的中間有一條“界河”,把對壘的雙方隔在兩邊。兩邊畫有交叉線的交叉點共有90個,棋子就擺在這些交叉點上。中國象

2、棋共有32枚棋子,分為黑紅兩組,下棋的雙方各用一組,每組各有一帥(將)兩士兩相兩馬兩車兩炮五兵。兩人對局時,按照規(guī)定的位置將各自的棋子擺好,紅方先走,然后輪流下子。各種棋子走法不同,最后把對方將死為勝,不分勝負則為和棋。系統(tǒng)使用Eclipse與JDK1.6工具,操作系統(tǒng)為WINDOWS,采用面向對象方法完成,包括總體設計、詳細設計、編碼實現(xiàn)、測試。 基本功能與要求:1象棋對弈。首先紅方走棋,然后黑方走棋,直到一方獲勝。2.象棋規(guī)則。依據中國象棋的規(guī)則。3新游戲。任何時候都可以重新開始一盤新的對弈。4悔棋。當走錯棋的時候可以悔棋。5 .信息提示。提示當前信息狀態(tài)。三、原始資料1.面向對象程序設計

3、課程設計指導書2. 耿祥義JAVA大學實用教程北京:清華大學出版社,2009四、要求的設計(調查/論文)成果1.課程設計報告2.課程設計軟件五、進程安排布置任務,查找資料、需求分析1天總體設計1天詳細設計1.5天編制源程序實現(xiàn)3.5天測試與修改1天撰寫課設報告2天六、主要參考資料1 張廣彬. Java課程設計案例精編(第二版).北京:清華大學出版社, 2011. 2 耿祥義. Java課程設計(第二版).北京:清華大學出版社, 2008.3 耿祥義JAVA大學實用教程北京:清華大學出版社,20094 鄒林達陳國君 Java2程序設計基礎北京:清華大學出版社,20105 鄒林達Java2程序設計

4、基礎實驗指導北京:清華大學,2010指導教師(簽名): 20 年 月 日目 錄1需求與總體設計11.1需求分析11.2總體設計22詳細設計32.1詳細設計思路33編碼實現(xiàn)83.1 源程序代碼84系統(tǒng)運行與測試61總 結651需求與總體設計各種中國象棋軟件的開發(fā)與應用,尤其是在網絡方面的推廣,使得中國象棋得到了很好的宣傳,全面展示了中國象棋的風采、優(yōu)點與特色,同時也讓外國人認識到中國象棋這一我國的“國粹”。中國象棋打譜系統(tǒng)正是為這一可行性而開發(fā)設計的,玩家可以通過它很好的研究棋譜,學習中國象棋技術,提高水平。1.1需求分析實現(xiàn)一個中國象棋對弈的軟件,實現(xiàn)中國象棋的規(guī)則:棋子共有三十二個,分為紅、

5、黑兩組,每組十六個,各分七種,其名稱和數(shù)目如下所述。(1) 紅棋子:帥一人,車、馬、炮、相、士各兩個,兵五個。(2)黑棋子:將一個,車、馬、炮、象、士各兩個,卒五個。(3)在對局時,由執(zhí)紅棋的一方先走,雙方輪流各走一著,直至分出勝負或走成和棋為止。輪到走棋的一方,將某個棋子從一個交叉點到另一個空著的交叉點,或者吃掉對方的棋子而占領叉點,都算走了一著。雙方各走了一著,稱為一個回合。(4)帥(將)每一著只許走一步,前進、后退、橫走都可以,但不能走出“九宮”。帥和將不準在同一直線上直接對面,如一方已先占據,另一方必須回避。(5)士每一著只許沿“九宮”斜線走一步,可進可退。相(象)不能越過“河界”,每

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

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

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

9、。程序中Chess類通過生成ChessMainFrame類的對象來執(zhí)行程序。ChessMainFrame類主要包含四個模塊:生成圖形用戶界面模塊,完成按鈕的操作模塊,棋子操作模塊和棋子的移動規(guī)則模塊。其中其中棋子的移動規(guī)則被定義為內部類,名為ChessRule。ChessRule類中的方法用于定義各個棋子的移動規(guī)則和吃子規(guī)則??傮w設計流程圖如圖2-1所示。圖2-1 總體設計流程 (1)圖形用戶界面模塊 圖形用戶界面是ChessMainFrame類中的基本模塊,它的主要作用是定義該類中所使用的變量和實例對象,通過構造函數(shù)初始化圖形用戶界面,添加組件和棋子,注冊事件組件。(2)按鈕的操作模塊 程序

10、中有三個按鈕,分別為“新游戲”按鈕,“悔棋”按鈕和“退出”按鈕。單擊“新游戲”按鈕時,程序重新布置棋子,并將保存當前操作Vector(向量)清空;單擊“悔棋”按鈕時,調用Vector中的數(shù)據進行悔棋操作;單擊“退出”向量按鈕時,程序會詢問是否退出,選“是”則退出對弈。流程圖如圖2-2所示。圖2-2 按鈕模塊流程圖(3)棋子的操作模塊棋子的操作模塊定義了線程,單擊棋子的時候,可以使棋子閃爍以實現(xiàn)棋子已經被選取的效果,單擊棋子或移動時,根據棋子的編號來判斷使用規(guī)則進行移動或吃子。需要注意的是,移動和吃子是調用規(guī)則類模塊完成的。流程圖如圖2-3所示:圖2-3 棋子操作模塊流程圖(4)棋子的移動規(guī)則類

11、模塊移動規(guī)則類ChessRule分別定義中國象棋32個棋子的移動規(guī)則。32個棋子可分為6類棋子。每一類棋子各有兩個方法,定義這類棋子的移動規(guī)則和吃子規(guī)則。棋子的移動規(guī)則如下所述。 帥(將)每次只許走一步,前進、后退、橫走都可以,但不能走出“九宮”。將和帥不準在同一直線上面對面,如一方已占據,另一方就必須回避。 士每次只許沿“九宮”斜線走一步,可進可退。 相(相)不能越過“河界”,每一次斜走兩步,可進可退,即俗稱“相(象)走田”。當田字中心有別的棋子時,俗稱“塞相(象)眼”,則不許走過去。 馬每次走一直(或一橫)一斜,可進可退,即俗稱“馬走日”。如果在要去的方向有別的棋子擋住。俗稱“蹩馬腿”,則

12、不許走過去。 車每次可以直進、直退、橫走,不限步數(shù)。炮在不吃子的時候,走法同車一樣。兵(卒)在沒有過“河界”前,每次只許向前直走一步;過“ 河界”后,每次可向前直走或橫走一步,但不能后退。吃子規(guī)則:在走棋時,如果棋子能夠走到的位置有對方棋子存在,就可以把對方棋子吃掉而占領那個位置。只有炮在吃子時必須隔一個棋子跳吃,即俗稱“炮打隔子”。 帥(將)外其他棋子都可以聽任對方吃。吃子的一方必須立即把被吃掉的子從棋盤上拿掉。3編碼實現(xiàn)源代碼/* *中國象棋Java版 *作者:程偉 *源文件:Chess.java *添加功能:實現(xiàn)了當前棋局的保存 */import java.awt.*;import ja

13、va.awt.event.*;import javax.swing.*;import java.util.*;/主類public class Chesspublic static void main(String args)new ChessMainFrame(中國象棋:觀棋不語真君子,棋死無悔大丈夫);/主框架類class ChessMainFrame extends JFrame implements ActionListener,MouseListener,Runnable/玩家JLabel play = new JLabel32;/棋盤JLabel image;/窗格Container

14、 con;/工具欄JToolBar jmain;/重新開始JButton anew;/悔棋JButton repent;/退出JButton exit;/當前信息JLabel text;/保存當前操作Vector Var;/規(guī)則類對象(使于調用方法)ChessRule rule;/* 單擊棋子* chessManClick = true 閃爍棋子 并給線程響應* chessManClick = false 吃棋子 停止閃爍 并給線程響應*/boolean chessManClick;/* 控制玩家走棋* chessPlayClick=1 黑棋走棋* chessPlayClick=2 紅棋走棋

15、默認紅棋* chessPlayClick=3 雙方都不能走棋*/int chessPlayClick=2;/控制棋子閃爍的線程Thread tmain;/把第一次的單擊棋子給線程響應static int Man,i;ChessMainFrame()new ChessMainFrame(中國象棋);/* 構造函數(shù)* 初始化圖形用戶界面*/ChessMainFrame(String Title)/獲行客格引用con = this.getContentPane();con.setLayout(null);/實例化規(guī)則類rule = new ChessRule();Var = new Vector()

16、;/創(chuàng)建工具欄jmain = new JToolBar();text = new JLabel(歡迎使用象棋對弈系統(tǒng));/當鼠標放上顯示信息text.setToolTipText(信息提示);anew = new JButton( 新 游 戲 );anew.setToolTipText(重新開始新的一局);exit = new JButton( 退 出 );exit.setToolTipText(退出象棋程序程序);repent = new JButton( 悔 棋 );repent.setToolTipText(返回到上次走棋的位置);/把組件添加到工具欄jmain.setLayout(ne

17、w GridLayout(0,4);jmain.add(anew);jmain.add(repent);jmain.add(exit);jmain.add(text);jmain.setBounds(0,0,558,30);con.add(jmain);/添加棋子標簽drawChessMan();/注冊按扭監(jiān)聽anew.addActionListener(this);repent.addActionListener(this);exit.addActionListener(this);/注冊棋子移動監(jiān)聽for (int i=0;i screenSize.height)frameSize.hei

18、ght = screenSize.height;if (frameSize.width screenSize.width)frameSize.width = screenSize.width;this.setLocation(screenSize.width - frameSize.width) / 2 - 280 ,(screenSize.height - frameSize.height ) / 2 - 350);/設置this.setIconImage(new ImageIcon(image紅將.GIF).getImage();this.setResizable(false);this.

19、setTitle(Title);this.setSize(558,670);this.show();/* 添加棋子方法*/public void drawChessMan()/流程控制int i,k;/圖標Icon in;/黑色棋子/車in = new ImageIcon(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黑馬.GIF);for (i=4,k=81;i6;i+,

20、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;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

21、.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);playi.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.s

22、etName(炮1 + i);/將in = new ImageIcon(image黑將.GIF);play30 = new JLabel(in);play30.setBounds(252,56,55,55);play30.setName(將1);/紅色棋子/車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=

23、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);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

24、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)playi = 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

25、 & Man 25 & Man =0 & Man 3 & Man 7 & Man 11 & Man 16)rule.chapRule(Man,playMan,play,me);/移動將、帥else if (Man = 30 | Man = 31)rule.willRule(Man,playMan,play,me);/是否走棋錯誤(是否在原地沒有動)if (Ex = playMan.getX() & Ey = playMan.getY()text.setText( 黑棋走棋);chessPlayClick=1;else text.setText( 紅棋走棋);chessPlayClick=2;/

26、else if/當前沒有操作(停止閃爍)chessManClick=false;/if/單擊棋子else/第一次單擊棋子(閃爍棋子)if (!chessManClick)for (int i=0;i32;i+)/被單擊的棋子if (me.getSource().equals(playi)/告訴線程讓該棋子閃爍Man=i;/開始閃爍chessManClick=true;break;/for/if/第二次單擊棋子(吃棋子)else if (chessManClick)/當前沒有操作(停止閃爍)chessManClick=false;for (i=0;i 15 & Man 25 & Man =0 &

27、 Man 3 & Man 7 & Man 11 & Man 15 & Man 25 & Man =0 & Man 3 & Man 7 & Man 11 & Man 16)rule.chapRule(Man,playMan,playi,play);/將、帥吃棋規(guī)則else if (Man = 30 | Man = 31)rule.willRule(Man,playMan,playi,play);playMan.setVisible(true);/是否走棋錯誤(是否在原地沒有動)if (Ex = playMan.getX() & Ey = playMan.getY()text.setText( 黑

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

29、()JOptionPane.showConfirmDialog(this,紅棋勝利,玩家二勝利,JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);chessPlayClick=3;text.setText( 紅棋勝利);/else if/else/elsepublic void mousePressed(MouseEvent me)public void mouseReleased(MouseEvent me)public void mouseEntered(MouseEvent me)public void mouseExited

30、(MouseEvent me)/* 定義按鈕的事件響應*/public void actionPerformed(ActionEvent ae) /重新開始按鈕if (ae.getSource().equals(anew)int i,k;/重新排列每個棋子的位置/黑色棋子/車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,5

31、6,55,55);/士for (i=12,k=195;i14;i+,k+=114)playi.setBounds(k,56,55,55);/卒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);/紅色棋子/車for (i=2,k=24;i4;i+,k+=456)playi.setBounds(k,569,55,55);/馬for (i=6,k=81

32、;i8;i+,k+=342)playi.setBounds(k,569,55,55);/相for (i=10,k=138;i12;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);chessPl

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論