java象棋課程設(shè)計(jì)_第1頁
java象棋課程設(shè)計(jì)_第2頁
java象棋課程設(shè)計(jì)_第3頁
java象棋課程設(shè)計(jì)_第4頁
java象棋課程設(shè)計(jì)_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上課程名稱: JAVA課程設(shè)計(jì) 題 目: “網(wǎng)絡(luò)象棋”游戲的設(shè)計(jì)與開發(fā)系 名: 信息工程系 專業(yè)班級: 軟件工程 姓 名: 學(xué) 號: 指導(dǎo)教師: 2012年 6 月 18 日課程設(shè)計(jì)任務(wù)書學(xué)生姓名: 專業(yè)班級: 指導(dǎo)教師: 工作單位: 信息工程系 設(shè)計(jì)題目:“網(wǎng)絡(luò)象棋”游戲的設(shè)計(jì)與開發(fā)初始條件: 網(wǎng)絡(luò)象棋,網(wǎng)絡(luò)版的棋類游戲。要求完成的主要任務(wù):(包括課程設(shè)計(jì)工作量及其技術(shù)要求,以及說明書撰寫等具體要求)使用JAVA開發(fā)一個(gè)網(wǎng)絡(luò)版的象棋游戲。該游戲包括網(wǎng)絡(luò)功能,棋盤功能和輔助功能。本系統(tǒng)使用JAVA SWING技術(shù)和事件處理機(jī)制進(jìn)行棋盤界面的設(shè)計(jì),開發(fā)和功能實(shí)現(xiàn), 使用S

2、ocket網(wǎng)絡(luò)編程和多線程技術(shù)進(jìn)行多客戶端之間的對戰(zhàn)。系統(tǒng)總體架構(gòu)如下:網(wǎng)絡(luò)象棋網(wǎng)絡(luò)管理棋盤功能輔助功能系統(tǒng)功能點(diǎn)說明如下:編號功能名功能描述1網(wǎng)絡(luò)功能通過網(wǎng)絡(luò)通信,實(shí)現(xiàn)多客戶端對戰(zhàn)2棋盤功能繪制棋盤繪制棋盤與棋子下棋功能點(diǎn)擊棋子,可以走動下棋規(guī)則設(shè)計(jì)相應(yīng)算法,控制不同棋子的走法3輔助功能悔棋通過記錄走棋步驟,實(shí)現(xiàn)悔棋截屏關(guān)鍵步驟,實(shí)現(xiàn)截屏錄制可以錄制每一步下棋的視頻4系統(tǒng)打包系統(tǒng)打包,制作安裝程序設(shè)計(jì)報(bào)告撰寫格式要求:一、課程設(shè)計(jì)說明書(或報(bào)告書)正文內(nèi)容【設(shè)計(jì)題目】例如:“即時(shí)通”網(wǎng)絡(luò)通信系統(tǒng)的設(shè)計(jì)與開發(fā)【開發(fā)環(huán)境】硬件環(huán)境:微機(jī)系列,內(nèi)存在1G以上,軟件環(huán)境:Microsoft Wind

3、ows XP【開發(fā)工具】 NetBeans IDE【完成時(shí)間】 2012.6 .4-2012.6.15【需求分析】分析闡述要實(shí)現(xiàn)的系統(tǒng)應(yīng)具有什么樣的功能?!鞠到y(tǒng)總體設(shè)計(jì)方案】在明確了所要解決的問題后,很自然地就要提出自己解決問題的思路和方案。讓讀者了解方案的總體設(shè)計(jì)和關(guān)鍵技術(shù)。要闡述自己的設(shè)計(jì)方案,說明為什么要選擇或設(shè)計(jì)這樣的方案。具體包括:系統(tǒng)總的設(shè)計(jì)思路,體系結(jié)構(gòu), 總體架構(gòu), 功能模塊圖;各功能模塊所要達(dá)到的設(shè)計(jì)目標(biāo)的簡單介紹;設(shè)計(jì)的數(shù)據(jù)字典(數(shù)據(jù)庫、表的結(jié)構(gòu));使用的設(shè)計(jì)軟硬件環(huán)境和開發(fā)技術(shù)和平臺等?!鞠到y(tǒng)詳細(xì)設(shè)計(jì)】在這部分中,要將整個(gè)開發(fā)工作的內(nèi)容進(jìn)行詳細(xì)的介紹。一般按照功能模塊分成

