版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上課程設(shè)計報告課程名稱: Java程序設(shè)計 設(shè)計題目: 中國象棋棋譜設(shè)計 專 業(yè) : 信息與計算科學(xué) 班 級 : 信111 姓 名 : 侯曉曉 學(xué) 號 : 指導(dǎo)教師: 鄧全才 河北建筑工程學(xué)院數(shù)理系2014 年 5 月 5 日課程設(shè)計題目(問題)描述Java語言是當(dāng)今流行的網(wǎng)絡(luò)編程語言,它具有面向?qū)ο?、跨平臺、分布應(yīng)用等特點。面向?qū)ο蟮拈_發(fā)方法是當(dāng)今世界最流行的開發(fā)方法,它不僅具有更貼近自然的語義,而且有利于軟件的維護(hù)和繼承,很好的融合了“面向?qū)ο蟆?、“跨平臺”和“編程簡潔”等特性。隨著Java語言的不斷發(fā)展,它的應(yīng)用前景將更為寬闊。本課程設(shè)計主要是使用Swing這個J
2、ava自帶的圖形開發(fā)工具實現(xiàn)中國象棋棋子及棋盤的繪制,并根據(jù)相應(yīng)的象棋規(guī)則,可以設(shè)計棋譜,完成棋譜的保存和對已保存的棋譜的演示,方便現(xiàn)在愛棋人士對殘局的收藏于研究,而且達(dá)到了進(jìn)一步鞏固課堂上所學(xué)到的知識,深刻把握J(rèn)ava語言的重要概念及其面向?qū)ο蟮奶匦裕炀毜膽?yīng)用面向?qū)ο蟮乃枷牒驮O(shè)計方法解決實際問題的能力的目的。本 組 成 員 情 況姓 名學(xué)號承 擔(dān) 的 任 務(wù)成 績侯曉曉棋盤界面設(shè)計,對弈規(guī)則的實現(xiàn),保存下棋的步驟從而實現(xiàn)悔棋的實現(xiàn),設(shè)計棋譜,完成保存棋譜教 師 評 語 簽名: 一、本 組 設(shè) 計 的 功 能 描 述一、 基本界面設(shè)計:1.棋子的設(shè)計;(1)聲明一個ChessPiece類,完
3、成各個棋子的外觀設(shè)計;public class ChessPiece extends JLabel String name; Color backColor=null,foreColor; String 顏色類別=null; ChessBoard board=null; int width,height; public ChessPiece(String name,Color fc,Color bc,int width,int height,ChessBoard board) =name; this.board=board; this.width=width; this.he
4、ight=height; foreColor=fc; backColor=bc; setSize(width,height); setBackground(bc); addMouseMotionListener(board); addMouseListener(board); public void paint(Graphics g) g.setColor(foreColor); g.fillOval(2,2,width-2,height-2); g.setColor(Color.white); g.setFont(new Font("隸書",Font.BOLD,28);
5、g.drawString(name,7,height-8); g.setColor(Color.yellow); g.drawOval(2,2,width-2,height-2); public int getWidth()return width; public int getHeight()return height; public String getName()return name; public Color 獲取棋子顏色() return foreColor; public void set棋子類別(String 類別)顏色類別=類別; public String 棋子類別()re
6、turn 顏色類別;(2)實現(xiàn)各個棋子外觀;import javax.swing.*;import java.awt.*;import java.awt.event.*;public class ChessBoard extends JPanel implements MouseListener,MouseMotionListenerpublic ChessPoint point; public int unitWidth,unitHeight; int x軸長,y軸長; int x,y; boolean move=false; public String 紅方顏色="紅色"
7、;,黑方顏色="黑色"ChessPiece 紅車1,紅車2,紅馬1,紅馬2,紅相1,紅相2,紅帥,紅士1,紅士2,紅兵1,紅兵2,紅兵3,紅兵4,紅兵5,紅炮1,紅炮2;ChessPiece 黑車1,黑車2,黑馬1,黑馬2,黑將,黑士1,黑士2,黑卒1,黑卒2,黑卒3,黑卒4,黑卒5,黑象1,黑象2,黑炮1,黑炮2; int startX,startY; int startI,startJ; public boolean 紅方走棋=true,黑方走棋=false; Rule rule=null; public MakeChessManual record=null; pub
8、lic ChessBoard(int w,int h,int r,int c) setLayout(null); addMouseListener(this); addMouseMotionListener(this); Color bc=getBackground(); unitWidth=w; unitHeight=h; x軸長=r; y軸長=c; point=new ChessPointr+1c+1; for(int i=1;i<=r;i+) for(int j=1;j<=c;j+)pointij=new ChessPoint(i*unitWidth,j*unitHeight
9、,false); rule=new Rule(this,point); record=new MakeChessManual(this,point) ; 紅車1=new ChessPiece("車",Color.red,bc,w-4,h-4,this); 紅車1.set棋子類別(紅方顏色); /分別是紅方各個棋子的設(shè)計 紅兵5=new ChessPiece("兵",Color.red,bc,w-4,h-4,this); 紅兵5.set棋子類別(紅方顏色); 黑將=new ChessPiece("將",Color.blue,bc,w-4
10、,h-4,this); 黑將.set棋子類別(黑方顏色); /分別是黑方各個棋子的設(shè)計 黑卒5=new ChessPiece("卒",Color.blue,bc,w-4,h-4,this); 黑卒5.set棋子類別(黑方顏色); point110.setPiece(紅車1,this); /紅方的每個棋子放到與生活中棋盤位置一樣 point97.setPiece(紅兵5,this); point11.setPiece(黑車1,this); /黑方的每個棋子放到與生活中棋盤位置一樣 point94.setPiece(黑卒5,this); (3)棋盤的設(shè)計: public voi
11、d paintComponent(Graphics g) super.paintComponent(g); for(int j=1;j<=y軸長;j+) g.drawLine(point1j.x,point1j.y,pointx軸長j.x,pointx軸長j.y); for(int i=1;i<=x軸長;i+) if(i!=1&&i!=x軸長) g.drawLine(pointi1.x,pointi1.y,pointiy軸長-5.x,pointiy軸長-5.y); g.drawLine(pointiy軸長-4.x,pointiy軸長-4.y,pointiy軸長.x,
12、pointiy軸長.y); else g.drawLine(pointi1.x,pointi1.y,pointiy軸長.x,pointiy軸長.y); g.drawLine(point41.x,point41.y,point63.x,point63.y);g.drawLine(point61.x,point61.y,point43.x,point43.y); g.drawLine(point48.x,point48.y,point6y軸長.x,point6y軸長.y);g.drawLine(point4y軸長.x,point4y軸長.y,point68.x,point68.y); for(in
13、t i=1;i<=x軸長;i+) g.drawString(""+i,i*unitWidth,unitHeight/2);int j=1; for(char c='A'c<='J'c+) g.drawString(""+c,unitWidth/4,j*unitHeight);j+; (4)實現(xiàn)棋子按照生活中的對弈規(guī)則走棋的程序如下:public boolean movePieceRule(ChessPiece piece,int startI,int startJ,int endI,int endJ) this
14、.piece=piece;this.startI=startI;this.startJ=startJ; this.endI=endI; this.endJ=endJ; int minI=Math.min(startI,endI); int maxI=Math.max(startI,endI); int minJ=Math.min(startJ,endJ); int maxJ=Math.max(startJ,endJ);boolean 可否走棋=false;if(piece.getName().equals("車")if(startI=endI) int j=0;for(j=
15、minJ+1;j<=maxJ-1;j+) if(pointstartIj.isPiece()可否走棋=false;break; if(j=maxJ)可否走棋=true;else if(startJ=endJ) int i=0;for(i=minI+1;i<=maxI-1;i+) if(pointistartJ.isPiece()可否走棋=false;break; if(i=maxI)可否走棋=true;else可否走棋=false;else if(piece.getName().equals("馬")./以及各個棋子規(guī)則的設(shè)計(5)實現(xiàn)棋子按對弈規(guī)則的移動并記錄
16、棋子移動的位置;界面如下: 代碼如下 public void mousePressed(MouseEvent e) ChessPiece piece=null;Rectangle rect=null; if(e.getSource()=this)move=false; if(move=false) if(e.getSource() instanceof ChessPiece) piece=(ChessPiece)e.getSource(); startX=piece.getBounds().x; startY=piece.getBounds().y; rect=piece.getBounds(
17、); for(int i=1;i<=x軸長;i+) for(int j=1;j<=y軸長;j+) int x=pointij.getX(); int y=pointij.getY(); if(rect.contains(x,y) startI=i;startJ=j;break; public void mouseMoved(MouseEvent e) public void mouseDragged(MouseEvent e) ChessPiece piece=null; if(e.getSource() instanceof ChessPiece) piece=(ChessPie
18、ce)e.getSource(); move=true; e=SwingUtilities.convertMouseEvent(piece,e,this); if(e.getSource()=this)if(move&&piece!=null) x=e.getX(); y=e.getY(); if(紅方走棋&&(piece.棋子類別().equals(紅方顏色)piece.setLocation(x-piece.getWidth()/2,y-piece.getHeight()/2); if(黑方走棋&&(piece.棋子類別().equals(黑
19、方顏色) piece.setLocation(x-piece.getWidth()/2,y-piece.getHeight()/2); public void mouseReleased(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseExited(MouseEvent e) public void mouseClicked(MouseEvent e) 2.圖中中國象棋是個菜單包括制作棋譜、保存棋譜、演示棋譜三個菜單項(1)保存棋譜設(shè)計界面為:當(dāng)你制作棋譜文件時可以選擇路徑保存棋譜文件(2)演示棋譜設(shè)計
20、界面為:A可以從文件中選擇你要演示的棋譜文件B選擇文件后開始演示棋譜文件自動演示中可以按照你設(shè)計棋譜時的步驟一次生成保存的棋譜文件,也可以設(shè)置時間間隔,使得生成文件時一步和下一步的時間安裝你設(shè)置的時間進(jìn)行,也可以收手動操作,一步一步的進(jìn)行。并在旁邊記錄棋子移動位置的記錄設(shè)計actionPerformed事件的代碼為:public void actionPerformed(ActionEvent e) if(e.getSource()=制作棋譜) con.removeAll();保存棋譜.setEnabled(true); this.setTitle(制作棋譜.getText(); board=
21、new ChessBoard(45,45,9,10); record=board.record; JSplitPane split=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,board,record); split.setDividerSize(5); split.setDividerLocation(460); con.add(split,BorderLayout.CENTER); validate(); if(e.getSource()=保存棋譜) int state=fileChooser.showSaveDialog(null);
22、File saveFile =fileChooser.getSelectedFile();if(saveFile!=null&&state=JFileChooser.APPROVE_OPTION) tryFileOutputStream outOne=newFileOutputStream(saveFile); ObjectOutputStream outTwo=new ObjectOutputStream(outOne); outTwo.writeObject(record.獲取棋譜() ; outOne.close(); outTwo.close(); catch(IOEx
23、ception event) if(e.getSource()=演示棋譜) con.removeAll();con.repaint();con.validate(); validate(); 保存棋譜.setEnabled(false); int state=fileChooser.showOpenDialog(null); File openFile =fileChooser.getSelectedFile(); if(openFile!=null&&state=JFileChooser.APPROVE_OPTION) tryFileInputStream inOne=new
24、 FileInputStream(openFile); ObjectInputStream inTwo=new ObjectInputStream(inOne); 棋譜=(LinkedList)inTwo.readObject() ; inOne.close();inTwo.close();ChessBoard board=new ChessBoard(45,45,9,10);demon=new Demon(board); demon.set棋譜(棋譜);con.add(demon,BorderLayout.CENTER);con.validate(); validate();this.set
25、Title(演示棋譜.getText()+":"+openFile); catch(Exception event)JLabel label=new JLabel("不是棋譜文件"); label.setFont(new Font("隸書",Font.BOLD,60);label.setForeground(Color.red); label.setHorizontalAlignment(SwingConstants.CENTER);con.add(label,BorderLayout.CENTER);con.validate(); this.setTitle("沒有打開棋譜"); validate(); elseJLabel label=new JLabel("沒有打開棋譜文件呢"); label.setFont(new Font("隸書",Font.BOLD,50); label.setForeground(Color.pink); label.s
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新課標(biāo)小學(xué)語文“學(xué)習(xí)任務(wù)群”的教學(xué)思路
- 高中物理第十一章電路及其應(yīng)用課時13串聯(lián)電路和并聯(lián)電路課件新人教版必修第三冊
- Windows Server網(wǎng)絡(luò)管理項目教程(Windows Server 2022)(微課版)5.5 拓展案例1:Web站點安全加固
- 全省小學(xué)數(shù)學(xué)教師賽課一等獎數(shù)學(xué)一年級上冊(人教2024年新編)《10的加、減法》課件
- 2014年腔體耦合器投資分析研究咨詢報告
- 2024至2030年中國整體式豆奶機(jī)行業(yè)投資前景及策略咨詢研究報告
- 2024至2030年中國成套污水處理機(jī)械設(shè)備數(shù)據(jù)監(jiān)測研究報告
- 2024至2030年中國家用縫紉機(jī)控制器拉桿行業(yè)投資前景及策略咨詢研究報告
- 高中物理第五章交變電流5電能的輸送課件新人教版選修3-
- 2024至2030年中國中頻整體退火設(shè)備行業(yè)投資前景及策略咨詢研究報告
- 2022年北京北師大實驗中學(xué)初二(上)期中英語試卷及答案
- ICP備案網(wǎng)站建設(shè)方案書
- 醫(yī)院陪檢外送人員管理方案
- 2024年紀(jì)檢監(jiān)察綜合業(yè)務(wù)知識題庫及完整答案(歷年真題)
- 房屋維保防水維修類清單及處理方案
- 基于STM32的智能家居控制系統(tǒng)的設(shè)計與開發(fā)
- 2024-2029年中國心理咨詢行業(yè)發(fā)展分析及發(fā)展趨勢預(yù)測報告
- 醫(yī)療事故的心得體會(18篇)
- 濟(jì)東中學(xué)新教育實驗聆聽窗外聲音專項方案
- 《漂亮的手工燈飾》參考課件
- 現(xiàn)實與理想-西方古典繪畫 課件-2023-2024學(xué)年高中美術(shù)人美版(2019)美術(shù)鑒賞
評論
0/150
提交評論