象棋程序设计.docx
《象棋程序设计.docx》由会员分享,可在线阅读,更多相关《象棋程序设计.docx(18页珍藏版)》请在冰点文库上搜索。
象棋程序设计
象棋程序设计
1.课程设计目的
Java语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。
面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承。
为了进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性,锻炼学生熟练的应用面向对象的思想和设计方法解决实际问题的能力,开设了一周的Java程序设计课程设计。
通过此次课程设计,巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、Editplus、Eclipse、JCreator等开发工具的运用,拓宽常用类库的应用。
使学生通过该教学环节与手段,把所学课程及相关知识加以融会贯通,全面掌握Java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。
2.设计方案论证
功能描述
象棋是中国一种流传十分广泛的游戏。
下棋双方根据自己对棋局形式的理解和对棋艺规律的掌握,调动车马,组织兵力,协调作战在棋盘--这块特定的战场上进行着象征性的军事战斗。
本程序的功能就是将棋盘和棋子在电脑上模拟出来,双方可以通过鼠标对己方棋子的操作进行对弈。
概要设计
象棋,人人会走,把己方的棋子按不同棋子的规则放在棋盘合适的位置上。
象棋包含三个要素:
棋盘、棋子和规则。
在本象棋程序的设计上,也大致遵循这三个要素,但是细化为四个方面:
棋盘、棋盘上可以走棋的落子点、棋子和象棋规则。
棋盘:
绘制棋盘时,进行画横线,画最左侧的竖线,画最右侧的竖线,画中间的竖线,画斜线等操作。
棋盘其实就是一张棋盘的图形,我们要在计算机上的棋盘上落子并不像在现实生活中那么容易,这里说的棋盘充其量只是背景。
落子点:
真正落子的地方必须是我们在图形界面上设定的落子点。
落子点其实就是在图形界面上定义一个应该摆放棋子的点位置。
棋子:
包括棋子名和棋子颜色和棋子所属方等信息。
象棋规则:
不同棋子只能按照各自的规则在这些设定的位置上摆放、搏杀。
根据前面的细化,程序中分别设计了四个类对应棋盘、落子点、棋子和象棋规则这四个方面。
四个类几乎包括了程序的全部,程序框图如下图所示:
图1.程序功能框图
详细设计
棋子类Chess
Swing中并没有棋子这个组建类,所以我们必须设计一个组件,棋子其实就是圆形的JLabel,但Swing中的JLabel组件是方形的,没关系,利用JLabel我们可以创建圆形的JLabel组件——Chess。
落子点类Point
在平面中确定一个点需要X坐标和Y坐标,在图形界面中确定一个点同样也需要X坐标和Y坐标。
图形界面的左上角的坐标为(0,0),X数值往右增大,Y数值往下增大。
落子点其实就是在图形界面上定义一个应该摆放棋子的点位置,棋子摆放在任何位置都视为非法,除了落子点。
当然,描述一个点位置仅仅是类Point的基本功能之一,他还需要知道这个点上是否已有棋子以及是什么棋子。
棋盘类ChessBord
棋盘其实就是我们看到的一个图形界面,将棋盘设计为JPanel类,在Jpanel这个容器上,我们可以利用坐标确定落子点,也可以加入我们自定义的棋子组件。
JPanel容器其实就像有底色的画布,有了落子点和棋子,还需要我们自己画横线和竖线。
ChessBord继承了JPanel,覆写方法paintCompont,实例化JPanel时,会自动调用该方法。
规则类ChessRule
ChessRule类的作用就是判断走棋是否合法。
实现思路就是根据走棋的起点和终点计算走棋路线中是否有其他的棋子,再依据是何种棋子判断走棋是否合法。
类ChessFrame
虽然上面4个类实现了象棋程序的所有功能,但还需要一个底层窗口容器加载ChessBoard这个JPanel。
并添加相应的菜单。
3.设计结果与分析
程序运行之后,可以实现两个人分别控制红方和黑方的棋子进行对弈,缺点就是程序过于简单,只能实现上述功能,不能悔棋,没有计时功能,也不能实现人机对弈功能。
程序运行结果如下所示:
图2.Chess类的运行结果“车”
绘制“中国象棋棋盘”,通过定义划横线,画左侧的竖线,画最右侧的竖线,画中间的竖线,画斜线等操作,输出程序的棋盘的运行结果。
图3.中国象棋棋盘
通过定义X坐标,Y坐标,和棋子,并将棋子加入到棋盘上的指定位置,输出中国象棋开局的程序运行结果。
图4.中国象棋程序运行效果图——开局
图5.中国象棋程序运行效果图——残局
4.设计体会
通过对java的课程设计,针对java的书本知识得到了进一步的巩固,具体化就是加深了我对图形用户界面理解,对程序的深层理解,清楚程序中每一步的功能,在程序的运行中是十分重要的,一个好的结构在运行中能够充分的发挥程序的功能。
把书本上学习到的知识应用到实际中去,很好的锻炼了我编写java语言的能力。
结构设计的合理性决定了这个程序的价值。
在今后的学习中我要注意这方面,使得我的编程能力能有进一步的提高。
?
在整个设计过程中,通过各种渠道获取资料。
利用周末去大的书店查资料,把重要的东西记录下来,也去图书馆借了一些相关的参考资料,同时还充分利用网上资源查一些资料。
最后再综合这些资料,在理工实验楼进行具体的操作。
从做课题设计的过程中,我的体会挺多的,感觉到只要有信心与耐心,没有做不到的事情。
因为在这个过程中写代码与调试的过程中确实需要耐心与信心,否则就不可能写完整。
总之,本次课程设计使自己收益非浅,为自己以后进入社会工作提供了一次不可多得的锻炼和实践的机会。
5.参考文献
[1].孙全党?
王吴迪?
赵枫朝,Java程序设计应用教程,电子工业出版社,
[2].雷之宇,Java项目开发实践—网络篇,中国铁道出版社,
[3]陈轶.姚晓昆编着.Java程序设计实验指导.北京:
清华大学出版社,2006
[4]杨昭编着.二级Java语言程序设计教程.北京:
中国水利水电出版社,2006
[5]赵文靖编着.Java程序设计基础与上机指导.北京:
清华大学出版社,2006
附录
import.*;
import.*;
import
publicclassChessextendsJLabel
{
privateStringname;etPlayer().equals().getPlayer())){
returnfalse;
}
}
returntrue;
}
returnfalse;
}
privatebooleancheckRule(Stringname){
if("车")){
if()==()||()==()){
if(hasBlock(name)==0){
returntrue;
}
}
returnfalse;
}
if("马")){
if()())==2*interval&&()())==interval)
{
if(hasBlock(name)==0){
returntrue;
}
}
if()())==interval&&()())==2*interval)
{
if(hasBlock(name)==0){
returntrue;
}
}
}
if("象")){
if().getPlayer().equals("PlayerA")){
if()>4*interval+initY){
returnfalse;
}
}
if().getPlayer().equals("PlayerB")){
if()<5*interval+initY){
returnfalse;
}
}
if()())==2*interval&&()())==2*interval){
if(hasBlock(name)==0){
returntrue;
}
}
}
if("兵")){
if()<()){
returnfalse;
}
if()==()&&()())==interval){
returntrue;
}
if()>4*interval+initY){if()==()&&()())==interval){
returntrue;
}
}
}
if("卒")){
if()>()){
returnfalse;
}if()==()&&()())==interval){
returntrue;
}
if()<5*interval+initY){
if()==()&&()())==interval){
returntrue;}}}
if("士")){
if().getPlayer().equals("PlayerA")){
if()<3*interval+initX||()>2*interval+initY){
returnfalse;
}
if()>5*interval+initX||()>2*interval+initY){
returnfalse;
}
}
if().getPlayer().equals("PlayerB")){
if()<3*interval+initX||()<7*interval+initY){
returnfalse;
}
if()>5*interval+initX||()<7*interval+initY){
returnfalse;
}
}
if()())==interval&&()())==interval){
returntrue;
}
}
if("将")){
if().getPlayer().equals("PlayerA")){
if()<3*interval+initX||()>2*interval+initY){
returnfalse;
}
if()>5*interval+initX||()>2*interval+initY){
returnfalse;
}
}
if().getPlayer().equals("PlayerB")){
if()<3*interval+initX||()<7*interval+initY){
returnfalse;
}
if()>5*interval+initX||()<7*interval+initY){
returnfalse;
}
}
if()==()&&()())==interval){
returntrue;
}
if()==()&&()())==interval){
returntrue;
}
}
if("炮")){
if()==()||()==()){
if&&hasBlock(name)==1){
returntrue;
}
if(!
&&hasBlock(name)==0){
returntrue;
}
}
returnfalse;
}
returnfalse;
}
privateinthasBlock(Stringname){
intblocks=0;
intpointsX=()())/interval;
intpointsY=()())/interval;
intstartX=()-initX)/interval;
intstartY=()-initY)/interval;
asChess){
blocks++;
}
}
}else{
for(inti=1;iif(choicePoint[startY-i][startX].hasChess){
blocks++;
}
}
}
}
if(pointsY==0){
if(endX>startX){
for(inti=1;iif(choicePoint[startY][startX+i].hasChess){
blocks++;
}
}
}else{
for(inti=1;iif(choicePoint[startY][startX-i].hasChess){
blocks++;
}
}
}
}
}
if("象")){
if(endXstartY){
if(choicePoint[startY+1][startX-1].getHasChess()){
blocks=1;
}
}
if(endXif(choicePoint[startY-1][startX-1].getHasChess()){
blocks=1;
}
}
if(endX>startX&&endY>startY){
if(choicePoint[startY+1][startX+1].getHasChess()){
blocks=1;
}
}
if(endX>startX&&endYif(choicePoint[startY-1][startX+1].getHasChess()){
blocks=1;
}
}
}
if("马")){
if(pointsX==1){
if(endY>startY){
if(choicePoint[startY+1][startX].getHasChess()){
blocks=1;}
}
else{
if(choicePoint[startY-1][startX].getHasChess()){
blocks=1;
}
}
}
if(pointsX==2){
if(endXif(choicePoint[startY][startX-1].getHasChess()){
blocks=1;
}
}else{
if(choicePoint[startY][startX+1].getHasChess()){
blocks=1;
}
}
}
}
""+blocks);
returnblocks;
}
publicbooleancheck(){
if(!
isPoint()){
returnfalse;
}
returncheckRule().getName());
;
publicclassChessFrameextendsJFrameimplementsActionListener{
/**
*@paramargs
*/
privateChessBoardchessboard;dd(chessboard);quals("Exit")){quals("New")){//如果选择了“New”选项
(chessboard);//窗口删除原象棋界面
chessboard=newChessBoard();//实例化新的象棋界面
(chessboard);//加入窗口
();//刷新窗口
}
}
}