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

下載本文檔

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

文檔簡(jiǎn)介

1、象棋程序設(shè)計(jì) 1. 課程設(shè)計(jì)目的java語(yǔ)言是當(dāng)今流行的網(wǎng)絡(luò)編程語(yǔ)言,它具有面向?qū)ο?、跨平臺(tái)、分布應(yīng)用等特點(diǎn)。面向?qū)ο蟮拈_發(fā)方法是當(dāng)今世界最流行的開發(fā)方法,它不僅具有更貼近自然的語(yǔ)義,而且有利于軟件的維護(hù)和繼承。為了進(jìn)一步鞏固課堂上所學(xué)到的知識(shí),深刻把握java語(yǔ)言的重要概念及其面向?qū)ο蟮奶匦?,鍛煉學(xué)生熟練的應(yīng)用面向?qū)ο蟮乃枷牒驮O(shè)計(jì)方法解決實(shí)際問(wèn)題的能力,開設(shè)了一周的java程序設(shè)計(jì)課程設(shè)計(jì)。通過(guò)此次課程設(shè)計(jì),鞏固所學(xué)java語(yǔ)言基本知識(shí),增進(jìn)java語(yǔ)言編輯基本功,掌握jdk、editplus、eclipse、jcreator等開發(fā)工具的運(yùn)用,拓寬常用類庫(kù)的應(yīng)用。使學(xué)生通過(guò)該教學(xué)環(huán)節(jié)與手段,

2、把所學(xué)課程及相關(guān)知識(shí)加以融會(huì)貫通,全面掌握java語(yǔ)言的編程思想及面向?qū)ο蟪绦蛟O(shè)計(jì)的方法,為今后從事實(shí)際工作打下堅(jiān)實(shí)的基礎(chǔ)。2設(shè)計(jì)方案論證2.1功能描述象棋是中國(guó)一種流傳十分廣泛的游戲。下棋雙方根據(jù)自己對(duì)棋局形式的理解和對(duì)棋藝規(guī)律的掌握,調(diào)動(dòng)車馬,組織兵力,協(xié)調(diào)作戰(zhàn)在棋盤這塊特定的戰(zhàn)場(chǎng)上進(jìn)行著象征性的軍事戰(zhàn)斗。本程序的功能就是將棋盤和棋子在電腦上模擬出來(lái),雙方可以通過(guò)鼠標(biāo)對(duì)己方棋子的操作進(jìn)行對(duì)弈。2.2概要設(shè)計(jì) 象棋,人人會(huì)走,把己方的棋子按不同棋子的規(guī)則放在棋盤合適的位置上。象棋包含三個(gè)要素:棋盤、棋子和規(guī)則。在本象棋程序的設(shè)計(jì)上,也大致遵循這三個(gè)要素,但是細(xì)化為四個(gè)方面:棋盤、棋盤上可以走

3、棋的落子點(diǎn)、棋子和象棋規(guī)則。棋盤:繪制棋盤時(shí),進(jìn)行畫橫線,畫最左側(cè)的豎線,畫最右側(cè)的豎線,畫中間的豎線,畫斜線等操作。棋盤其實(shí)就是一張棋盤的圖形,我們要在計(jì)算機(jī)上的棋盤上落子并不像在現(xiàn)實(shí)生活中那么容易,這里說(shuō)的棋盤充其量只是背景。落子點(diǎn):真正落子的地方必須是我們?cè)趫D形界面上設(shè)定的落子點(diǎn)。落子點(diǎn)其實(shí)就是在圖形界面上定義一個(gè)應(yīng)該擺放棋子的點(diǎn)位置。棋子:包括棋子名和棋子顏色和棋子所屬方等信息。象棋規(guī)則:不同棋子只能按照各自的規(guī)則在這些設(shè)定的位置上擺放、搏殺。 根據(jù)前面的細(xì)化,程序中分別設(shè)計(jì)了四個(gè)類對(duì)應(yīng)棋盤、落子點(diǎn)、棋子和象棋規(guī)則這四個(gè)方面。四個(gè)類幾乎包括了程序的全部,程序框圖如下圖所示: 中國(guó)象棋棋

