java象棋課程設計報告書_第1頁
java象棋課程設計報告書_第2頁
java象棋課程設計報告書_第3頁
java象棋課程設計報告書_第4頁
java象棋課程設計報告書_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

./課程名稱:JAVA課程設計題目:"網(wǎng)絡象棋"游戲的設計與開發(fā)系名:信息工程系專業(yè)班級:軟件工程姓名:學號:指導教師:20XX6月18日課程設計任務書學生:專業(yè)班級:指導教師:工作單位:信息工程系設計題目:"網(wǎng)絡象棋"游戲的設計與開發(fā)初始條件:《網(wǎng)絡象棋》,網(wǎng)絡版的棋類游戲。要求完成的主要任務:〔包括課程設計工作量及其技術要求,以及說明書撰寫等具體要求使用JAVA開發(fā)一個網(wǎng)絡版的象棋游戲。該游戲包括網(wǎng)絡功能,棋盤功能和輔助功能。本系統(tǒng)使用JAVASWING技術和事件處理機制進行棋盤界面的設計,開發(fā)和功能實現(xiàn),使用Socket網(wǎng)絡編程和多線程技術進行多客戶端之間的對戰(zhàn)。系統(tǒng)總體架構如下:網(wǎng)絡象棋網(wǎng)絡象棋網(wǎng)絡管理棋盤功能輔助功能系統(tǒng)功能點說明如下:編號功能名功能描述1網(wǎng)絡功能通過網(wǎng)絡通信,實現(xiàn)多客戶端對戰(zhàn)2棋盤功能繪制棋盤繪制棋盤與棋子下棋功能點擊棋子,可以走動下棋規(guī)則設計相應算法,控制不同棋子的走法3輔助功能悔棋通過記錄走棋步驟,實現(xiàn)悔棋截屏關鍵步驟,實現(xiàn)截屏錄制可以錄制每一步下棋的視頻4系統(tǒng)打包系統(tǒng)打包,制作安裝程序設計報告撰寫格式要求:一、課程設計說明書〔或報告書正文容[設計題目]例如:"即時通"網(wǎng)絡通信系統(tǒng)的設計與開發(fā)[開發(fā)環(huán)境]硬件環(huán)境:微機系列,存在1G以上,軟件環(huán)境:MicrosoftWindowsXP[開發(fā)工具]NetBeansIDE[完成時間]20[需求分析]分析闡述要實現(xiàn)的系統(tǒng)應具有什么樣的功能。[系統(tǒng)總體設計方案]在明確了所要解決的問題后,很自然地就要提出自己解決問題的思路和方案。讓讀者了解方案的總體設計和關鍵技術。

要闡述自己的設計方案,說明為什么要選擇或設計這樣的方案。

具體包括:系統(tǒng)總的設計思路,體系結構,總體架構,功能模塊圖;

各功能模塊所要達到的設計目標的簡單介紹;

設計的數(shù)據(jù)字典〔數(shù)據(jù)庫、表的結構;

使用的設計軟硬件環(huán)境和開發(fā)技術和平臺等。[系統(tǒng)詳細設計]在這部分中,要將整個開發(fā)工作的容進行詳細的介紹。