4、幾部分來介紹。每部分應(yīng)包括文字?jǐn)⑹?、界面圖片、關(guān)鍵實(shí)現(xiàn)技術(shù)(操作或代碼)等幾個(gè)方面綜合說明問題。【系統(tǒng)調(diào)試和測試】調(diào)試:介紹設(shè)計(jì)過程中遇到的問題和解決方法。測試:介紹如何測試系統(tǒng),測試中發(fā)現(xiàn)的問題和解決方案?!窘Y(jié)束語】這部分篇幅不大,對整個(gè)設(shè)計(jì)中做的工作、獲得的成果、心得體會等做一個(gè)簡單小結(jié)?!緟⒖嘉墨I(xiàn)】羅列在設(shè)計(jì)過程中查閱的文獻(xiàn)名稱 注意:參考文獻(xiàn)羅列的格式為 資料編號作者姓名文獻(xiàn)或期刊名稱出版社名稱,文獻(xiàn)的出版時(shí)間或期刊的期號例如:文獻(xiàn) 1 呂鳳翥,馬皓. Java語言程序設(shè)計(jì)(第2版)M.北京:清華大學(xué)出版社,2010 期刊 2 石振國. 用JSP實(shí)現(xiàn)對Web數(shù)據(jù)庫的訪問J. 計(jì)算機(jī)應(yīng)用

5、,2010(05):5-8.二、課程設(shè)計(jì)說明書(或報(bào)告書)正文的書寫格式簡介一、 正文標(biāo)題層次 正文題序?qū)哟问俏恼陆Y(jié)構(gòu)的框架,一般采用社會通用的論文書寫形式。即章條序碼統(tǒng)一用阿拉伯?dāng)?shù)字表示,題序?qū)哟慰梢苑譃槿舾杉?,各級號碼之間加小圓點(diǎn),末尾一級的后面不加小圓點(diǎn),層次分級一般不超過四級為宜,示例如下:第一級(章) 1 2 3 第二級(條)1.1 3.1 3.2 第三級(條).2 ..2 ..2 .2 二、表格 每個(gè)表格應(yīng)有自己的表序與表題,表序與表題間空一格。例如:表1.1 X

6、XXX ,且表題與表序應(yīng)寫在表格的上方正中處。三、插圖 插圖圖面要整齊、美觀,插圖應(yīng)與正文呼應(yīng),不能脫節(jié)。每幅插圖應(yīng)有圖序與圖題,圖序編號要連續(xù),圖序與圖題間空一格且要放在插圖下方居中處。四、公式 公式應(yīng)另起一行寫在稿紙的中央。時(shí)間安排:日期任務(wù)課程內(nèi)容6.18-19棋盤界面的繪制Eclipse/NetBeans使用Swing技術(shù)6.19-20實(shí)現(xiàn)棋子的走動事件代理 6.20-21棋子規(guī)則實(shí)現(xiàn)Socket,Thread,JavaOOJAVA數(shù)據(jù)結(jié)構(gòu)6.25輔助功能實(shí)現(xiàn)6.26-27網(wǎng)絡(luò)通訊6.28系統(tǒng)打包 驗(yàn)收install4j使用 指 導(dǎo) 教 師 簽 字: 2012 年 6 月 14 日系

7、主 任 簽 字: 2012 年 6 月 15 日1 目標(biāo)用JAVA開發(fā)一個(gè)象棋游戲。讓我們熟悉JAVA基本事件處理,學(xué)會java面向?qū)ο蟮脑O(shè)計(jì)。以及java各種控件及圖像用戶的界面的設(shè)計(jì)使用,分別掌握基本工具繼承抽象類 接口。輸入輸出,流程控制,開發(fā)環(huán)境,實(shí)現(xiàn)簡單的功能設(shè)計(jì),幫助熟練的掌握有關(guān)java的知識結(jié)構(gòu)體系。通過實(shí)習(xí)掌握語言的語法結(jié)構(gòu),理解類和對象的概念,準(zhǔn)確的使用各種數(shù)據(jù)類型,對面向?qū)ο笾械睦^承和多態(tài)的概念要理解、會使用,在程序中提高代碼的重用性,使設(shè)計(jì)的程序結(jié)構(gòu)清晰、易于維護(hù)。2 軟件開發(fā)環(huán)境與技術(shù)簡介2.1 開發(fā)工具介紹EclipseEclipse 是一個(gè)開放源代碼的、基于Jav

