




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计报告课程名称: Java程序设计 设计题目: 中国象棋棋谱设计 专 业 : 信息与计算科学 班 级 : 信111 姓 名 : 侯晓晓 学 号 : 指导教师: 邓全才 河北建筑工程学院数理系2014 年 5 月 5 日课程设计题目(问题)描述Java语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承,很好的融合了“面向对象”、“跨平台”和“编程简洁”等特性。随着Java语言的不断发展,它的应用前景将更为宽阔。本课程设计主要是使用Swing这个Java自带的图形开发工具实现中国象棋棋子及棋盘的绘制,并根据相应的象棋规则,可以设计棋谱,完成棋谱的保存和对已保存的棋谱的演示,方便现在爱棋人士对残局的收藏于研究,而且达到了进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性,熟练的应用面向对象的思想和设计方法解决实际问题的能力的目的。本 组 成 员 情 况姓 名学号承 担 的 任 务成 绩侯晓晓棋盘界面设计,对弈规则的实现,保存下棋的步骤从而实现悔棋的实现,设计棋谱,完成保存棋谱教 师 评 语 签名: 一、本 组 设 计 的 功 能 描 述一、 基本界面设计:1.棋子的设计;(1)声明一个ChessPiece类,完成各个棋子的外观设计;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.height=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); 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 棋子类别()return 颜色类别;(2)实现各个棋子外观;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 红方颜色=红色,黑方颜色=黑色;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; public 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,false); rule=new Rule(this,point); record=new MakeChessManual(this,point) ; 红车1=new ChessPiece(车,Color.red,bc,w-4,h-4,this); 红车1.set棋子类别(红方颜色); /分别是红方各个棋子的设计 红兵5=new ChessPiece(兵,Color.red,bc,w-4,h-4,this); 红兵5.set棋子类别(红方颜色); 黑将=new ChessPiece(将,Color.blue,bc,w-4,h-4,this); 黑将.set棋子类别(黑方颜色); /分别是黑方各个棋子的设计 黑卒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)棋盘的设计: public void 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,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(int 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)实现棋子按照生活中的对弈规则走棋的程序如下:public boolean movePieceRule(ChessPiece piece,int startI,int startJ,int endI,int endJ) this.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=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(马)./以及各个棋子规则的设计(5)实现棋子按对弈规则的移动并记录棋子移动的位置;界面如下: 代码如下 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(); 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=(ChessPiece)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(黑方颜色) 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)保存棋谱设计界面为:当你制作棋谱文件时可以选择路径保存棋谱文件(2)演示棋谱设计界面为:A可以从文件中选择你要演示的棋谱文件B选择文件后开始演示棋谱文件自动演示中可以按照你设计棋谱时的步骤一次生成保存的棋谱文件,也可以设置时间间隔,使得生成文件时一步和下一步的时间安装你设置的时间进行,也可以收手动操作,一步一步的进行。并在旁边记录棋子移动位置的记录设计actionPerformed事件的代码为:public void actionPerformed(ActionEvent e) if(e.getSource()=制作棋谱) con.removeAll();保存棋谱.setEnabled(true); this.setTitle(制作棋谱.getText(); board=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); 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(IOException 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 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.setTitle(演示棋谱.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.setHorizontalAlignment(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 甘肃省白银市靖远一中2026届化学高三第一学期期中调研模拟试题含解析
- 考点解析北师大版8年级数学上册期中试题【完整版】附答案详解
- 湖南省怀化市中方县二中2026届高一化学第一学期期中学业质量监测试题含解析
- 推拿治疗学测试题含答案详解【突破训练】
- 道岔钳工技能巩固考核试卷及答案
- 农副产品环保日用品创新创业项目商业计划书
- 电竞安全竞赛环境创新创业项目商业计划书
- 计算机网络设备装配调试员技术考核试卷及答案
- 农产品供应链金融风险评估创新创业项目商业计划书
- 海藻制碘工三级安全教育(公司级)考核试卷及答案
- 云南省委党校行政学院考试真题(附答案)
- JJF 2258-2025关联法天然气发热量测定仪校准规范
- 华润集团标识管理办法
- 2024中国地质大学(武汉)辅导员招聘笔试真题
- 混凝土-物理力学性能-试验方法标准
- 科创板开户测试题及答案
- 田野之声:现代农业发展深度调查报告
- 简短戒烟干预戒烟成功
- 治安防范培训课件
- DB3203-T 1080-2025 城市道路路名牌设置规范
- 带状疱疹护理业务查房
评论
0/150
提交评论