java课程设计中国象棋.doc_第1页
java课程设计中国象棋.doc_第2页
java课程设计中国象棋.doc_第3页
java课程设计中国象棋.doc_第4页
java课程设计中国象棋.doc_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计说明书 NO.1象棋程序设计 1.课程设计目的Java语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承,很好的融合了“面向对象”、“跨平台”和“编程简洁”等特性。随着Java语言的不断发展,它的应用前景将更为宽阔。本课程设计主要是使用Swing这个Java自带的图形开发工具实现中国象棋棋子及棋盘的绘制,并根据相应的象棋规则,实现在电脑上虚拟出可以供两个人对弈的象棋游戏,从而达到了进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性,熟练的应用面向对象的思想和设计方法解决实际问题的能力的目的。2设计方案论证2.1程序功能象棋是中国一种流传十分广泛的游戏。下棋双方根据自己对棋局形式的理解和对棋艺规律的掌握,调动车马,组织兵力,协调作战在棋盘这块特定的战场上进行着象征性的军事战斗。本程序的功能就是将棋盘和棋子在电脑上模拟出来,双方可以通过鼠标对己方棋子的操作进行对弈。2.2设计思路 象棋,人人会走,把己方的棋子按不同棋子的规则放在棋盘合适的位置上。象棋包含三个要素:棋盘、棋子和规则。在本象棋程序的设计上,也大致遵循这三个要素,但是细化为四个方面:棋盘、棋盘上可以走棋的落子点、棋子和象棋规则。棋盘其实就是一张棋盘的图形,我们要在计算机上的棋盘上落子并不像在现实生活中那么容易,这里说的棋盘充其量只是背景,真正落子的地方必须是我们在图形界面上设定的落子点,不同棋子只能按照各自的规则在这些设定的位置上摆放、搏杀。2.3设计方法根据前面的细化,程序中分别设计了四个类对应棋盘、落子点、棋子和象棋规则这 沈 阳 大 学课程设计说明书 NO.2四个方面。四个类几乎包括了程序的全部,程序框图如下图所示:中国象棋棋 子落子点棋盘象棋规则 图1 程序功能框图2.4详细设计2.4.1棋子类ChessSwing中并没有棋子这个组建类,所以我们必须设计一个组件,棋子其实就是圆形的JLabel,但Swing中的JLabel组件是方形的,没关系,利用JLabel我们可以创建圆形的JLabel组件Chess。运行结果:图2 Chess类的运行结果“车” 沈 阳 大 学课程设计说明书 NO.3运行结果:图3 Chess类的运行结果“帅”2.4.2落子点类Point在平面中确定一个点需要X坐标和Y 坐标,在图形界面中确定一个点同样也需要X坐标和Y坐标。图形界面的左上角的坐标为(0,0),X数值往右增大,Y数值往下增大。落子点其实就是在图形界面上定义一个应该摆放棋子的点位置,棋子摆放在任何位置都视为非法,除了落子点。当然,描述一个点位置仅仅是类Point的基本功能之一,他还需要知道这个点上是否已有棋子以及是什么棋子。2.4.3棋盘类ChessBord棋盘其实就是我们看到的一个图形界面,将棋盘设计为JPanel类,在Jpanel这个容器上,我们可以利用坐标确定落子点,也可以加入我们自定义的棋子组件。 JPanel容器其实就像有底色的画布,有了落子点和棋子,还需要我们自己画横线和竖线。ChessBord继承了JPanel,覆写方法paintCompont,实例化JPanel时,会自动调用该方法。 沈 阳 大 学课程设计说明书 NO.4图4 中国象棋棋盘2.4.4规则类ChessRuleChessRule类的作用就是判断走棋是否合法。实现思路就是根据走棋的起点和终点计算走棋路线中是否有其他的棋子,再依据是何种棋子判断走棋是否合法。 沈 阳 大 学课程设计说明书 NO.52.4.4类ChessFrame 虽然上面4个类实现了象棋程序的所有功能,但还需要一个底层窗口容器加载ChessBoard这个JPanel。并添加相应的菜单。3.设计结果与分析 程序运行之后,可以实现两个人分别控制红方和黑方的棋子进行对弈,缺点就是程序过于简单,只能实现上述功能,不能悔棋,没有计时功能,也不能实现人机对弈功能。程序运行效果图如下所示:图5 中国象棋程序运行效果图开局 沈 阳 大 学课程设计说明书 NO.6图6 中国象棋程序运行效果图残局 沈 阳 大 学课程设计说明书 NO.74.设计体会通过对java的课程设计,针对java的书本知识得到了进一步的巩固,具体化就是加深了我对图形用户界面理解,对程序的深层理解,清楚程序中每一步的功能,在程序的运行中是十分重要的,一个好的结构在运行中能够充分的发挥程序的功能。把书本上学习到的知识应用到实际中去,很好的锻炼了我编写java语言的能力。结构设计的合理性决定了这个程序的价值。在今后的学习中我要注意这方面,使得我的编程能力能有进一步的提高。到此,一个完整的设计程序创建完毕。其功能基本符合需求,能够实现象棋的基本功能。但是由于课程设计时间较短,所以该设计还有许多不尽如人意的地方,但是这些都有待进一步改善。通过本课题的课程设计,我进一步了解和掌握了java这门学科。在完成此设计期间,我不仅提高了实际的编程能力,还深入了解了软件开发的全过,经历了这次课程设计,不仅对我的学习提供了帮助,而且在意志力方面也得到了锻炼,没有足够的耐力和信心就很难坚持对课程设计每一步的顺利进行。在整个设计过程中,通过各种渠道获取资料。利用周末去大的书店查资料,把重要的东西记录下来,也去图书馆借了一些相关的参考资料,同时还充分利用网上资源查一些资料。最后再综合这些资料,在理工实验楼进行具体的操作。从做课题设计的过程中,我的体会挺多的,感觉到只要有信心与耐心,没有做不到的事情。因为在这个过程中写代码与调试的过程中确实需要耐心与信心,否则就不可能写完整。总之,本次课程设计使自己收益非浅,为自己以后进入社会工作提供了一次不可多得的锻炼和实践的机会。 沈 阳 大 学课程设计说明书 NO.85.参考文献1胡书敏,陈宝峰,程炜杰.Java 第一步M.北京:清华大学出版社.2009年1月:P257-2872朱站立,沈伟. Java程序设计实用教程M. 北京:电子工业出版社. 2006年7月:P90-1343.印旻. Java语言与面向对象程序设计M.北京: 清华大学出版社,2003年2月:P99-1464.陈国君,陈磊,陈锡祯,刘洋. Java 2程序设计基础M.北京:清华大学出版社,2008年6月:P45-675.匡松,周永.百问白例Java语言程序设计M.北京:中国铁道出版社,2009年1月:P99-1466.李文泽,郑逢斌,徐彬,沈夏炯.Java专家门诊M.北京:清华大学出版社,2006年4月:P68-100 沈 阳 大 学课程设计说明书 NO.9import java.awt.*;import javax.swing.*;import java.awt.event.*; public class Chess extends JLabel private String name; /棋子名 private Color 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); /设置背景色为白色 public void paint(Graphics g) g.setColor(Color.yellow); /设置当前色 g.drawOval(1,1,round-1,round-1); / 用当前色绘制椭圆边框 g.setColor(Color.green); g.fillOval(1,1,round-1,round-1); /用当前色填充一个椭圆 g.setColor(chessColor); /设置当前色 g.setFont(new Font(隶书,Font.BOLD,40); /设置当前字体 g.drawString(name,10,round-18); /绘制文本 public int getWidth() return round; public int getHeight() return round; 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 JFrame(); / TODO 自动生成方法存根 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 自动生成方法存根 JPanel 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坐标值int placeY; / Y坐标值boolean hasChess=false; /是否有棋子Chess chess=null;public Point(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;hasChess=true; chess.setBounds(placeX-chess.getRound()/2,placeY-chess.getRound()/2,chess.getRound(),chess.getRound(); /设置Chess的位置chess.addMouseMotionListener(chessboard); /加入MouseMotionListener监听器 chess.addMouseListener(chessboard); /加入MouseListener chessboard.add(chess); /棋盘中加入Chesschessboard.repaint(); /重绘棋盘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+) /画横线g.drawLine(initX, i*interval+initY, (xPoint-1)*interval+initX, i*interval+initY);g.drawLine(initX, initY, initX,(yPoint-1)*interval+initY ); /画最左侧的竖线g.drawLine(xPoint-1)*interval+initX,initY,(xPoint-1)*interval+initX ,(yPoint-1)*interval+initY); /画最右侧的竖线for(int j=1;j4*interval+initY)return false;if(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.getPlaceY()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()-endPoint.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*interval+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(Math.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|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()startY)for(int i=1;ipointsY;i+)if(choicePointstartY+istartX.hasChess)blocks+;elsefor(int i=1;istartX)for(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.getHasChess()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(+blocks);return blocks;public boolean check()if(!isPoint()return false;return checkRule(startPoint.getChess().getName();/return false;public static void main(String args) / TODO 自动生成方法存根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; /菜单项private JMenu jMenu;public ChessFrame()super(中国象棋);initComponents();public void initComponents()jMenuBar=new JMenuBar(); /实例化菜单条jMenu=createFileMenu(); /获得一个菜单项jMenuBar.add(jMenu); /将菜单项加入菜单条jMenuBar.setOpaque(true); /菜单条设为不透明setJMenuBar(jMenuBar); /在容器中加入菜单条chessboard=new ChessBoard(); /实例化象棋图形界面getContentPane().add(chessboard); /加入象棋界面setSize(700,700); /设置窗口大小setVisible(true); /设置窗口可见private JMenu createFileMenu()JMenu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论