8、a的可擴(kuò)展開發(fā)平臺。就其本身而言,它只是一個(gè)框架和一組服務(wù),用于通過插件組件構(gòu)建開發(fā)環(huán)境。幸運(yùn)的是,Eclipse 附帶了一個(gè)標(biāo)準(zhǔn)的插件集,包括Java開發(fā)工具(Java Development Kit,JDK)。雖然大多數(shù)用戶很樂于將 Eclipse 當(dāng)作 Java 集成開發(fā)環(huán)境(IDE)來使用,但 Eclipse 的目標(biāo)卻不僅限于此。Eclipse 還包括插件開發(fā)環(huán)境(Plug-in Development Environment,PDE),這個(gè)組件主要針對希望擴(kuò)展 Eclipse 的軟件開發(fā)人員,因?yàn)樗试S他們構(gòu)建與 Eclipse 環(huán)境無縫集成的工具。由于 Eclipse 中的每樣?xùn)|西

9、都是插件,對于給 Eclipse 提供插件,以及給用戶提供一致和統(tǒng)一的集成開發(fā)環(huán)境而言,所有工具開發(fā)人員都具有同等的發(fā)揮場所。這種平等和一致性并不僅限于 Java 開發(fā)工具。盡管 Eclipse 是使用 Java 語言開發(fā)的,但它的用途并不限于 Java 語言;例如,支持諸如 C/C+ 和 COBOL 等編程語言的插件已經(jīng)可用,或預(yù)計(jì)將會推出。Eclipse 框架還可用來作為與軟件開發(fā)無關(guān)的其他應(yīng)用程序類型的基礎(chǔ),比如內(nèi)容管理系統(tǒng)。2.2 硬件環(huán)境1操作系統(tǒng):Microsoft Windows XP。2內(nèi)存:1G內(nèi)存以上。2.3 軟件環(huán)境開發(fā)工具選用Eclipse3 系統(tǒng)需求分析提供棋盤和棋子

10、;設(shè)定棋子的走棋規(guī)則;該哪方走棋時(shí),旁邊會有提示哪方走棋;可以悔棋; 判斷勝負(fù);4 系統(tǒng)總體設(shè)計(jì)4.1棋盤模板中國象棋是雙方在有著9調(diào)豎線和10條橫線的棋盤上對弈,豎線和橫線的交叉稱為棋點(diǎn)或?qū)狞c(diǎn)。河界將棋盤分成兩等份,每一邊都有一塊有9個(gè)點(diǎn)組成的九宮。4.2棋子模板利用一個(gè)二位數(shù)組,畫出各個(gè)棋子。4.3棋子規(guī)則模板規(guī)定各個(gè)棋子的走法規(guī)則,使每個(gè)棋子都是在棋點(diǎn)上行走,而不是在方格中行走如棋子“將”,“帥”和“士”只能在九宮內(nèi)移動,并且“將”和“帥”每一步只可以水平或垂直移動一個(gè)棋點(diǎn);“士”只能在九宮內(nèi)移動,并且它每一步只可以沿著對角線移動一個(gè)棋點(diǎn);“象”必須一次沿著對角線方向走兩個(gè)棋點(diǎn),但它不

