毕业设计(论文)-基于Java的中国象棋对弈系统.doc_第1页
毕业设计(论文)-基于Java的中国象棋对弈系统.doc_第2页
毕业设计(论文)-基于Java的中国象棋对弈系统.doc_第3页
毕业设计(论文)-基于Java的中国象棋对弈系统.doc_第4页
毕业设计(论文)-基于Java的中国象棋对弈系统.doc_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

全套设计加扣 3012250582361 绪论1.1开发背景随着科学的发展,科技的进步,大家的娱乐项目都针对于电脑的无思想的游戏作为主要游戏对象,这些游戏往往以画面华丽或者追求盈利为主,玩家只能从游戏中得到暂时的新鲜感而缺少了对一些智力游戏的思考。青少年进行网络游戏容易沉迷其中不能自拔,本次设计的小游戏中国象棋正是对大家闲暇之时对脑力活动的运动,在得到快乐的同时开发玩家智力。中国象棋起源于中国,属于一种二人对抗游戏,在我国有着悠久的历史,它操作简单,趣味性强且对培养孩子兴趣发展和锻炼孩子逻辑思维能力,有着很重要的意义,既可以陶冶我们的情操,也开发了我们的智力,提高了人们的综合素质,又让中华文化得到传播。作为一种从古流传至今的游戏,中国象棋对我国有着特别的含义,在古代象棋被当做士大夫们的修身之艺。自古就有以棋会友,中国象棋不但对我们有养生的积极作用,还有助于我们认识新朋友和增进朋友情谊。象棋集文化、艺术、科学竞技于一身,丰富玩家文化生活,作为一种体育运动,它也有自身的发展意义。1.2开发语言及平台本毕业设计根据中国象棋的基本游戏规则,用Java进行开发,制作出图形化的游戏界面进行游戏对弈。开发环境是Eclipse,其本身附带标准插件集,包括了Java的开发工具(JDK)。Java名字由来很有趣:Java是印尼的一个小岛,盛产咖啡,而程序员往往喜欢喝咖啡,因此取名为Java语言。本设计之所以使用Java语言进行开发而不用C+等其他语言是因为Java有其独特的优点所在。首先Java语言具有安全、跨平台、面向对象、适用于网络等很多优点,而且今年来随着科技发展,计算机操作系统越发多元化,不同工作使用不同操作系统,而Java的跨平台特点使它更加流行。作为计算机专业的我,使用Java进行编写程序能增加自己对Java的认识,增加自己这方面的专业知识水平,为踏入社会工作做好铺垫。2 游戏简介2.1 中国象棋简介中国象棋的棋盘是方形的,棋盘上有十条横线、九条竖线,中间空出一行空白,那是“楚河汉界”,棋子可以通过。对局的人各自控制界限两边的黑红棋子,双方在两边离岸边有交叉线的地方共有90个交叉点,黑红棋子就摆在这些交叉点上。中国象棋共有32枚棋子,分为黑红两组,下棋的双方各用一组,双方棋子分别为一帅(将),两仕,两相,两马,两车,两炮,五兵。两人对局时,各自按照象棋的规定将双方棋子摆在指定位置,默认为红色方先走棋,然后轮流移动棋子,各种棋子走法规定不同,最终以把对方将死为胜,无法将死则判定为和棋。2.2 中国象棋走子规则帅(将)一次走一步,上下左右四个方位都可以走,但是不能走斜线而且不能走出“九宫”。规定双方的帅和将不可以在同一直线上直接对面,如果已经有一方占据,则另一方必须回避。仕每次只允许在“九宫”内斜线走一步,不可以走直线,斜着方位上下左右皆可。相不能越过“河界”,每次斜走两步,俗称“相走田”可进可退,需注意当斜线中间存在其他棋子时,则相不允许走过去。马每次走一直一斜,可进可退,即俗称“马走日字”。如果在要去的方向有别的棋子挡住,则不许走过去。车每次可以直行直退,横走,不限步数。炮在不吃子的时候,走法同车一样。当吃子时,炮和被吃子中间需要存在一个棋子,俗称“炮翻山”。兵在没有过“河界”前,每次只许向前直走一步;过“河界”后,每次可向前直走或向左右横行一步,但不能后退。2.3 中国象棋吃子规则在走棋时,如果己方棋子能够走到的位置存在对方棋子,就可以吃掉对方棋子而占领那个位置。当炮吃子时必须在中间隔着一个棋子,中间的棋子己方对方皆可。除帅(将)外其他棋子都可以被对方吃而不判输赢,吃子的一方必须立即把被吃掉的棋子从棋盘上拿走。3 需求分析3.1 简要根据中国象棋游戏规则,制定出与其一样的玩法,实现单机版两人对弈。做出四个模块分别为:图形用户界面模块:做出对用户来游戏的主界面,单击图中棋子进行游戏操作。完成按钮的操作模块:实现新游戏即重新排列棋子;悔棋即通过获得SetVisible属性值实现回到上一步操作;退出即先判断,如“是”就退出游戏。棋子的操作模块:玩家单击棋子进行闪烁,然后第二次单击也就是移动或者吃子的时候,先对玩家单击的位置来判断具体是什么棋子,然后再调用具体棋子的具体方法。如果是吃子情况帅(将)一方被吃掉后,该方就输了。棋子的移动规则模块:实现了每个棋子的移动、吃子方法。3.2 可行性研究分析了中国象棋的走棋规则,在规定范围内:从移动范围、移动方向和穿越障碍吃子几个方面重新描述行棋规则,基于Java技术和相应算法通过计算机模拟实现了中国象棋特殊的行棋规则算法,设计出了一种可行的方法,使每个棋子的行棋方法都严格遵循中国象棋本身的行棋规则,游戏的实战对弈得以实现通过实验运行,利用鼠标监听来实现对象棋走法的操作,证明这种限定棋子行棋路线的方法是可行的。利用Java编程将日常生活中的中国象棋游戏改为可在电脑上进行操作的计算机游戏。3.3 主要功能和特点主要功能有新游戏,悔棋,退出以及信息提示。游戏方便简洁,可以记录游戏进行悔棋等操作。3.4 功能分析系统开始运行,直接显示游戏主界面以及各种功能按键。单击新游戏就可以开始游戏,方便简洁,一看就懂。新游戏:任何时候点击新游戏都可以重新开始一盘新的棋局悔棋:当走错棋的时候,可以悔棋。退出:点击后提示是否退出,选择“是”后就退出。信息提示:提示当前信息状态。3.5 面向群体广大的象棋爱好者,尤其适合初学者研究下棋技巧。3.6 界面制作出一个类似于真实游戏棋盘的游戏界面,按钮合理的布局在游戏棋盘上方,方便简洁。4总体设计中国象棋对弈系统的程序由文件Chess.Java实现。在Chess.Java中主要包括两个类:其中一个是被定义为pubilc类型的类,类名为Chess,该类主要负责中国象棋对弈程序的执行;另一个类名为ChessMainFrame,是程序的主框架类。程序中Chess类通过生成ChessMainFrame类的对象来执行程序。在ChessMainFrame类中主要包含四个模块:1) 生成图形用户界面模块2) 完成按钮的操作模块3) 棋子的操作模块4) 棋子的移动规则模块其中棋子的移动规则定义为内部类,名为ChessRule。CheesRule类中的方法用于定义各个棋子的移动规则和吃子规则。如图4-1所示:图4-1 ChessMainFrame的四个模块5 详细设计5.1 图形用户界面模块图形用户界面是ChessMainFrame类中的基本模块,该模块的主要作用是:定义该类中所使用的变量和实例对象,然后通过构造函数初始化图形用户界面,负责添加组件和棋子,注册组件事件。图形用户界面主要是针对用户的来设计的,界面工具栏有3个按钮:新游戏、悔棋、退出,和一个用来提示用户信息的文档。然后下面就是用户用来操作的游戏界面,有棋盘和棋子。用户可以单击棋子来进行游戏操作。完成后的工具栏如图2所示:图5-1 界面的工具栏主框架类里设计有玩家、棋盘、窗口、工具栏、重新开始、悔棋、退出、当前信息、保存当前操作、规则类、控制棋子闪烁和红黑棋子哪个先走棋等。然后里面创建一构造函数在其里面创建工具栏然后再把组件添加到工具栏,添加棋子标签、棋盘标签,注册按扭监听、棋子移动监听、窗体关闭监听。之后创建一个添加棋子的方法,把每个棋子按照图标在对应的位置依次添加上去。完成后的玩家操作游戏界面如图5-2所示:图5-2 游戏棋盘界面下面是创建工具栏、游戏界面等的主要代码:ChessMainFrame(String Title)con = this.getContentPane();con.setLayout(null);rule = new ChessRule();Var = new Vector();/创建工具栏jmain = new JToolBar();text = new JLabel(象棋对弈系统);text.setToolTipText(信息提示);anew = new JButton( 新 游 戏 );anew.setToolTipText(重新开始新的一局);exit = new JButton( 退 出 );exit.setToolTipText(退出象棋程序程序);repent = new JButton( 悔 棋 );repent.setToolTipText(返回到上次走棋的位置);/把组件添加到工具栏jmain.setLayout(new GridLayout(0,4);jmain.add(anew);jmain.add(repent);jmain.add(exit);jmain.add(text);jmain.setBounds(0,0,558,30);con.add(jmain);/添加棋子标签drawChessMan();/注册按扭监听anew.addActionListener(this);repent.addActionListener(this);exit.addActionListener(this);/注册棋子移动监听for (int i=0;i32;i+)con.add(playi);playi.addMouseListener(this);/添加棋盘标签con.add(image = new JLabel(new ImageIcon(imageMain.GIF);image.setBounds(0,30,558,620);image.addMouseListener(this);/注册窗体关闭监听this.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent we)System.exit(0););this.setResizable(false);this.setTitle(Title);this.setSize(558,670);this.show();5.2 按钮的操作模块本程序中有3个按钮,依次分别为:新游戏,悔棋,退出。当玩家单击“新游戏”按钮时,程序会应答重新布置棋子,并将保存当前操作的vector清空;当玩家单击“悔棋”按钮时,程序立刻调用vector中的数据进行悔棋操作;玩家单击“退出”按钮时,程序会询问是否退出,选“是”则退出。5.2.1 新游戏重新开始按钮事件响应为:重新排列每个棋子的位置,默认红色走棋,清除vector里面的内容。如下则是新游戏的主要代码:public void actionPerformed(ActionEvent ae) /重新开始按钮if (ae.getSource().equals(anew)int i,k;/重新排列每个棋子的位置/黑色棋子/车for (i=0,k=24;i2;i+,k+=456)playi.setBounds(k,56,55,55);/马for (i=4,k=81;i6;i+,k+=342)playi.setBounds(k,56,55,55);/相for (i=8,k=138;i10;i+,k+=228)playi.setBounds(k,56,55,55);/士for (i=12,k=195;i14;i+,k+=114)playi.setBounds(k,56,55,55);/卒for (i=16,k=24;i21;i+,k+=114)playi.setBounds(k,227,55,55);/炮for (i=26,k=81;i28;i+,k+=342)playi.setBounds(k,170,55,55);/将play30.setBounds(252,56,55,55);/红色棋子/车for (i=2,k=24;i4;i+,k+=456)playi.setBounds(k,569,55,55);/马for (i=6,k=81;i8;i+,k+=342)playi.setBounds(k,569,55,55);/相for (i=10,k=138;i12;i+,k+=228)playi.setBounds(k,569,55,55);/士for (i=14,k=195;i16;i+,k+=114)playi.setBounds(k,569,55,55);/兵for (i=21,k=24;i26;i+,k+=114)playi.setBounds(k,398,55,55);/炮for (i=28,k=81;i30;i+,k+=342)playi.setBounds(k,455,55,55);/帅play31.setBounds(252,569,55,55);chessPlayClick = 2;text.setText( 红棋走棋);for (i=0;i32;i+)playi.setVisible(true);/清除Vector中的内容Var.clear();5.2.2 悔棋悔棋按钮事件响应为:获得setVisible属性值、获得x坐标、获得y坐标、获得索引,然后赋给棋子,之后就删除用过的坐标并停止棋子闪烁。下面就是悔棋按钮操作的主要代码:else if (ae.getSource().equals(repent)try/获得setVisible属性值String S = (String)Var.get(Var.size()-4);/获得X坐标int x = Integer.parseInt(String)Var.get(Var.size()-3);/获得Y坐标int y = Integer.parseInt(String)Var.get(Var.size()-2);/获得索引int M = Integer.parseInt(String)Var.get(Var.size()-1);/赋给棋子playM.setVisible(true);playM.setBounds(x,y,55,55);if (playM.getName().charAt(1) = 1)text.setText( 黑棋走棋);chessPlayClick = 1; elsetext.setText( 红棋走棋);chessPlayClick = 2;/删除用过的坐标Var.remove(Var.size()-4);Var.remove(Var.size()-3);Var.remove(Var.size()-2);Var.remove(Var.size()-1);/停止旗子闪烁chessManClick=false;catch(Exception e)5.2.3 退出退出按钮事件响应为:利用一个判断来显示,程序会询问是否退出。如下就是此判断的代码:else if (ae.getSource().equals(exit)int j=JOptionPane.showConfirmDialog(this,真的要退出吗?,退出,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if (j = JOptionPane.YES_OPTION)System.exit(0);5.3 棋子的移动规则类模块棋子移动规则类ChessRule分别定义了中国象棋32个棋子的移动规则。32个棋子可分为:帅,仕,相,马,车炮,兵6类棋子。每一类棋子各有两个方法,定义这类棋子的移动规则和吃子规则。卒子的移动规则:黑卒向下,向下移动一步,属于该棋子大小范围的坐标都计算在之内,并记录当前添加到集合,向右(向左)移动一步,必须当黑卒过河界之后。红兵向上,方法基本同黑卒一样,就方向相反。卒子的吃子规则:向右走:黑卒要过河才能左吃子,红兵要过河才能右吃子,吃子后都是把对方位置给自己。向左走:黑卒要过河才能右吃子,红兵要过河才能左吃子,吃子后都是把对方位置给自己。向上走:黑卒不能向上吃子炮、车的移动规则:找出所有模糊的x或y坐标,在此坐标上找出不包括自己的所有棋子,也就是横走的话就找横的那一行、竖走的话就找竖的那一列,大于起点并且小于终点之间有棋子就不许移动,没有棋子的话就可以到达终点的位置。炮、车的吃子规则:前面与移动基本一样,不过大于起点小于终点之间加个计算期间棋子的个数,起点和终点之间有一个棋子才可以吃子是炮的规则;起点和终点之间没有棋子可以吃子的是车的规则。马的移动规则:首先保存坐标和障碍,上移、左边:取得其模糊的X、Y坐标,再看其正前方是否有别的棋子,如无则可到达其坐标。其他7个方向类似如此。马的吃子规则:马的吃子与移动差不多就是终点坐标上的棋子被马所取代其位置,但不能吃自己颜色的棋子。相移动规则:上左:取得合法的X、Y坐标,左上方是否有棋子,如无则可以走到响应的位置上,相不能过河界;其他方向也类似。相吃子规则:同理即取代终点坐标的棋子即可,但不能吃自己颜色棋子。将、仕移动、吃子规则:不能超过自己的区域移动,吃子时判断被吃子是否和当前仕相近,近的“吃掉”。其他方向类似。下面就相对于卒的代码:public void armsRule(int Man,JLabel play,MouseEvent me)/黑卒向下if (Man 27 & (me.getY()-play.getY() 86 & (me.getX()-play.getX() 0)/当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible();Var.add(String.valueOf(play.getX();Var.add(String.valueOf(play.getY();Var.add(String.valueOf(Man);play.setBounds(play.getX(),play.getY()+57,55,55);/向右移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() 284 & (me.getX() - play.getX() = 57 & (me.getX() - play.getX() 284 & (play.getX() - me.getX() = 2 & (play.getX() - me.getX() = 0 & (me.getX()-play.getX() 27 & play.getY()-me.getY() 86)play.setBounds(play.getX(),play.getY()-57,55,55);/向右移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() = 57 & (me.getX() - play.getX() = 112)play.setBounds(play.getX()+57,play.getY(),55,55);/向左移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() = 3 & (play.getX() - me.getX() =58)play.setBounds(play.getX()-57,play.getY(),55,55);/卒移动结束/*卒吃棋规则*/public void armsRule(JLabel play1,JLabel play2)/向右走if (play2.getX() - play1.getX() = 57 & (play1.getY() - play2.getY() -22 & play2.isVisible() & play1.getName().charAt(1)!=play2.getName().charAt(1)/黑棋要过河才能右吃棋if (play1.getName().charAt(1) = 1 & play1.getY() 284 & play1.getName().charAt(1) != play2.getName().charAt(1)play2.setVisible(false);/把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);/红棋要过河才左能吃棋else if (play1.getName().charAt(1) = 2 & play1.getY() 341 & play1.getName().charAt(1) != play2.getName().charAt(1)play2.setVisible(false);/把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);/向左走else if (play1.getX() - play2.getX() = 57 & (play1.getY() - play2.getY() -22 & play2.isVisible() & play1.getName().charAt(1)!=play2.getName().charAt(1)/黑棋要过河才能左吃棋if (play1.getName().charAt(1) = 1 & play1.getY() 284 & play1.getName().charAt(1) != play2.getName().charAt(1)play2.setVisible(false);/把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);/红棋要过河才能右吃棋else if (play1.getName().charAt(1) = 2 & play1.getY() = -22 & play1.getX() - play2.getX() = -112 & play1.getY() - play2.getY() = 112)/黑棋不能向上吃棋if (play1.getName().charAt(1) = 1 & play1.getY() play2.getY() & play1.getName().charAt(1) != play2.getName().charAt(1)play2.setVisible(false);/把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);/当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play1.isVisible();Var.add(String.valueOf(play1.getX();Var.add(String.valueOf(play1.getY();Var.add(String.valueOf(Man);/当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play2.isVisible();Var.add(String.valueOf(play2.getX();Var.add(String.valueOf(play2.getY();Var.add(String.valueOf(i);/卒吃结束5.4 棋子的操作模块棋子的操作模块定义了线程,当玩家单击棋子时候,可以以是棋子是否闪烁以当做棋子已经被选取的效果。当玩家单击棋子或移动的时候,根据棋子的编号来判断使用相应的规则进行移动或吃子。玩家一次走子流程如图5-3所示:图5-3 一次游戏走子流程使用线程控制棋子闪烁,单击棋子第一下开始闪烁并且闪烁当前提示信息。在单击棋子方法里面时先启动线程,然后单击棋盘也就是要移动棋子时先判断是红色还是黑色走棋,再从当前坐标中找到是具体哪个棋子要移动再去调用具体棋子走棋的具体移动方法,如果棋子移动错误或者没有移动应该还是该方走棋。第二次单击棋子也就是吃棋子的时候,停止闪烁,找到被吃棋子,移动的棋子就调用自身的吃子规则基本同移动差不多。最后判断是否胜利,只要帅或将一方被对方任意棋子吃掉时候,双方都不可以在走棋,并且帅(将)被吃掉的一方则输了。下面则是整个一次游戏操作的主要代码:public void mouseClicked(MouseEvent me)int Ex=0,Ey=0;/启动线程if (tmain = null)tmain = new Thread(this);tmain.start();/单击棋盘(移动棋子)if (me.getSource().equals(image)/该红棋走棋的时候if (chessPlayClick = 2 & playMan.getName().charAt(1) = 2)Ex = playMan.getX();Ey = playMan.getY();/移动卒、兵if (Man 15 & Man 25 & Man =0 & Man 3 & Man 7 & Man 11 & Man 15 & Man 25 & Man =0 & Man 3 & Man 7 & Man 11 & Man 16)rule.chapRule(Man,playMan,play,me);/移动将、帅else if (Man = 30 | Man = 31)rule.willRule(Man,playMan,play,me);/是否走棋错误(是否在原地没有动)if (Ex = playMan.getX() & Ey = playMan.getY()text.setText( 黑棋走棋);chessPlayClick=1;else text.setText( 红棋走棋);chessPlayClick=2;/当前没有操作(停止闪烁)chessManClick=false;/单击棋子else/第一次单击棋子(闪烁棋子)if (!chessManClick)for (int i=0;

温馨提示

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

评论

0/150

提交评论