4、 子落子點(diǎn) 繪 制 棋 盤象棋規(guī)則 畫 斜 線 畫 中 間 豎 線 畫 最 右 側(cè) 豎 線 畫 最 左 側(cè) 豎 線 畫 橫 線 棋 子 顏 色 棋 子 所 屬 方 棋 子 名圖1 .程序功能框圖2.3詳細(xì)設(shè)計(jì)2.3.1棋子類chess swing中并沒有棋子這個(gè)組建類,所以我們必須設(shè)計(jì)一個(gè)組件,棋子其實(shí)就是圓形的jlabel,但swing中的jlabel組件是方形的,沒關(guān)系,利用jlabel我們可以創(chuàng)建圓形的jlabel組件chess。2.3.2落子點(diǎn)類point在平面中確定一個(gè)點(diǎn)需要x坐標(biāo)和y 坐標(biāo),在圖形界面中確定一個(gè)點(diǎn)同樣也需要x坐標(biāo)和y坐標(biāo)。圖形界面的左上角的坐標(biāo)為(0,0),x數(shù)值往

5、右增大,y數(shù)值往下增大。落子點(diǎn)其實(shí)就是在圖形界面上定義一個(gè)應(yīng)該擺放棋子的點(diǎn)位置,棋子擺放在任何位置都視為非法,除了落子點(diǎn)。當(dāng)然,描述一個(gè)點(diǎn)位置僅僅是類point的基本功能之一,他還需要知道這個(gè)點(diǎn)上是否已有棋子以及是什么棋子。2.3.3棋盤類chessbord棋盤其實(shí)就是我們看到的一個(gè)圖形界面,將棋盤設(shè)計(jì)為jpanel類,在jpanel這個(gè)容器上,我們可以利用坐標(biāo)確定落子點(diǎn),也可以加入我們自定義的棋子組件。 jpanel容器其實(shí)就像有底色的畫布,有了落子點(diǎn)和棋子,還需要我們自己畫橫線和豎線。chessbord繼承了jpanel,覆寫方法paintcompont,實(shí)例化jpanel時(shí),會(huì)自動(dòng)調(diào)用該

6、方法。2.3.4規(guī)則類chessrule chessrule類的作用就是判斷走棋是否合法。實(shí)現(xiàn)思路就是根據(jù)走棋的起點(diǎn)和終點(diǎn)計(jì)算走棋路線中是否有其他的棋子,再依據(jù)是何種棋子判斷走棋是否合法。2.3.5類chessframe 雖然上面4個(gè)類實(shí)現(xiàn)了象棋程序的所有功能,但還需要一個(gè)底層窗口容器加載chessboard這個(gè)jpanel。并添加相應(yīng)的菜單。3.設(shè)計(jì)結(jié)果與分析程序運(yùn)行之后,可以實(shí)現(xiàn)兩個(gè)人分別控制紅方和黑方的棋子進(jìn)行對(duì)弈,缺點(diǎn)就是程序過(guò)于簡(jiǎn)單,只能實(shí)現(xiàn)上述功能,不能悔棋,沒有計(jì)時(shí)功能,也不能實(shí)現(xiàn)人機(jī)對(duì)弈功能。程序運(yùn)行結(jié)果如下所示:圖2. chess類的運(yùn)行結(jié)果“車”繪制“中國(guó)象棋棋盤”,通過(guò)定

7、義劃?rùn)M線,畫左側(cè)的豎線,畫最右側(cè)的豎線,畫中間的豎線,畫斜線等操作,輸出程序的棋盤的運(yùn)行結(jié)果。圖3.中國(guó)象棋棋盤通過(guò)定義x坐標(biāo),y坐標(biāo),和棋子,并將棋子加入到棋盤上的指定位置,輸出中國(guó)象棋開局的程序運(yùn)行結(jié)果。圖4.中國(guó)象棋程序運(yùn)行效果圖開局圖5.中國(guó)象棋程序運(yùn)行效果圖殘局4.設(shè)計(jì)體會(huì)通過(guò)對(duì)java的課程設(shè)計(jì),針對(duì)java的書本知識(shí)得到了進(jìn)一步的鞏固,具體化就是加深了我對(duì)圖形用戶界面理解,對(duì)程序的深層理解,清楚程序中每一步的功能,在程序的運(yùn)行中是十分重要的,一個(gè)好的結(jié)構(gòu)在運(yùn)行中能夠充分的發(fā)揮程序的功能。把書本上學(xué)習(xí)到的知識(shí)應(yīng)用到實(shí)際中去,很好的鍛煉了我編寫java語(yǔ)言的能力。結(jié)構(gòu)設(shè)計(jì)的合理性決定