11、能過河也不能跳過或穿越障礙,即“象”不能別眼,“馬”沒一步只可以水平或垂直移動兩個(gè)棋點(diǎn),但必須按對角線向左或向右移動。中國象棋的“馬”不能跳過障礙,即馬不能別腿?!败嚒笨梢运交虼怪狈较蛞苿尤艘粋€(gè)無障礙的點(diǎn)?!芭凇币苿悠饋砗蛙囶愃疲仨毺^一個(gè)棋子來吃掉對方的一個(gè)棋子,被跳過的那個(gè)棋子稱為橋或者屏風(fēng)?!氨泵坎街荒芟蚯耙苿右粋€(gè)棋子過河以后,它便增加了向左右移動的能力,并不允許向后移動。4.4悔棋模板當(dāng)用戶走錯(cuò)棋時(shí),可以允許用戶回到上一步走棋的狀態(tài),以實(shí)現(xiàn)悔棋的功能。5 系統(tǒng)詳細(xì)設(shè)計(jì)5.1 棋盤的設(shè)計(jì)首先設(shè)計(jì)好畫布的大小,以及標(biāo)題,顏色之類的public Gui() this.add(c);

12、this.setTitle("中國象棋");this.setSize(600, 600);this.setResizable(false);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);this.c.addMouseListener(this.c); 再在設(shè)計(jì)好的畫布上,畫出線條,設(shè)計(jì)出棋盤,由于棋盤中間有所謂的“河”,所以并不能單純的用兩個(gè)for循環(huán)畫出棋盤的格子,所以選擇在中間斷掉,空出河界,再在后面下方

13、繼續(xù)利用fou循環(huán)畫出棋盤的另外一方。這樣畫出來的只有上下兩個(gè)部分for(int y=50;y<550;y+=50)g.drawLine(100, y,500, y);/畫豎線線for(int x=100;x<=500;x+=50)g.drawLine(x,50,x,250);for(int x=100;x<=500;x+=50)g.drawLine(x,300,x,500); g.drawLine(100,250,100,300);g.drawLine(500,250,500,300);這只是單獨(dú)的畫出格子,由于“帥”和“士”所在的地方特殊,而且它們在一般情況下,也只能在九

14、宮格里面走動,而且“士”有斜著走的規(guī)則,所以又要當(dāng)初畫出斜線。 g.drawLine(250,50,350,150);g.drawLine(250,150,350,50);g.drawLine(250,400,350,500);g.drawLine(250,500,350,400);在中間的“河界”畫上“楚河漢界”字樣Font font0=new Font("方正舒體",Font.BOLD,40);g.setFont(font0);g.drawString("楚河", 175, 288);Font font1=new Font("方正舒體&qu

15、ot;,Font.BOLD,40);g.setFont(font1);g.drawString("漢界", 355, 288);5.2 棋子的設(shè)計(jì)設(shè)計(jì)思想,定義一個(gè)二維數(shù)組,數(shù)組的下標(biāo)分別對應(yīng)為棋盤里面的格子坐標(biāo),然后分別給定義的數(shù)組一個(gè)確切的值,不同的值對應(yīng)不同的棋子,分配好“車”、“馬”、“象”、“士”、“帥”、“炮”、“卒”。this.chessman00=1;this.chessman01=2;this.chessman02=3;this.chessman03=4;this.chessman04=5;this.chessman05=4;this.chessman06

16、=3;this.chessman07=2;this.chessman08=1;this.chessman21=6;this.chessman27=6;this.chessman30=7;this.chessman32=7;this.chessman34=7;this.chessman36=7;this.chessman38=7;/紅方棋子this.chessman90=8;this.chessman91=9;this.chessman92=10;this.chessman93=11;this.chessman94=12;this.chessman95=11;this.chessman96=10

17、;this.chessman97=9;this.chessman98=8;this.chessman71=13;this.chessman77=13;this.chessman60=14;this.chessman62=14;this.chessman64=14;this.chessman66=14;this.chessman68=14;在已經(jīng)分配好的棋子數(shù)組上,對各個(gè)對應(yīng)棋子數(shù)組分別畫出相應(yīng)的棋子switch(this.chessmanrowcol) case 1:/黑方:車g.setColor(color.black);g.fillOval(x-20,y-20,40,40);g.setCo

18、lor(Color.white);g.setFont(font);g.drawString("車", x-16,y+10);break;case 2:/黑方:馬g.setColor(color.black);g.fillOval(x-20,y-20,40,40);g.setColor(Color.white);g.setFont(font);g.drawString("馬", x-16,y+10);break;case 3:/黑方:象g.setColor(color.black);g.fillOval(x-20,y-20,40,40);g.setColo

