版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、象棋程序设计 1. 课程设计目的java语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承。为了进一步巩固课堂上所学到的知识,深刻把握java语言的重要概念及其面向对象的特性,锻炼学生熟练的应用面向对象的思想和设计方法解决实际问题的能力,开设了一周的java程序设计课程设计。通过此次课程设计,巩固所学java语言基本知识,增进java语言编辑基本功,掌握jdk、editplus、eclipse、jcreator等开发工具的运用,拓宽常用类库的应用。使学生通过该教学环节与手段,
2、把所学课程及相关知识加以融会贯通,全面掌握java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。2设计方案论证2.1功能描述象棋是中国一种流传十分广泛的游戏。下棋双方根据自己对棋局形式的理解和对棋艺规律的掌握,调动车马,组织兵力,协调作战在棋盘这块特定的战场上进行着象征性的军事战斗。本程序的功能就是将棋盘和棋子在电脑上模拟出来,双方可以通过鼠标对己方棋子的操作进行对弈。2.2概要设计 象棋,人人会走,把己方的棋子按不同棋子的规则放在棋盘合适的位置上。象棋包含三个要素:棋盘、棋子和规则。在本象棋程序的设计上,也大致遵循这三个要素,但是细化为四个方面:棋盘、棋盘上可以走
3、棋的落子点、棋子和象棋规则。棋盘:绘制棋盘时,进行画横线,画最左侧的竖线,画最右侧的竖线,画中间的竖线,画斜线等操作。棋盘其实就是一张棋盘的图形,我们要在计算机上的棋盘上落子并不像在现实生活中那么容易,这里说的棋盘充其量只是背景。落子点:真正落子的地方必须是我们在图形界面上设定的落子点。落子点其实就是在图形界面上定义一个应该摆放棋子的点位置。棋子:包括棋子名和棋子颜色和棋子所属方等信息。象棋规则:不同棋子只能按照各自的规则在这些设定的位置上摆放、搏杀。 根据前面的细化,程序中分别设计了四个类对应棋盘、落子点、棋子和象棋规则这四个方面。四个类几乎包括了程序的全部,程序框图如下图所示: 中国象棋棋
4、 子落子点 绘 制 棋 盘象棋规则 画 斜 线 画 中 间 竖 线 画 最 右 侧 竖 线 画 最 左 侧 竖 线 画 横 线 棋 子 颜 色 棋 子 所 属 方 棋 子 名图1 .程序功能框图2.3详细设计2.3.1棋子类chess swing中并没有棋子这个组建类,所以我们必须设计一个组件,棋子其实就是圆形的jlabel,但swing中的jlabel组件是方形的,没关系,利用jlabel我们可以创建圆形的jlabel组件chess。2.3.2落子点类point在平面中确定一个点需要x坐标和y 坐标,在图形界面中确定一个点同样也需要x坐标和y坐标。图形界面的左上角的坐标为(0,0),x数值往
5、右增大,y数值往下增大。落子点其实就是在图形界面上定义一个应该摆放棋子的点位置,棋子摆放在任何位置都视为非法,除了落子点。当然,描述一个点位置仅仅是类point的基本功能之一,他还需要知道这个点上是否已有棋子以及是什么棋子。2.3.3棋盘类chessbord棋盘其实就是我们看到的一个图形界面,将棋盘设计为jpanel类,在jpanel这个容器上,我们可以利用坐标确定落子点,也可以加入我们自定义的棋子组件。 jpanel容器其实就像有底色的画布,有了落子点和棋子,还需要我们自己画横线和竖线。chessbord继承了jpanel,覆写方法paintcompont,实例化jpanel时,会自动调用该
6、方法。2.3.4规则类chessrule chessrule类的作用就是判断走棋是否合法。实现思路就是根据走棋的起点和终点计算走棋路线中是否有其他的棋子,再依据是何种棋子判断走棋是否合法。2.3.5类chessframe 虽然上面4个类实现了象棋程序的所有功能,但还需要一个底层窗口容器加载chessboard这个jpanel。并添加相应的菜单。3.设计结果与分析程序运行之后,可以实现两个人分别控制红方和黑方的棋子进行对弈,缺点就是程序过于简单,只能实现上述功能,不能悔棋,没有计时功能,也不能实现人机对弈功能。程序运行结果如下所示:图2. chess类的运行结果“车”绘制“中国象棋棋盘”,通过定
7、义划横线,画左侧的竖线,画最右侧的竖线,画中间的竖线,画斜线等操作,输出程序的棋盘的运行结果。图3.中国象棋棋盘通过定义x坐标,y坐标,和棋子,并将棋子加入到棋盘上的指定位置,输出中国象棋开局的程序运行结果。图4.中国象棋程序运行效果图开局图5.中国象棋程序运行效果图残局4.设计体会通过对java的课程设计,针对java的书本知识得到了进一步的巩固,具体化就是加深了我对图形用户界面理解,对程序的深层理解,清楚程序中每一步的功能,在程序的运行中是十分重要的,一个好的结构在运行中能够充分的发挥程序的功能。把书本上学习到的知识应用到实际中去,很好的锻炼了我编写java语言的能力。结构设计的合理性决定
8、了这个程序的价值。在今后的学习中我要注意这方面,使得我的编程能力能有进一步的提高。在整个设计过程中,通过各种渠道获取资料。利用周末去大的书店查资料,把重要的东西记录下来,也去图书馆借了一些相关的参考资料,同时还充分利用网上资源查一些资料。最后再综合这些资料,在理工实验楼进行具体的操作。从做课题设计的过程中,我的体会挺多的,感觉到只要有信心与耐心,没有做不到的事情。因为在这个过程中写代码与调试的过程中确实需要耐心与信心,否则就不可能写完整。总之,本次课程设计使自己收益非浅,为自己以后进入社会工作提供了一次不可多得的锻炼和实践的机会。5.参考文献1.孙全党王吴迪赵枫朝,java程序设计应用教程,电
9、子工业出版社,2006.22.雷之宇,java项目开发实践网络篇,中国铁道出版社,2005.53陈轶.姚晓昆编著.java程序设计实验指导.北京:清华大学出版社,20064杨昭编著.二级java语言程序设计教程.北京:中国水利水电出版社,20065赵文靖编著.java程序设计基础与上机指导.北京:清华大学出版社,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); /设置背景色为白色 public void paint(graphics g) g.setcolor(color.yellow); /设置当前色 g.
11、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;
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 自动生成方法存根 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 自动生成方法存根 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坐标值int placey; / y坐标值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(); /设置chess的位置chess.addmousemotionlistener(chessboard); /加入mousemotionlistener监听器 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 ); /画最左侧的竖线g.drawline(xpoint-1)*interval+initx,inity,(xpoint-1)*interval+initx ,(ypoint-1)*interval+inity); /画最右侧的竖线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 自动生成方法存根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=cr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工程项目职业健康措施清单
- 中医头痛头晕调理规范
- 2026年生物恐怖事件医学处置考试试卷及答案
- 电梯安装施工方案
- 反应釜维护保养规程
- CAAC无人机理论考试题库及答案(2026修订版)
- 石油工程调试方案
- 中医亚健康干预规范
- 2026年海南省网格员招聘考试备考题库及答案解析
- 地理标志产品丹东塔醋
- 玻璃钢管道安装技术方案
- 基于STM32的智能储物柜系统设计
- 2025年厦门大学强基计划招生考试数学试题真题(含答案)
- 2025年全国信息素养大赛-智创生态挑战赛初赛试题
- 口腔科器械标准化清洗流程
- 医疗设备第三方维修与保养服务项目可行性研究报告
- (四调)武汉市2025届高中毕业生四月调研考试 历史试卷(含答案)
- 危急值报告制度考试题
- T-CSEE 0399-2023 水电站紧固件技术监督导则
- 高血压急症和亚急症
- 2025届中国长江电力股份限公司“三峡班”招聘易考易错模拟试题(共500题)试卷后附参考答案
评论
0/150
提交评论