8、了這個(gè)程序的價(jià)值。在今后的學(xué)習(xí)中我要注意這方面,使得我的編程能力能有進(jìn)一步的提高。在整個(gè)設(shè)計(jì)過(guò)程中,通過(guò)各種渠道獲取資料。利用周末去大的書店查資料,把重要的東西記錄下來(lái),也去圖書館借了一些相關(guān)的參考資料,同時(shí)還充分利用網(wǎng)上資源查一些資料。最后再綜合這些資料,在理工實(shí)驗(yàn)樓進(jìn)行具體的操作。從做課題設(shè)計(jì)的過(guò)程中,我的體會(huì)挺多的,感覺到只要有信心與耐心,沒有做不到的事情。因?yàn)樵谶@個(gè)過(guò)程中寫代碼與調(diào)試的過(guò)程中確實(shí)需要耐心與信心,否則就不可能寫完整??傊?,本次課程設(shè)計(jì)使自己收益非淺,為自己以后進(jìn)入社會(huì)工作提供了一次不可多得的鍛煉和實(shí)踐的機(jī)會(huì)。5.參考文獻(xiàn)1.孫全黨王吳迪趙楓朝,java程序設(shè)計(jì)應(yīng)用教程,電

9、子工業(yè)出版社,2006.22.雷之宇,java項(xiàng)目開發(fā)實(shí)踐網(wǎng)絡(luò)篇,中國(guó)鐵道出版社,2005.53陳軼.姚曉昆編著.java程序設(shè)計(jì)實(shí)驗(yàn)指導(dǎo).北京:清華大學(xué)出版社,20064楊昭編著.二級(jí)java語(yǔ)言程序設(shè)計(jì)教程.北京:中國(guó)水利水電出版社,20065趙文靖編著.java程序設(shè)計(jì)基礎(chǔ)與上機(jī)指導(dǎo).北京:清華大學(xué)出版社,2006附錄import java.awt.*;import javax.swing.*;import java.awt.event.*; public class chess extends jlabel private string name; /棋子名 private color

10、 chesscolor; /棋子顏色 private string player; /棋子所屬方public chess(string name,string player,color chesscolor,int round) =name; this.player=player; this.chesscolor=chesscolor; this.round=round; setbackground(color.white); /設(shè)置背景色為白色 public void paint(graphics g) g.setcolor(color.yellow); /設(shè)置當(dāng)前色 g.