19、r(Color.white);g.setFont(font);g.drawString("象", x-16,y+10)break;case 4:/黑方:士g.setColor(color.black);g.fillOval(x-20,y-20,40,40);g.setColor(Color.white);g.setFont(font);g.drawString("士", x-16,y+10);break;case 5:/黑方:將g.setColor(color.black);g.fillOval(x-20,y-20,40,40);g.setColor(C

20、olor.white);g.setFont(font);g.drawString("將", x-16,y+10);break;case 6:/黑方:炮 g.setColor(color.black);g.fillOval(x-20,y-20,40,40);g.setColor(Color.white);g.setFont(font);g.drawString("炮", x-16,y+10);break;case 7:/黑方:卒 g.setColor(color.black); g.fillOval(x-20,y-20,40,40); g.setColor

21、(Color.white); g.setFont(font);g.drawString("卒", x-16,y+10);break;case 8:g.setColor(color.black);g.fillOval(x-20,y-20,40,40);g.setColor(Color.black);g.setColor(Color.red);g.setFont(font);g.drawString("車", x-16,y+10);break; case 9:g.setColor(color.black);g.fillOval(x-20,y-20,40,40

22、);g.setColor(Color.black);g.setColor(Color.red);g.setFont(font);g.drawString("馬", x-16,y+10); break;case 10:g.setColor(color.black);g.fillOval(x-20,y-20,40,40);g.setColor(Color.black);g.setColor(Color.red);g.setFont(font);g.drawString("相", x-16,y+10);break;case 11:g.setColor(colo

23、r.black);g.fillOval(x-20,y-20,40,40);g.setColor(Color.black);g.setColor(Color.red);g.setFont(font);g.drawString("仕", x-16,y+10);break;case 12:g.setColor(color.black);g.fillOval(x-20,y-20,40,40);g.setColor(Color.black);g.setColor(Color.red);g.setFont(font);g.drawString("帥", x-16,y

24、+10);break;case 13:g.setColor(color.black);g.fillOval(x-20,y-20,40,40);g.setColor(Color.black);g.setColor(Color.red);g.setFont(font);g.drawString("炮", x-16,y+10);break;case 14:g.setColor(color.black);g.fillOval(x-20,y-20,40,40);g.setColor(Color.black);g.setColor(Color.red);g.setFont(font);

25、g.drawString("兵", x-16,y+10);break; 5.3 各個(gè)棋子走法規(guī)則的設(shè)計(jì) “車”的走法設(shè)計(jì),車在象棋中威力最大,無論橫線、豎線均可行走,只要無子阻攔,步數(shù)不受限制。因此,一車可以控制十七個(gè)點(diǎn),故有“一車十子寒”之稱。if(r2-r1>0) /向下走 for(int i=1;r1+i<r2;i+) if(this.chessmanr1+ic1!=0) j+; if(r1-r2>0) /向上走 for(int i=1;r1-i>r2;i+) if(this.chessmanr1-ic1!=0) j+; if(j=0&

26、&c1=c2) flag=true; if(c1-c2>0) /向左走 for(int i=1;c1-i>c2;i+) if(this.chessmanr1c1-i!=0) j+; if(c2-c1>0) /向右走 for(int i=1;c1+i<c2;i+) if(this.chessmanr1c1+i!=0) j+; if(this.chessmanr2c2<=7&&this.chessmanr2c2>0) flag=false; “炮”的走法設(shè)計(jì)。 if(r2-r1>0) /向下走 for(int i=1;r1+i<

27、;r2;i+) if(this.chessmanr1+ic1!=0) j+; if(r1-r2>0) /向上走 for(int i=1;r1-i>r2;i+) if(this.chessmanr1-ic1!=0) j+; if(j=0&&c1=c2&&this.chessmanr2c2=0) flag=true; if(j=1&&c1=c2&&this.chessmanr2c2>7) flag=true; if(c1-c2>0) /向左走 for(int i=1;c1-i>c2;i+) if(this

28、.chessmanr1c1-i!=0) j+; if(c2-c1>0) /向右走 for(int i=1;c1+i<c2;i+) if(this.chessmanr1c1+i!=0) j+; if(j=0&&r1=r2&&this.chessmanr2c2=0) flag=true; if(j=1&&r1=r2&&this.chessmanr2c2!=0) flag=true; if(this.chessmanr2c2<=7&&this.chessmanr2c2>0) flag=false;