一般按照功能模塊分成幾部分來介紹。每部分應包括文字敘述、界面圖片、關鍵實現(xiàn)技術〔操作或代碼等幾個方面綜合說明問題。[系統(tǒng)調試和測試]調試:介紹設計過程中遇到的問題和解決方法。測試:介紹如何測試系統(tǒng),測試中發(fā)現(xiàn)的問題和解決方案。[結束語]這部分篇幅不大,對整個設計中做的工作、獲得的成果、心得體會等做一個簡單小結。[參考文獻]羅列在設計過程中查閱的文獻名稱注意:參考文獻羅列的格式為資料編號?作者?文獻或期刊名稱?名稱,文獻的出版時間或期刊的期號例如:文獻[1]呂鳳翥,馬皓.Java語言程序設計<第2版>[M].:清華大學,2010期刊[2]石振國.用JSP實現(xiàn)對Web數(shù)據(jù)庫的訪問[J].計算機應用,2010<05>:5-8.二、課程設計說明書〔或報告書正文的書寫格式簡介正文標題層次正文題序層次是文章結構的框架,一般采用社會通用的論文書寫形式。即章條序碼統(tǒng)一用阿拉伯數(shù)字表示,題序層次可以分為若干級,各級之間加小圓點,末尾一級的后面不加小圓點,層次分級一般不超過四級為宜,示例如下:第一級〔章123……第二級〔條1.11.2…2.12.2…3.13.2………第三級〔條……………3.2.1………二、表格每個表格應有自己的表序與表題,表序與表題間空一格。例如:表1.1XXXX,且表題與表序應寫在表格的上方正中處。三、插圖插圖圖面要整齊、美觀,插圖應與正文呼應,不能脫節(jié)。每幅插圖應有圖序與圖題,圖序編號要連續(xù),圖序與圖題間空一格且要放在插圖下方居中處。四、公式公式應另起一行寫在稿紙的中央。時間安排:日期任務課程容6.18-19棋盤界面的繪制Eclipse/NetBeans使用Swing技術6.19-20實現(xiàn)棋子的走動事件代理6.20-21棋子規(guī)則實現(xiàn)Socket,Thread,JavaOOJAVA數(shù)據(jù)結構6.25輔助功能實現(xiàn)6.26-27網(wǎng)絡通訊6.28系統(tǒng)打包驗收install4j使用指導教師簽字: 2012年6月14日系主任簽字:2012年6月15日1目標用JAVA開發(fā)一個象棋游戲。讓我們熟悉JAVA基本事件處理,學會java面向對象的設計。以及java各種控件及圖像用戶的界面的設計使用,分別掌握基本工具繼承抽象類接口。輸入輸出,流程控制,開發(fā)環(huán)境,實現(xiàn)簡單的功能設計,幫助熟練的掌握有關java的知識結構體系。通過實習掌握語言的語法結構,理解類和對象的概念,準確的使用各種數(shù)據(jù)類型,對面向對象中的繼承和多態(tài)的概念要理解、會使用,在程序中提高代碼的重用性,使設計的程序結構清晰、易于維護。2軟件開發(fā)環(huán)境與技術簡介2.1開發(fā)工具介紹EclipseEclipse是一個開放源代碼的、基于Java的可擴展開發(fā)平臺。就其本身而言,它只是一個框架和一組服務,用于通過插件組件構建開發(fā)環(huán)境。幸運的是,Eclipse附帶了一個標準的插件集,包括Java開發(fā)工具〔JavaDevelopmentKit,JDK。雖然大多數(shù)用戶很樂于將Eclipse當作Java集成開發(fā)環(huán)境〔IDE來使用,但Eclipse的目標卻不僅限于此。Eclipse還包括插件開發(fā)環(huán)境〔Plug-inDevelopmentEnvironment,PDE,這個組件主要針對希望擴展Eclipse的軟件開發(fā)人員,因為它允許他們構建與Eclipse環(huán)境無縫集成的工具。由于Eclipse中的每樣東西都是插件,對于給Eclipse提供插件,以及給用戶提供一致和統(tǒng)一的集成開發(fā)環(huán)境而言,所有工具開發(fā)人員都具有同等的發(fā)揮場所。這種平等和一致性并不僅限于Java開發(fā)工具。盡管Eclipse是使用Java語言開發(fā)的,但它的用途并不限于Java語言;例如,支持諸如C/C++和COBOL等編程語言的插件已經(jīng)可用,或預計將會推出。Eclipse框架還可用來作為與軟件開發(fā)無關的其他應用程序類型的基礎,比如容管理系統(tǒng)。2.2硬件環(huán)境1.操作系統(tǒng):MicrosoftWindowsXP。2.存:1G存以上。2.3軟件環(huán)境開發(fā)工具選用Eclipse3系統(tǒng)需求分析提供棋盤和棋子;設定棋子的走棋規(guī)則;該哪方走棋時,旁邊會有提示哪方走棋;可以悔棋;判斷勝負;4系統(tǒng)總體設計4.1棋盤模板中國象棋是雙方在有著9調豎線和10條橫線的棋盤上對弈,豎線和橫線的交叉稱為棋點或對弈點。河界將棋盤分成兩等份,每一邊都有一塊有9個點組成的九宮。4.2棋子模板利用一個二位數(shù)組,畫出各個棋子。4.3棋子規(guī)則模板規(guī)定各個棋子的走法規(guī)則,使每個棋子都是在棋點上行走,而不是在方格中行走如棋子"將","帥"和"士"只能在九宮移動,并且"將"和"帥"每一步只可以水平或垂直移動一個棋點;"士"只能在九宮移動,并且它每一步只可以沿著對角線移動一個棋點;"象"必須一次沿著對角線方向走兩個棋點,但它不能過河也不能跳過或穿越障礙,即"象"不能別眼,"馬"沒一步只可以水平或垂直移動兩個棋點,但必須按對角線向左或向右移動。中國象棋的"馬"不能跳過障礙,即馬不能別腿。"車"可以水平或垂直方向移動人一個無障礙的點。"炮"移動起來和車類似,但它必須跳過一個棋子來吃掉對方的一個棋子,被跳過的那個棋子稱為橋或者屏風。"兵"每步只能向前移動一個棋子過河以后,它便增加了向左右移動的能力,并不允許向后移動。4.4悔棋模板當用戶走錯棋時,可以允許用戶回到上一步走棋的狀態(tài),以實現(xiàn)悔棋的功能。5系統(tǒng)詳細設計5.1棋盤的設計首先設計好畫布的大小,以及標題,顏色之類的publicGui<>{this.add<c>;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>;}再在設計好的畫布上,畫出線條,設計出棋盤,由于棋盤中間有所謂的"河",所以并不能單純的用兩個for循環(huán)畫出棋盤的格子,所以選擇在中間斷掉,空出河界,再在后面下方繼續(xù)利用fou循環(huán)畫出棋盤的另外一方。這樣畫出來的只有上下兩個部分for<inty=50;y<550;y+=50> g.drawLine<100,y,500,y>;//畫豎線線for<intx=100;x<=500;x+=50> g.drawLine<x,50,x,250>;for<intx=100;x<=500;x+=50> g.drawLine<x,300,x,500>;g.drawLine<100,250,100,300>; g.drawLine<500,250,500,300>;這只是單獨的畫出格子,由于"帥"和"士"所在的地方特殊,而且它們在一般情況下,也只能在九宮格里面走動,而且"士"有斜著走的規(guī)則,所以又要當初畫出斜線。g.drawLine<250,50,350,150>;g.drawLine<250,150,350,50>;g.drawLine<250,400,350,500>;g.drawLine<250,500,350,400>;在中間的"河界"畫上"楚河漢界"字樣Fontfont0=newFont<"方正舒體",Font.BOLD,40>; g.setFont<font0>; g.drawString<"楚河",175,288>; Fontfont1=newFont<"方正舒體",Font.BOLD,40>; g.setFont<font1>; g.drawString<"漢界",355,288>;5.2棋子的設計設計思想,定義一個二維數(shù)組,數(shù)組的下標分別對應為棋盤里面的格子坐標,然后分別給定義的數(shù)組一個確切的值,不同的值對應不同的棋子,分配好"車"、"馬"、"象"、"士"、"帥"、"炮"、"卒"。this.chessman[0][0]=1;this.chessman[0][1]=2;this.chessman[0][2]=3;this.chessman[0][3]=4;this.chessman[0][4]=5;this.chessman[0][5]=4;this.chessman[0][6]=3;this.chessman[0][7]=2;this.chessman[0][8]=1;this.chessman[2][1]=6;this.chessman[2][7]=6;this.chessman[3][0]=7;this.chessman[3][2]=7;this.chessman[3][4]=7;this.chessman[3][6]=7;this.chessman[3][8]=7;//紅方棋子this.chessman[9][0]=8;this.chessman[9][1]=9;this.chessman[9][2]=10;this.chessman[9][3]=11;this.chessman[9][4]=12;this.chessman[9][5]=11;this.chessman[9][6]=10;this.chessman[9][7]=9;this.chessman[9][8]=8;this.chessman[7][1]=13;this.chessman[7][7]=13;this.chessman[6][0]=14;this.chessman[6][2]=14;this.chessman[6][4]=14;this.chessman[6][6]=14;this.chessman[6][8]=14;在已經(jīng)分配好的棋子數(shù)組上,對各個對應棋子數(shù)組分別畫出相應的棋子switch<this.chessman[row][col]> {case1://黑方:車 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;case2://黑方:馬 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;case3://黑方:象 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;case4://黑方:士 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;case5://黑方:將 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;case6://黑方:炮 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;case7://黑方:卒 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;case8: 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;case9: 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;case10: 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;case11: 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; case12: 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;case13: 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;case14: 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; }5.3各個棋子走法規(guī)則的設計"車"的走法設計,車在象棋中威力最大,無論橫線、豎線均可行走,只要無子阻攔,步數(shù)不受限制。因此,一車可以控制十七個點,故有"一車十子寒"之稱。if<r2-r1>0>//向下走for<inti=1;r1+i<r2;i++>{if<this.chessman[r1+i][c1]!=0>j++;}if<r1-r2>0>//向上走for<inti=1;r1-i>r2;i++>{if<this.chessman[r1-i][c1]!=0>j++;}if<j==0&&c1==c2>flag=true;if<c1-c2>0>//向左走for<inti=1;c1-i>c2;i++>{if<this.chessman[r1][c1-i]!=0>j++;}if<c2-c1>0>//向右走for<inti=1;c1+i<c2;i++>{if<this.chessman[r1][c1+i]!=0>j++;}if<this.chessman[r2][c2]<=7&&this.chessman[r2][c2]>0>flag=false;"炮"的走法設計。if<r2-r1>0>//向下走for<inti=1;r1+i<r2;i++>{if<this.chessman[r1+i][c1]!=0>j++;}if<r1-r2>0>//向上走for<inti=1;r1-i>r2;i++>{if<this.chessman[r1-i][c1]!=0>j++;}if<j==0&&c1==c2&&this.chessman[r2][c2]==0>flag=true;if<j==1&&c1==c2&&this.chessman[r2][c2]>7>flag=true;if<c1-c2>0>//向左走for<inti=1;c1-i>c2;i++>{if<this.chessman[r1][c1-i]!=0>j++;}if<c2-c1>0>//向右走for<inti=1;c1+i<c2;i++>{if<this.chessman[r1][c1+i]!=0>j++;}if<j==0&&r1==r2&&this.chessman[r2][c2]==0>flag=true;if<j==1&&r1==r2&&this.chessman[r2][c2]!=0>flag=true;if<this.chessman[r2][c2]<=7&&this.chessman[r2][c2]>0>flag=false;break; "馬"的走法設計。馬走動的方法是一直一斜,即先橫著或直著走一格,然后再斜著走一個對角線,俗稱"馬走日"。馬一次可走的選擇點可以達到四周的八個點,故有"八面威風"之說。如果在要去的方向有別的棋子擋住,馬就無法走過去,俗稱"蹩馬腿"。if<r1-r2==2&&c1-c2==1&&this.chessman[r1-1][c1]==0>//上左flag=true;if<r1-r2==2&&c2-c1==1&&this.chessman[r1-1][c1]==0>//上右flag=true;if<r2-r1==2&&c1-c2==1&&this.chessman[r1+1][c1]==0>//下左flag=true;if<r2-r1==2&&c2-c1==1&&this.chessman[r1+1][c1]==0>//下右flag=true;if<r1-r2==1&&c1-c2==2&&this.chessman[r1][c1-1]==0>//左上flag=true;if<r2-r1==1&&c1-c2==2&&this.chessman[r1][c1-1]==0>//左下flag=true;if<r1-r2==1&&c2-c1==2&&this.chessman[r1][c1+1]==0>//右上flag=true;if<r2-r1==1&&c2-c1==2&&this.chessman[r1][c1+1]==0>//右下flag=true;if<this.chessman[r2][c2]<=7&&this.chessman[r2][c2]>0>flag=false;"象"的走法設計。相〔象的主要作用是防守,保護自己的帥〔將。它的走法是每次循對角線走兩格,俗稱"象走田"。相〔象的活動圍限于"河界"以的本方陣地,不能過河,且如果它走的"田"字中央有一個棋子,就不能走,俗稱"塞象眼"。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&&this.chessman[<r1+r2>/2][<c1+c2>/2]==0>//右下flag=true;if<r2==6>flag=false;if<t%2==0>flag=false;if<this.chessman[r2][c2]<=7&&this.chessman[r2][c2]>0>flag=false;"士"的走法設計。仕〔士是帥〔將的貼身保鏢,它也只能在九宮走動。它的行棋路徑只能是九宮的斜線。if<r2-r1==1&&c2-c1==1||r1-r2==1&&c1-c2==1||c1-c2==1&&r2-r1==1||c2-c1==1&&r1-r2==1>flag=true;if<r2==3||c2==2||c2==6>flag=false;if<this.chessman[r2][c2]<=7&&this.chessman[r2][c2]>0>flag=false;"帥"的走法設計。帥和將是棋中的首腦,是雙方竭力爭奪的目標。它只能在"九宮"之活動,可上可下,可左可右,每次走動只能按豎線或橫線走動一格。帥與將不能在同一直線上直接對面,否則走方判負。if<r2-r1==1&&c1==c2||r1-r2==1&&c1==c2||c1-c2==1&&r1==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<inti=1;r1+i<r2;i++>{if<this.chessman[r1+i][c1]!=0>j++;}if<j==0&&c1==c2&&this.chessman[r2][c2]==12>flag=true;if<this.chessman[r2][c2]<=7&&this.chessman[r2][c2]>0>flag=false;"卒"的走法設計。兵〔卒在未過河前,只能向前一步步走,過河以后,除不能后退外,允許左右移動,但也只能一次一步。if<r1==3||r1==4>{if<r2-r1==1&&c1==c2>flag=true;}elseif<r2-r1==1&&c1==c2||c1-c2==1&&r1==r2||c2-c1==1&&r1==r2>flag=true;if<this.chessman[r2][c2]<=7&&this.chessman[r2][c2]>0>flag=false;每個棋子都有其特定的圍,當鼠標點擊在其圍,觸及鼠標點擊事件,棋子便能走動,當鼠標點擊其他區(qū)域時,對應無反應。publicvoidmouseClicked<MouseEvente>{System.out.println<e.getX<>+"\t"+e.getY<>+"\t"+e.getButton<>>;inta=<e.getY<>-50>%50;intb=<e.getX<>-50>%50;introw=<e.getY<>-50>/50;intcol=<e.getX<>-50>/50;this.repaint<>; //重畫棋盤t--;}elsereturn;}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&&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&&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<>>420&&e.getX<><430>||<e.getX<>>470&&e.getX<><480>||<e.getX<>>520&&e.getX<><530>>{return;}for<inti=0;i<=9;i++>{for<intj=0;j<=8;j++>{if<i*50+80<e.getX<>&&e.getX<><i*50+120>{col=i;//列}if<j*50+30<e.getY<>&&e.getY<><j*50+70>{row=j;//行}}}System.out.println<row+"\t"+col+"\t">;if<this.isSelected==false>{//沒有選中子if<this.chessman[row][col]==0>{return;}//選中子,記錄信息this.r=row;this.c=col;this.isSelected=true;}else//走子悔棋功能的設計先在畫布上設計出一塊悔棋的區(qū)域,當點擊該區(qū)域時,象棋便回到上一步象棋所走的狀態(tài),從而實現(xiàn)悔棋。該區(qū)域代碼要放在鼠標點擊事件,點擊該區(qū)域時,便實現(xiàn)悔棋功能。publicvoidmouseClicked<MouseEvente>booleanflag=this.go<this.r,this.c,row,col>;if<flag==true>{ this.undo[t][0]=this.r;this.undo[t][1]=this.c;this.undo[t][2]=this.chessman[this.r][this.c];this.undo[t][3]=row;this.undo[t][4]=col;this.undo[t][5]=this.chessman[row][col];inttemp=this.chessman[this.r][this.c];this.chessman[this.r][this.c]=0;this.chessman[row][col]=temp;this.repaint<>;//重畫棋盤t++;5.4將軍的遍歷每觸擊一下鼠標點擊事件,就會對棋盤里面的將軍是否存在進行遍歷,假如發(fā)現(xiàn)一方將軍消失,則會彈出對話框,提醒對方贏棋,里面的容為對方贏的字樣for<intm=0;m<10;m++> for<intn=0;n<9;n++>{ if<this.chessman[m][n]==5||this.chessman[m][n]==12>{ w++; y=m; z=n; }if<w==1&&this.chessman[y][z]==5> JOptionPane.showMessageDialog<null,"紅方輸","中國象棋", JOptionPane.INFORMATION_MESSAGE,null>;if<w==1&&this.chessman[y][z]==12>JOptionPane.showMessageDialog<null,"白方輸","中國象棋",JOptionPane.INFORMATION_MESSAGE,null>;6系統(tǒng)測試以及運行結果設計出的象棋基本能按照中國的象棋的規(guī)則走法來運行,先走的一方為紅方,每該哪方走的時候,棋盤的左邊都有字樣提醒該方下棋。該象棋還擁有悔棋的功能,以幫助用戶每當不小心走錯棋時,可幫助用戶回到上一步。以實現(xiàn)悔棋的效果。7.總結設計過程及答辯回答問題記載:〔至少三個問題1.剛剛開始設計出象棋,紅〔白方可以隨意走多少步而沒有走子限制。如何實現(xiàn)紅白兩方是輪流走的?以及棋盤旁邊是如何提醒該哪方走?答:首先定義一個全局變量t,當無論紅白兩方走動一步時,變量t都會自增加1。根據(jù)這樣的變化,我們可以這么設計,當t為偶數(shù)時,我們規(guī)定紅方走,當t為奇數(shù)時,我們規(guī)定白方走,所以我們可以在紅方的棋子后面加上這樣的一條語句if<t%2==0>flag=false;白方棋子的后面加上if<t%2==1>flag=false;這樣便可實現(xiàn)棋子走動是兩方輪流走。同理,當t為偶數(shù)時,我們在畫布上顯示紅方字樣,提醒該紅方走。當t為奇數(shù)時,畫布上顯示白方字樣,提醒白方走。2.如何實現(xiàn)當一方吃吃掉另外一方的將軍,游戲會彈出一個對話框,提醒哪方勝利?答:在鼠標點擊事件中,每當完成一個鼠標點擊事件,我們都來對棋盤上剩下的子進行遍歷,主要是判斷兩方的將軍這個棋子是否存在,當一方的的將軍被吃掉時,很顯然可以遍歷出該方的將軍在棋盤上消失,所以彈出對話框提醒另外一方勝利。如何在棋盤中對將軍的遍歷,通過兩個for循環(huán)。for<intm=0;m<10;m++>for<intn=0;n<9;n++>{if<this.chessman[m][n]==5||this.chessman[m][n]==12>{ w++;y=m; z=n;}3.如何實現(xiàn)悔棋功能?答:每當走一步棋之前,我們把該狀態(tài)的棋子狀態(tài)儲存起來,包括起始狀態(tài)。每當觸擊鼠標點擊事件里面的悔棋時,觸發(fā)悔棋功能,把chessman數(shù)組恢復到走棋之前的狀態(tài),再重畫棋盤。這樣便可實現(xiàn)了悔棋功能。指導教師評語:簽名:2012年6月日附錄:程序核心源代碼importjavax.swing.JButton;importjavax.swing.JFrame;publicclassGuiextendsJFrame{privateJButtonok=newJButton<"確定">;privateMyCanvasc=newMyCanvas<>;publicGui<> {this.add<c>;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>; }publicstaticvoidmain<String[]args>{newGui<>; }}package.itjob;importjava.awt.Canvas;importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.awt.RenderingHints;importjava.awt.event.MouseEvent;importjavax.swing.JOptionPane;publicvoidmouseClicked<MouseEvente>{System.out.println<e.getX<>+"\t"+e.getY<>+"\t"+e.getButton<>>;inta=<e.getY<>-50>%50;intb=<e.getX<>-50>%50;introw=<e.getY<>-50>/50;intcol=<e.getX<>-50>/50;if<<e.getX<><45&&e.getX<>>20>&&<e.getY<><140&&e.getY<>>120>>//點擊悔棋{if<t!=0>{this.chessman[this.undo[t-1][0]][this.undo[t-1][1]]=this.undo[t-1][2];this.chessman[this.undo[t-1][3]][this.undo[t-1][4]]=this.undo[t-1][5];this.repaint<>; //重畫棋盤t--;}elsereturn;}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&&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&&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<>>420&&e.getX<><430>||<e.getX<>>470&&e.getX<><480>||<e.getX<>>520&&e.getX<><530>>{return;}for<inti=0;i<=9;i++>{for<intj=0;j<=8;j++>{if<i*50+80<e.getX<>&&e.getX<><i*50+120>{col=i;//列}if<j*50+30<e.getY<>&&e.getY<><j*50+70>{row=j;//行}}}System.out.println<row+"\t"+col+"\t">;if<this.isSelected==false>{//沒有選中子if<this.chessman[row][col]==0>{return;}//選中子,記錄信息this.r=row;this.c=col;this.isSelected=true;}else//走子{booleanflag=this.go<this.r,this.c,row,col>;if<flag==true>{this.undo[t][0]=this.r;this.undo[t][1]=this.c;this.undo[t][2]=this.chessman[this.r][this.c];this.undo[t][3]=row;this.undo[t][4]=col;this.undo[t][5]=this.chessman[row][col];inttemp=this.chessman[this.r][this.c];this.chessman[this.r][this.c]=0;this.chessman[row][col]=temp;//重畫棋盤this.repaint<>;t++;}this.isSelected=false;intw=0,y=99,z=99;for<intm=0;m<10;m++>for<intn=0;n<9;n++>{if<this.chessman[m][n]==5||this.chessman[m][n]==12>{ w++; y=m; z=n; }if<w==1&&this.chessman[y][z]==5> JOptionPane.showMessageDialog<null,"紅方輸","中國象棋", JOptionPane.INFORMATION_MESSAGE,null>;if<w==1&&this.chessman[y][z]==12>JOptionPane.showMessageDialog<null,"白方輸","中國象棋", JOptionPane.INFORMATION_MESSAGE,null>;}}publicbooleango<intr1,intc1,intr2,intc2>{// *1--7:車、馬、象、士、將、炮、卒〔黑方//*8--14:車、馬、相、士、帥、炮、兵〔紅方booleanflag=false;intj=0;switch<this.chessman[r1][c1]>{case1://白方:車if<r2-r1>0>//向下走for<inti=1;r1+i<r2;i++>{if<this.chessman[r1+i][c1]!=0>j++;}if<r1-r2>0>//向上走for<inti=1;r1-i>r2;i++>{if<this.chessman[r1-i][c1]!=0>j++;}if<j==0&&c1==c2>if<c1-c2>0>//向左走for<inti=1;c1-i>c2;i++>{if<this.chessman[r1][c1-i]!=0>j++;}if<c2-c1>0>//向右走for<inti=1;c1+i<c2;i++>{if<this.chessman[r1][c1+i]!=0>j++;}if<j==0&&r1==r2>flag=true;if<t%2==0> flag=false;if<this.chessman[r2][c2]<=7&&this.chessman[r2][c2]>0>flag=false;break;case2://白方:馬if<r1-r2==2&&c1-c2==1&&this.chessman[r1-1][c1]==0>//上左flag=true;if<r1-r2==2&&c2-c1==1&&this.chessman[r1-1][c1]==0>//上右flag=true;if<r2-r1==2&&c1-c2==1&&this.chessman[r1+1][c1]==0>//下左flag=true;if<r2-r1==2&&c2-c1==1&&this.chessman[r1+1][c1]==0>//下右flag=true;if<r1-r2==1&&c1-c2==2&&this.chessman[r1][c1-1]==0>//左上flag=true;if<r2-r1==1&&c1-c2==2&&this.chessman[r1][c1-1]==0>//左下flag=true;if<r1-r2==1&&c2-c1==2&&this.chessman[r1][c1+1]==0>//右上flag=true;if<r2-r1==1&&c2-c1==2&&this.chessman[r1][c1+1]==0>//右下flag=true;if<t%2==0> flag=false;if<this.chessman[r2][c2]<=7&&this.chessman[r2][c2]>0>flag=false;break;case3://白方:相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&&this.chessman[<r1+r2>/2][<c1+c2>/2]==0>//右下flag=true;if<r2==6>flag=false;if<t%2==0> flag=false;if<this.chessman[r2][c2]<=7&&this.chessman[r2][c2]>0>flag=false;break;case4://白方:士if<r2-r1==1&&c2-c1==1||r1-r2==1&&c1-c2==1||c1-c2==1&&r2-r1==1||c2-c1==1&&r1-r2==1>flag=true;if<r2==3||c2==2||c2==6>flag=false;if<t%2==0> flag=false;if<this.chessman[r2][c2]<=7&&this.chessman[r2][c2]>0>flag=false;break;case5://黑方:將if<r2-r1==1&&c1==c2||r1-r2==1&&c1==c2||c1-c2==1&&r1==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<inti=1;r1+i<r2;i++>{if<this.chessman[r1+i][c1]!=0>j++;}if<j==0&&c1==c2&&this.chessman[r2][c2]==12>flag=true;if<this.chessman[r2][c2]<=7&&this.chessman[r2][c2]>0>flag=false;if<t%2==0>flag=false;break;case6://白方:炮if<r2-r1>0>//向下走for<inti=1;r1+i<r2;i++>{if<this.chessman[r1+i][c1]!=0>j++;}if<r1-r2>0>//向上走for<inti=1;r1-i>r2;i++>{if<this.chessman[r1-i][c1]!=0>j++;}if<j==0&&c1==c2&&this.chessman[r2][c2]==0>flag=true;if<j==1&&c1==c2&&this.chessman[r2][c2]>7>flag=true;if<c1-c2>0>//向左走for<inti=1;c1-i>c2;i++>{if<this.chessman[r1][c1-i]!=0>j++;}if<c2-c1>0>//向右走for<inti=1;c1+i<c2;i++>{if<this.chessman[r1][c1+i]!=0>j++;}if<j==0&&r1==r2&&this.chessman[r2][c2]==0>flag=true;if<j==1&&r1==r2&&this.chessman[r2][c2]!=0>flag=true;if<t%2==0> flag=false;if<this.chessman[r2][c2]<=7&&this.chessman[r2][c2]>0>flag=false;break;case7://白方:黑方:卒if<r1==3||r1==4>{if<r2-r1==1&&c1==c2>flag=true;}elseif<r2-r1==1&&c1==c2||c1-c2==1&&r1==r2||c2-c1==1&&r1==r2>flag=true;if<this.chessman[r2][c2]<=7&&this.chessman[r2][c2]>0>flag=false;if<t%2==0> flag=false;break;case8://紅方:if<r2-r1>0>//向下走for<inti=1;r1+i<r2;i++>{if<this.chessman[r1+i][c1]!=0>j++;}if<r1-r2>0>//向上走for<inti=1;r1-i>r2;i++>{if<this.chessman[r1-i][c1]!=0>j++;}if<j==0&&c1==c2>flag=true;if<c1-c2>0>//向左走for<inti=1;c1-i>c2;i++>{if<this.chessman[r1][c1-i]!=0>j++;}if<c2-c1>0>//向右走for<inti=1;c1+i<c2;i++>{if<this.chessman[r1][c1+i]!=0>j++;}if<j==0&&r1==r2>flag=true;if<t%2==1> flag=true;if<this.chessman[r2][c2]>7>flag=false;break;case9://紅方if<r1-r2==2&&c1-c2==1&&this.chessman[r1-1][c1]==0>//上左 flag=true;if<r1-r2==2&&c2-c1==1&&this.chessman[r1-1][c1]==0>//上右 flag=true;if<r2-r1==2&&c1-c2==1&&this.chessman[r1+1][c1]==0>//下左 flag=true;if<r2-r1==2&&c2-c1==1&&this.chessman[r1+1][c1]==0>//下右 flag=true;if<r1-r2==1&&c1-c2==2&&this.chessman[r1][c1-1]==0>//左上 flag=true;if<r2-r1==1&&c1-c2==2&&this.chessman[r1][c1-1]==0>//左下 flag=true;if<r1-r2==1&&c2-c1==2&&this.chessman[r1][c1+1]==0>//右上 flag=true;if<r2-r1==1&&c2-c1==2&&this.chessman[r1][c1+1]==0>//右下 flag=true;if<t%2==1> flag=false;if<this.chess

溫馨提示

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

評論

0/150

提交評論