11、drawoval(1,1,round-1,round-1); / 用當(dāng)前色繪制橢圓邊框 g.setcolor(color.green); g.filloval(1,1,round-1,round-1); /用當(dāng)前色填充一個(gè)橢圓 g.setcolor(chesscolor); /設(shè)置當(dāng)前色 g.setfont(new font(隸書,font.bold,40); /設(shè)置當(dāng)前字體 g.drawstring(name,10,round-18); /繪制文本 public int getwidth() return round; public int getheight() return round;

12、 public int getround() return round; private int round; /棋子直徑 public string getname() return name; public color getchesscolor() return chesscolor; public void setplayer(string player) this.player=player; public string getplayer() return player; public static void main (string args) jframe frame=new

13、jframe(); / todo 自動(dòng)生成方法存根 jpanel panel=new jpanel(); panel.setlayout(new gridlayout(1,1); chess chess=new chess(車,red,color.red,60); panel.add(chess); frame.add(panel); frame.setsize(100,100); frame.setvisible(true);public static void main (string args) jframe frame=new jframe(); / todo 自動(dòng)生成方法存根 jpa

14、nel panel=new jpanel(); panel.setlayout(new gridlayout(1,1); chess chess=new chess(帥,blue,color.blue,60); panel.add(chess); frame.add(panel); frame.setsize(100,100); frame.setvisible(true);public class point int placex; /x坐標(biāo)值int placey; / y坐標(biāo)值boolean haschess=false; /是否有棋子chess chess=null;public poi

15、nt(int x,int y)this.placex=x;this.placey=y;public int getplacex()return placex;public int getplacey()return placey;public void sethaschess(boolean haschess)this.haschess=haschess;public boolean gethaschess()return haschess;public void addchess(chessboard chessboard,chess chess)this.chess=chess;hasch

16、ess=true; chess.setbounds(placex-chess.getround()/2,placey-chess.getround()/2,chess.getround(),chess.getround(); /設(shè)置chess的位置chess.addmousemotionlistener(chessboard); /加入mousemotionlistener監(jiān)聽器 chess.addmouselistener(chessboard); /加入mouselistener chessboard.add(chess); /棋盤中加入chesschessboard.repaint();

17、 /重繪棋盤public chess getchess()if(chess!=null)return chess;return null;public void setchess(chess chess)this.chess=chess;if(chess=null)haschess=false;elsehaschess=true;public void paintcomponent(graphics g)super.paintcomponent(g);drawboard(g);public void drawboard(graphics g)for(int i=0;iypoint;i+) /畫

18、橫線g.drawline(initx, i*interval+inity, (xpoint-1)*interval+initx, i*interval+inity);g.drawline(initx, inity, initx,(ypoint-1)*interval+inity ); /畫最左側(cè)的豎線g.drawline(xpoint-1)*interval+initx,inity,(xpoint-1)*interval+initx ,(ypoint-1)*interval+inity); /畫最右側(cè)的豎線for(int j=1;j4*interval+inity)return false;i

19、f(startpoint.getchess().getplayer().equals(playerb)if(endpoint.getplacey()5*interval+inity)return false;if(math.abs(startpoint.getplacex()-endpoint.getplacex()=2*interval&math.abs(startpoint.getplacey()-endpoint.getplacey()=2*interval)if(hasblock(name)=0)return true;if(name.equals(兵)if(endpoint.getp

20、lacey()4*interval+inity)if(endpoint.getplacey()=startpoint.getplacey()&math.abs(endpoint.getplacex()-startpoint.getplacex()=interval)return true;if(name.equals(卒)if(endpoint.getplacey()startpoint.getplacey()return false;if(endpoint.getplacex()=startpoint.getplacex()&math.abs(startpoint.getplacey()-e

21、ndpoint.getplacey()=interval)return true;if(startpoint.getplacey()5*interval+inity)if(endpoint.getplacey()=startpoint.getplacey()&math.abs(startpoint.getplacex()-endpoint.getplacex()=interval)return true; if(name.equals(士)if(startpoint.getchess().getplayer().equals(playera)if(endpoint.getplacex()2*i

22、nterval+inity)return false;if(endpoint.getplacex()5*interval+initx|endpoint.getplacey()2*interval+inity)return false;if(startpoint.getchess().getplayer().equals(playerb)if(endpoint.getplacex()3*interval+initx|endpoint.getplacey()5*interval+initx|endpoint.getplacey()7*interval+inity)return false;if(m

23、ath.abs(startpoint.getplacex()-endpoint.getplacex()=interval&math.abs(startpoint.getplacey()-endpoint.getplacey()=interval)return true;if(name.equals(將)if(startpoint.getchess().getplayer().equals(playera)if(endpoint.getplacex()2*interval+inity)return false;if(endpoint.getplacex()5*interval+initx|end

24、point.getplacey()2*interval+inity)return false;if(startpoint.getchess().getplayer().equals(playerb)if(endpoint.getplacex()3*interval+initx|endpoint.getplacey()5*interval+initx|endpoint.getplacey()starty)for(int i=1;ipointsy;i+)if(choicepointstarty+istartx.haschess)blocks+;elsefor(int i=1;istartx)for

25、(int i=1;ipointsx;i+)if(choicepointstartystartx+i.haschess)blocks+;elsefor(int i=1;ipointsx;i+)if(choicepointstartystartx-i.haschess)blocks+; if(name.equals(象)if(endxstarty)if(choicepointstarty+1startx-1.gethaschess()blocks=1;if(endxstartx&endystartx&endystarty)if(choicepointstarty+1startx+1.gethasc

26、hess()blocks=1;if(endxstartx&endystarty)if(choicepointstarty+1startx.gethaschess()blocks=1; elseif(choicepointstarty-1startx.gethaschess()blocks=1;if(pointsx=2)if(endxstartx)if(choicepointstartystartx-1.gethaschess()blocks=1;elseif(choicepointstartystartx+1.gethaschess()blocks=1;system.out.println(+

27、blocks);return blocks;public boolean check()if(!ispoint()return false;return checkrule(startpoint.getchess().getname();/return false;public static void main(string args) / todo 自動(dòng)生成方法存根import java.awt.event.actionevent;import java.awt.event.actionlistener;import javax.swing.*;public class chessframe extends jframe implements actionlistener/* * param args */private chessboard chessboard; /菜單條private jmenubar jmenubar; /菜單項(xiàng)private jmenu jmenu;public chessframe()super(中國(guó)象棋);initcomponents();public void initcomponents()jmenubar=new jmenubar(); /實(shí)例化菜單條jmenu=cr

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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)論