29、 break; “馬”的走法設(shè)計(jì)。馬走動的方法是一直一斜,即先橫著或直著走一格,然后再斜著走一個(gè)對角線,俗稱“馬走日”。馬一次可走的選擇點(diǎn)可以達(dá)到四周的八個(gè)點(diǎn),故有“八面威風(fēng)”之說。如果在要去的方向有別的棋子擋住,馬就無法走過去,俗稱“蹩馬腿”。if(r1-r2=2&&c1-c2=1&&this.chessmanr1-1c1=0) /上左 flag=true; if(r1-r2=2&&c2-c1=1&&this.chessmanr1-1c1=0) /上右 flag=true; if(r2-r1=2&&c1-c2=1

30、&&this.chessmanr1+1c1=0) /下左 flag=true; if(r2-r1=2&&c2-c1=1&&this.chessmanr1+1c1=0) /下右 flag=true; if(r1-r2=1&&c1-c2=2&&this.chessmanr1c1-1=0) /左上 flag=true; if(r2-r1=1&&c1-c2=2&&this.chessmanr1c1-1=0) /左下 flag=true; if(r1-r2=1&&c2-c1=2

31、&&this.chessmanr1c1+1=0) /右上 flag=true; if(r2-r1=1&&c2-c1=2&&this.chessmanr1c1+1=0) /右下flag=true;if(this.chessmanr2c2<=7&&this.chessmanr2c2>0) flag=false; “象”的走法設(shè)計(jì)。相(象)的主要作用是防守,保護(hù)自己的帥(將)。它的走法是每次循對角線走兩格,俗稱“象走田”。相(象)的活動范圍限于“河界”以內(nèi)的本方陣地,不能過河,且如果它走的“田”字中央有一個(gè)棋子,就不能走,俗

32、稱“塞象眼”。if(r1-r2=2&&c1-c2=2&&this.chessman(r1+r2)/2(c1+c2)/2=0) /左上 flag=true; if(r1-r2=2&&c2-c1=2&&this.chessman(r1+r2)/2(c1+c2)/2=0) /右上 flag=true; if(r2-r1=2&&c1-c2=2&&this.chessman(r1+r2)/2(c1+c2)/2=0) /左下 flag=true; if(r2-r1=2&&c2-c1=2&

33、&this.chessman(r1+r2)/2(c1+c2)/2=0) /右下 flag=true; if(r2=6) flag=false; if(t%2=0) flag=false; if(this.chessmanr2c2<=7&&this.chessmanr2c2>0) flag=false;“士”的走法設(shè)計(jì)。仕(士)是帥(將)的貼身保鏢,它也只能在九宮內(nèi)走動。它的行棋路徑只能是九宮內(nèi)的斜線。if(r2-r1=1&&c2-c1=1|r1-r2=1&&c1-c2=1|c1-c2=1&&r2-r1=1|c2

34、-c1=1&&r1-r2=1) flag=true; if (r2=3|c2=2|c2=6) flag=false; if(this.chessmanr2c2<=7&&this.chessmanr2c2>0) flag=false;“帥”的走法設(shè)計(jì)。帥和將是棋中的首腦,是雙方竭力爭奪的目標(biāo)。它只能在“九宮”之內(nèi)活動,可上可下,可左可右,每次走動只能按豎線或橫線走動一格。帥與將不能在同一直線上直接對面,否則走方判負(fù)。if(r2-r1=1&&c1=c2|r1-r2=1&&c1=c2|c1-c2=1&&r1=

35、r2|c2-c1=1&&r1=r2) flag=true; if (r2=3|c2=2|c2=6) / if (r2>2|c2<3|c2>5) flag=false; if(r2-r1>0) /將對帥 for(int i=1;r1+i<r2;i+) if(this.chessmanr1+ic1!=0)j+; if(j=0&&c1=c2&&this.chessmanr2c2=12) flag=true; if(this.chessmanr2c2<=7&&this.chessmanr2c2>0

36、) flag=false; “卒”的走法設(shè)計(jì)。兵(卒)在未過河前,只能向前一步步走,過河以后,除不能后退外,允許左右移動,但也只能一次一步。if(r1=3|r1=4) if(r2-r1=1&&c1=c2) flag=true; else if(r2-r1=1&&c1=c2|c1-c2=1&&r1=r2|c2-c1=1&&r1=r2) flag=true; if(this.chessmanr2c2<=7&&this.chessmanr2c2>0) flag=false;每個(gè)棋子都有其特定的范圍,當(dāng)鼠標(biāo)點(diǎn)擊

37、在其范圍內(nèi),觸及鼠標(biāo)點(diǎn)擊事件,棋子便能走動,當(dāng)鼠標(biāo)點(diǎn)擊其他區(qū)域時(shí),對應(yīng)無反應(yīng)。public void mouseClicked(MouseEvent e) System.out.println(e.getX() + "t" + e.getY() + "t" + e.getButton(); int a = (e.getY() - 50) % 50; int b = (e.getX() - 50) % 50; int row = (e.getY() - 50) / 50; int col = (e.getX() - 50) / 50; this.repai

38、nt(); /重畫棋盤 t-; else return; if (e.getX() < 80 | e.getX() >520 | e.getY() < 30 | e.getY() > 520) return; if (e.getY() > 70 && e.getY() < 80) | (e.getY() > 120 && e.getY() < 130) | (e.getY() > 170 && e.getY() <180) | (e.getY() > 220 &&

39、e.getY() < 230) | (e.getY() > 270 && e.getY() <280) | (e.getY() > 320 && e.getY() < 330) | (e.getY() > 370 && e.getY() < 380) | (e.getY() > 420 && e.getY() < 430) | e.getY() > 470 && e.getY() <480) return; if (e.getX() > 120

40、 && e.getX() < 130) | (e.getX() > 170 && e.getX() <180) | (e.getX() > 220 && e.getX() < 230) | (e.getX() > 270 && e.getX() <280) | (e.getX() > 320 && e.getX() < 330) | (e.getX() > 370 && e.getX() < 380) | (e.getX() >

41、 420 && e.getX() < 430) | (e.getX() > 470 && e.getX() < 480) | (e.getX() > 520 && e.getX() < 530) return; for (int i = 0; i <= 9; i+) for (int j = 0; j <= 8; j+) if (i * 50 + 80 < e.getX() && e.getX() < i * 50 + 120) col = i; /列 if (j *50 +

42、30 < e.getY() && e.getY() < j* 50 + 70) row = j; /行 System.out.println(row + "t" + col + "t"); if (this.isSelected = false) /沒有選中子 if (this.chessmanrowcol = 0) return; /選中子,記錄信息 this.r = row; this.c = col; this.isSelected = true; else/走子悔棋功能的設(shè)計(jì)先在畫布上設(shè)計(jì)出一塊悔棋的區(qū)域,當(dāng)點(diǎn)擊該區(qū)域

43、時(shí),象棋便回到上一步象棋所走的狀態(tài),從而實(shí)現(xiàn)悔棋。該區(qū)域代碼要放在鼠標(biāo)點(diǎn)擊事件,點(diǎn)擊該區(qū)域時(shí),便實(shí)現(xiàn)悔棋功能。 public void mouseClicked(MouseEvent e)boolean flag = this.go(this.r, this.c, row, col); if (flag = true) this.undot0=this.r; this.undot1=this.c; this.undot2=this.chessmanthis.rthis.c; this.undot3=row; this.undot4=col; this.undot5=this.chessmanr

44、owcol; int temp = this.chessmanthis.rthis.c; this.chessmanthis.rthis.c = 0; this.chessmanrowcol = temp; this.repaint();/重畫棋盤 t+;5.4將軍的遍歷每觸擊一下鼠標(biāo)點(diǎn)擊事件,就會對棋盤里面的將軍是否存在進(jìn)行遍歷,假如發(fā)現(xiàn)一方將軍消失,則會彈出對話框,提醒對方贏棋,里面的內(nèi)容為對方贏的字樣for(int m=0;m<10;m+) for(int n=0;n<9;n+) if(this.chessmanmn=5|this.chessmanmn=12) w+; y=m

45、; z=n; if(w=1&&this.chessmanyz=5) JOptionPane.showMessageDialog(null, "紅方輸", "中國象棋", JOptionPane.INFORMATION_MESSAGE, null); if(w=1&&this.chessmanyz=12)JOptionPane.showMessageDialog(null, "白方輸", "中國象棋", JOptionPane.INFORMATION_MESSAGE, null); 6

46、 系統(tǒng)測試以及運(yùn)行結(jié)果設(shè)計(jì)出的象棋基本能按照中國的象棋的規(guī)則走法來運(yùn)行,先走的一方為紅方,每該哪方走的時(shí)候,棋盤的左邊都有字樣提醒該方下棋。該象棋還擁有悔棋的功能,以幫助用戶每當(dāng)不小心走錯(cuò)棋時(shí),可幫助用戶回到上一步。以實(shí)現(xiàn)悔棋的效果。7.總結(jié)設(shè)計(jì)過程及答辯回答問題記載:(至少三個(gè)問題)1剛剛開始設(shè)計(jì)出象棋,紅(白)方可以隨意走多少步而沒有走子限制。如何實(shí)現(xiàn)紅白兩方是輪流走的?以及棋盤旁邊是如何提醒該哪方走?答:首先定義一個(gè)全局變量t,當(dāng)無論紅白兩方走動一步時(shí),變量t都會自增加1。根據(jù)這樣的變化,我們可以這么設(shè)計(jì),當(dāng)t為偶數(shù)時(shí),我們規(guī)定紅方走,當(dāng)t為奇數(shù)時(shí),我們規(guī)定白方走,所以我們可以在紅方的棋

47、子后面加上這樣的一條語句 if(t%2=0) flag=false;白方棋子的后面加上if(t%2=1) flag=false;這樣便可實(shí)現(xiàn)棋子走動是兩方輪流走。同理,當(dāng)t為偶數(shù)時(shí),我們在畫布上顯示紅方字樣,提醒該紅方走。當(dāng)t為奇數(shù)時(shí),畫布上顯示白方字樣,提醒白方走。2.如何實(shí)現(xiàn)當(dāng)一方吃吃掉另外一方的將軍,游戲會彈出一個(gè)對話框,提醒哪方勝利?答:在鼠標(biāo)點(diǎn)擊事件中,每當(dāng)完成一個(gè)鼠標(biāo)點(diǎn)擊事件,我們都來對棋盤上剩下的子進(jìn)行遍歷,主要是判斷兩方的將軍這個(gè)棋子是否存在,當(dāng)一方的的將軍被吃掉時(shí),很顯然可以遍歷出該方的將軍在棋盤上消失,所以彈出對話框提醒另外一方勝利。如何在棋盤中對將軍的遍歷,通過兩個(gè)for

48、循環(huán)。for(int m=0;m<10;m+) for(int n=0;n<9;n+) if(this.chessmanmn=5|this.chessmanmn=12) w+;y=m; z=n;3.如何實(shí)現(xiàn)悔棋功能?答:每當(dāng)走一步棋之前,我們把該狀態(tài)的棋子狀態(tài)儲存起來,包括起始狀態(tài)。每當(dāng)觸擊鼠標(biāo)點(diǎn)擊事件里面的悔棋時(shí),觸發(fā)悔棋功能,把chessman數(shù)組恢復(fù)到走棋之前的狀態(tài),再重畫棋盤。這樣便可實(shí)現(xiàn)了悔棋功能。指導(dǎo)教師評語: 簽名: 2012 年 6 月 日附錄:程序核心源代碼import javax.swing.JButton;import javax.swing.JFrame;public class Gui extends JFrame private JButton ok=new JButton("確定");private MyCanvas c=new MyCanvas();public Gui()this.add(c);this.setTitle("中國象棋");this.setSize(600, 600);this.setResizable(false);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_C

溫馨提示

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

評論

0/150

提交評論